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
不只是关闭RTMP流时新的视频来也自行关闭。
有没有办法做到这一点? (流与视频动态播放列表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>
被愤怒的系统管理员获取追逐和叫名字
你可以管你的循环到缓冲区,并从这个缓冲你管你流实例。
在贝它会是什么样子:
#!/bin/bash
for i in *.mp4; do
ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts -
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream
当然,你可以使用任何类型的循环,也可以通过播放列表循环。
- 我弄清楚,MPEG是一个比较稳定的,那么对于X264输入流
- 我不知道为什么,但最少2个线程的MPEG压缩效果更好
- 输入压缩需要更快那么输出的帧速率,所以我们得到足够快的新的输入
- 由于非持续时间戳,我们必须skippet他们并产生输出一个新的
- 缓冲区大小需要足够大的循环,有足够的时间来获得新的剪辑。
我对基于Python的解决方案的工作,还没有完成,但除了一些警告我的测试流运行多天:
ffplayout
这将使用XML格式的播放列表。 并且播放列表是动态的,以这种方式,你可以随时编辑当前播放列表,并改变轨道或添加新的。
需要创建两个播放列表文件,并在每个文件的结尾指定一个链接到另一个文件。
list_1.txt
ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'
list_2.txt
ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'
现在,所有你需要的是动态地改变下一个播放列表文件的内容。