FMP4 moof盒子序列号订购

问题描述 投票:0回答:3

我想做一个基本的碎片mp4广播程序,带有avformat库和HTML5视频和MSE。

这是一个直播,我使用 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 控制台上没有错误,媒体内部看起来也不错(至少与 Client1 的相当)。

现在我意识到每个 moof 框都包含一个带有

sequenceNumber
字段的 mfhd 框(标题)。

当然,在 Client1 的第一个 moof 框中,这个序列号是

1
。 然而,在后来加入的Client2的第一个moof框中,这个sequenceNumber总是>=
1
(在我的例子中是
16
)。

我需要在 Client2 的 moof 框中修改什么才能从一开始就有一个有效的 fmp4?

我认为Opera的HTML5视频不喜欢sequenceNumber不从1开始,但它的有效还有其他要求。

ffmpeg html5-video media-source libavformat fmp4
3个回答
0
投票

一旦你缓冲了一些视频,你必须在JS中将

currentTime
元素上的
video
设置为最新的
buffered.end(0)
时间(假设你有一个缓冲范围)。

问题在于,浏览器将您正在播放的视频解释为从零时间开始,但您正在输入

MSE
供以后使用的片段。


0
投票

所有

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

此问题的一个简单解决方案是在附加第一个缓冲区后将

HTMLMediaElement.currentTime
属性设置为高值。 或者,为了支持 MSE 规范,您输入到 MSE 缓冲区的第一个
moof
框应该有
first_sample_flags_present
标志。


0
投票

SourceBuffer接口的mode属性用于控制媒体片段添加到SourceBuffer的顺序是任意的还是严格的。只需将其设置为“序列”即可

sourceBuffer.mode = "序列";

https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer/mode

© www.soinside.com 2019 - 2024. All rights reserved.