温馨提示:本文翻译自stackoverflow.com,查看原文请点击:streaming - Using FFMPEG to stream continuously videos files to a RTMP server
ffmpeg named-pipes pipe streaming rtmp

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

发布于 2020-04-20 10:18:30

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"

我已经在互联网上寻找了很多解决方法,发现有很多人在谈论使用命名管道作为输入ffmpeg,我已经尝试过,但是效果不佳,因为ffmpeg它不仅会在新的视频来了,但也关闭了。

有什么办法吗?(将动态视频播放列表与ffmpegRTMP服务器一起传输,而不会断开连接

查看更多

提问者
kketch
被浏览
65
aergistal 2016-12-10 18:07

更新(因为我无法删除接受的答案):正确的解决方案是实现自定义多路分配器,类似于concat。当前没有其他干净的方法。您必须动手并编写代码!

以下是一个丑陋的骇客。这是一个非常糟糕的方法,请不要!

该解决方案使用concat多路分配器,并假定所有源媒体文件都使用相同的编解码器。该示例基于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. 被生气的系统管理员追逐和取名