使用FFMPEG将视频文件连续传输到RTMP服务器

kke*_*tch 22 streaming ffmpeg pipe rtmp named-pipes

ffmpeg 处理RTMP流作为输入或输出,它运行良好.

我想将一些视频(由python脚本管理的动态播放列表)流式传输到RTMP服务器,我现在正在做一些非常简单的事情:使用FFMPEG将我的视频逐个流式传输到RTMP服务器,但这会导致连接中断每次视频结束时,当下一个视频开始时,流就准备好了.

我想在没有任何连接中断的情况下流式传输这些视频,然后可以正确查看流.

我使用此命令将我的视频逐个流式传输到服务器

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \
"rtmp://mystreamingserver/app/streamName"
Run Code Online (Sandbox Code Playgroud)

我在互联网上寻找了一些解决方法很多天,我发现有些人在谈论使用命名管道作为输入ffmpeg,我已经尝试过它并没有很好地工作,因为ffmpeg它不仅关闭了RTMP流视频来了,但也关闭了自己.

有没有办法做到这一点?(将视频的动态播放列表流式传输ffmpeg到RTMP服务器,不会出现连接中断

bnk*_*nku 8

需要创建两个播放列表文件,并在每个文件的末尾指定到另一个文件的链接。

列表_1.txt

ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'
Run Code Online (Sandbox Code Playgroud)

列表_2.txt

ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'
Run Code Online (Sandbox Code Playgroud)

现在您所需要做的就是动态更改下一个播放列表文件的内容。


aer*_*tal 7

更新(因为我无法删除已接受的答案):正确的解决方案是实现自定义分离器,类似于concat.目前还没有其他干净的方式.你必须得到你的手和代码!

下面是一个丑陋的黑客.这是一个非常糟糕的方法,只是不要!

该解决方案使用concat demuxer并假设所有源媒体文件都使用相同的编解码器.该示例基于MPEG-TS,但RTMP也可以这样做.

  1. 使用以下格式制作播放列表文件,其中包含动态播放列表的大量入口点列表:

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    这些文件只是占位符.

  2. 制作一个脚本,跟踪您当前的播放列表索引并动态创建符号链接 current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. 开始玩 ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  4. 由愤怒的系统管理员获取追逐和呼叫的名字

  • @chovy,这对我来说是一个非常糟糕的答案,我发布的更像是一个笑话。真的,不要这样做,这是一个丑陋的黑客行为。我会删除它,这样就没有其他人想尝试它了。 (2认同)

jb_*_*ado 7

您可以创建一个循环并将输出传输到流实例。

在 shell 中它看起来像:

#!/bin/bash

for i in *.mp4; do
    ffmpeg -hide_banner -nostats -v error -i "$i" -filter_complex \
    "[0:v:0]fps=25,scale=1024:576,setdar=dar=1.778[vout0]" \
    -map "[vout0]" -map "0:a" -pix_fmt yuv420p -r 25 \
    -c:v mpeg2video -g 1 -b:v 36000k -minrate 36000k -maxrate 36000k \
    -bufsize 18000k -c:a s302m -strict -2 -sample_fmt s16 -ar 48000 \
    -ac 2 -f mpegts -
done | ffplay -
Run Code Online (Sandbox Code Playgroud)

ffplay 仅用于说明,更好的是使用 ffmpeg 实例并重新编码管道输出。

请注意-f mpegtsmpegts是唯一可以保证 A/V 不会不同步的格式。理论上,您也可以在循环中使用 x264 或 x265 编解码器,但我发现 mpeg2video 更不容易出错,而且它使用的 CPU 资源也更少。

当然,您可以使用任何类型的循环,也可以循环播放列表。

这是一个基于 Rust 的解决方案,它使用了这种技术:ffplayout

这使用JSON播放列表格式。播放列表是动态的,这样您就可以始终编辑当前播放列表并更改曲目或添加新曲目。