FFMPEG - 流式传输到 RTMP 输出并同时保存到 MP4 - 重新连接
Posted
技术标签:
【中文标题】FFMPEG - 流式传输到 RTMP 输出并同时保存到 MP4 - 重新连接【英文标题】:FFMPEG - Stream to RTMP output and save to MP4 at same time - with reconnect 【发布时间】:2020-01-08 08:08:37 【问题描述】:我正在尝试设置一个管道,我可以在其中获取输入并保存到 MP4,同时流式传输到 RTMP 服务器。
到目前为止,我已经能够使用 tee 过滤器来实现这一点,并且还使用 onfail=ignore 来确保管道在 RTMP/Recording 失败的情况下保持正常。
太棒了!
但是,我不希望 RTMP 放弃或断开连接,我希望它继续尝试重新连接和恢复流。
我不认为 FFMPEG 有这样的东西,所以我需要将它写在 bash 脚本中,或者在发生丢失时不断重启进程的东西。
我只是不知道如何实现这一点!
以前有没有人有任何想法或解决过这个问题?
谢谢,
马特
【问题讨论】:
【参考方案1】:使用fifo格式,可以重连。
我的工作示例:
-f fifo -fifo_format flv \
-drop_pkts_on_overflow 1 -attempt_recovery 1 -recover_any_error 1 \
rtmp://bla.bla/bla
【讨论】:
不幸的是,虽然这确实有效,但它似乎破坏了媒体服务器上的 HLS 播放。使用 FIFO 缓冲区时,它传输的元数据会损坏。【参考方案2】:+1 表示接受的答案,但是:
在 FFmpeg 中,编码器会根据选定的输出格式自动检测其参数。这里的输出格式是未知的(对于像“fifo”和“tee”这样的格式是正确的),所以编码器不会像使用“flv”输出格式一样设置所有参数。
例如:Wowza Streaming Engine 会在尝试发布该 RTMP 流时报告错误:
H264Utils.decodeAVCC : java.lang.ArrayIndexOutOfBoundsException: 9
要克服这个问题,您应该添加-flags +global_header
选项。
这应该有助于解决@Matt 的问题。
【讨论】:
以上是关于FFMPEG - 流式传输到 RTMP 输出并同时保存到 MP4 - 重新连接的主要内容,如果未能解决你的问题,请参考以下文章
使用 FFMpeg 将 FLV 流式传输到 RTMP,使用 H264 编解码器和 C++ API 到 flv.js
如何使用 ffmpeg 将实时 m3u8 文件流式传输到 youtube rtmp