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 - 通过 RTMP 连续文件流式传输

使用 FFMpeg 将 FLV 流式传输到 RTMP,使用 H264 编解码器和 C++ API 到 flv.js

如何使用 ffmpeg 将实时 m3u8 文件流式传输到 youtube rtmp

无法使用 nginx-rtmp-module 重新流式传输

将音频和视频从 Android 手机流式传输到 RTMP 服务器的最佳方式

如何将 ffmpeg 流中的音频传输到 nginx rtmp 服务器?