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服务器,而不会中断连接
发布于 2015-03-14 22:57:25
更新(因为我不能删除接受的答案):正确的解决方案是实现一个自定义的解复用器,类似于concat。目前还没有其他干净的方法。你必须亲自动手编写代码!
下面的是一个丑陋的黑客攻击。这是一种非常糟糕的方式,千万不要!
该解决方案使用concat demuxer,并假定所有源媒体文件使用相同的编解码器。该示例是基于MPEG-TS的,但也可以对RTMP执行相同的操作。
file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'
这些文件只是placeholders.
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>
追逐和辱骂
发布于 2018-03-01 14:41:04
需要创建两个播放列表文件,并在每个文件的末尾指定到另一个文件的链接。
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'现在,您需要做的就是动态更改下一个播放列表文件的内容。
发布于 2018-02-02 18:42:59
您可以通过管道将循环传输到缓冲区,然后从该缓冲区通过管道传输到流实例。
在shell中,它将如下所示:
#!/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更稳定一些。mpeg压缩至少有2个线程效果更好。我的工作是基于python的解决方案,还没有完成,但是除了一些警告之外,我的测试流运行了好几天:
这使用xml播放列表格式。播放列表是动态的,这样你就可以编辑当前的播放列表,更改曲目或添加新的曲目。
https://stackoverflow.com/questions/11647868
复制相似问题