首页 > 解决方案 > 使用 avformat 的分段 mp4 广播

问题描述

我想用avformat函数播放一个直播流(h264 -> 分段 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 在​​开始时不是一次有效吗?)

谢谢

标签: ffmpegmp4libavformatfmp4

解决方案


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


推荐阅读