使用 libav 混合流式分段 mp4

muxing streamable segmented mp4 with libav

目前我有一个应用程序应该通过 websocket 将碎片化的 mp4 数据发送到客户端以便在那里播放。

我有一个工作实现,它将原始帧通过管道传输到生成的 ffmpeg 进程,然后从输出管道读取碎片化的 mp4 片段,然后再将它们发送到客户端,然后客户端正确显示视频。

我的问题是,当我尝试使用 libav 进行实现时,它似乎不起作用。我的 libav 配置使用 libx264 对帧进行编码,然后再将它们混合到 mp4,但是当我尝试使用 MSE 在浏览器中播放提供的片段时,它会吐出一个错误。检查 chrome://media-internals 后,我发现 chrome 在我提供 moov 框时抱怨,该框是 fmp4 流的两个初始化框之一。

chrome 显然在从 libav 发送时解析该框时有问题,但在从 ffmpeg 发送时则没有。

我的问题是: libav 的正确 muxer 配置是什么,以便它创建一个分段的 mp4 流,客户端可以在提供初始框后从中间接收媒体框?

我设法解决了我自己的问题。

我遇到的问题是我忘记在编码器中启用 AV_CODEC_FLAG_GLOBAL_HEADER 标志。这修复了我的 mp4,因为编码器将所有编码器标志放在 header 而不是媒体段