0

我想用 avformat 库和 HTML5 视频和 MSE做一个基本的分段 mp4广播程序。

这是一个直播流,我使用 avformat 将 h264 数据复制到 mp4 片段。

这是我附加到流的客户端的基本图:

在此处输入图像描述

所以,用一句话:

  1. C1J:第一个客户加入:
    • avformat 进程开始
    • ftyp、moov、moof、mdat 框将提供给 Client1
    • ftyp 和 moov 原子都被保存以供以后重用
  2. 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 开始,但它的有效性还有其他要求。

4

2 回答 2

0

所有moof框都包含有关播放顺序的信息。MSE 预计默认情况下,视频将在时间 0 开始。

此问题的一个简单解决方案是HTMLMediaElement.currentTime在附加第一个缓冲区后将属性设置为高值。或者,为了支持 MSE 规范,moof您提供给 MSE 缓冲区的第一个框应该存在first_sample_flags_preset标志。

于 2021-09-10T19:00:06.613 回答
0

一旦你缓冲了一些视频,你必须将JS 中currentTime的元素设置为最新时间(假设你有一个缓冲范围)。videobuffered.end(0)

问题是您正在播放的视频被浏览器解释为从零开始,但您正在MSE提供稍后的片段。

于 2021-06-21T19:04:11.860 回答