带有 avformat 的碎片化 mp4 广播

Fragmented mp4 broadcast with avformat

我想直播一个具有avformat功能的直播流(h264 -> fragmented mp4)。

现在基本上我有了这个伪的工作示例:

avformat_write_header
while (!end) {
  av_read_frame
  av_write_frame
}
avformat_write_tailer

我将此作为输出标志:movflags +frag_keyframe+empty_moov+default_base_moof

我正在将输出发送到 html5 视频,该视频播放流畅。 但是我想广播它,所以每当有新玩家出现时,我都想将完全相同的数据流式传输给它:

avformat_write_header
while (!end) {
  av_read_frame
  av_write_frame (to multiple clients)
}
avformat_write_tailer

然而,第一个客户端可以播放流,但其余客户端不能。

这是因为 fmp4 的结构:第一个客户端接收到正确的 ftypmoov 原子,而其余客户端则没有。

现在我可以破解我的代码来为后来的客户提供早期的 ftype 和 moov 原子,但我认为这不明智 - 如果我错了请纠正我。

我的问题:

  1. 我如何在流中请求 avformat 来(计算)并包含 ftyp 和 moov 原子?
  2. 在流中包含 ftyp 和 moov 会破坏第一个客户端吗? (在 fmp4 中 ftype 和 moov 不是一开始就有效吗?)

谢谢

ftyp 和moov 一起被称为initialization fragment 并且客户端应该先下载并处理它,无论接下来要播放什么片段。这不是 hack,这正是 fmp4 旨在工作的方式。