我想用 avformat 库和 HTML5 视频和 MSE做一个基本的分段 mp4广播程序。
这是一个直播流,我使用 avformat 将 h264 数据复制到 mp4 片段。
这是我附加到流的客户端的基本图:
所以,用一句话:
- C1J:第一个客户加入:
- avformat 进程开始
- ftyp、moov、moof、mdat 框将提供给 Client1
- ftyp 和 moov 原子都被保存以供以后重用
- C2J:第二个客户加入(稍后):
- avformat 进程正在进行中(因为它仍在为 Client1 提供 moof 和 mdat 框)
- 先前保存的 ftyp 和 moov 框将首先提供给 Client2
- 在提供 ftyp 和 moov 框后,Client2 将在下一个 moof 框加入流。
我已将两个客户端的 mp4 文件保存到磁盘。
两个文件中的原子顺序看起来不错:ftype、moov、moof、mdat、moof、mdat...
这两个文件都可以由媒体播放器(如 VLC)播放,也可以直接在浏览器中播放(Opera)。
Client1 也可以通过浏览器 (Opera) 中的 MSE 播放,但 Client2 的流不使用 MSE (Opera) 显示。
JS 控制台上没有错误,而且 media-internals 看起来也不错(至少与 Client1 相当)。
现在我意识到每个 moof 框都包含一个带有sequenceNumber
字段的 mfhd 框(标题)。
当然,在 Client1 的第一个 moof 框中,这个 sequenceNumber 是1
. 然而,在后来加入的 Client2 的第一个 moof 框中,这个 sequenceNumber 总是 >= 1
(在我的情况下是16
)。
我需要在 Client2 的 moof 框中修改什么才能从一开始就获得有效的 fmp4?
我认为 Opera 的 HTML5 视频不喜欢如果 sequenceNumber 不是从 1 开始,但它的有效性还有其他要求。