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
它不仅会在新的视频来了,但也关闭了。
有什么办法吗?(将动态视频播放列表与ffmpeg
RTMP服务器一起传输,而不会断开连接
更新(因为我无法删除接受的答案):正确的解决方案是实现自定义多路分配器,类似于concat。当前没有其他干净的方法。您必须动手并编写代码!
以下是一个丑陋的骇客。这是一个非常糟糕的方法,请不要!
该解决方案使用concat多路分配器,并假定所有源媒体文件都使用相同的编解码器。该示例基于MPEG-TS,但对于RTMP也可以做到这一点。
制作一个播放列表文件,其中包含具有以下格式的动态播放列表的大量入口点列表:
file 'item_1.ts'
file 'item_2.ts'
file 'item_3.ts'
[...]
file 'item_[ENOUGH_FOR_A_LIFETIME].ts'
这些文件只是占位符。
创建一个脚本来跟踪您当前的播放列表索引,并为以下内容即时创建符号链接 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
[...]
开始玩
ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>
被生气的系统管理员追逐和取名
谢谢,刚刚看到了您的答案。即使我现在对这类骇客不感兴趣,我也可以通过Hinekyle评论弄清楚
您能详细说明您的意思
Make a script that keeps track of you current playlist index and creates symbolic links on-the-fly for current_index + 1
吗?这是什么目的?尝试对.m3u8 24/7流执行相同的操作。但是该命令
-c copy output -f mpegts stream.m3u8
将引发错误。@chovy这对我来说是一个非常糟糕的答案,我更像是在开玩笑。真的,不要这样做,这是一个丑陋的骇客。我将其删除,以便其他任何人都无法尝试。