我想做一个基本的碎片mp4广播程序,带有avformat库和HTML5视频和MSE。
这是一个直播,我使用 avformat 将 h264 数据复制到 mp4 片段。
这是我附加到流的客户端的基本绘图:
所以,用一句话来说:
我已从两个客户端将 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开始,但它的有效还有其他要求。
一旦你缓冲了一些视频,你必须在JS中将
currentTime
元素上的video
设置为最新的buffered.end(0)
时间(假设你有一个缓冲范围)。
问题在于,浏览器将您正在播放的视频解释为从零时间开始,但您正在输入
MSE
供以后使用的片段。
所有
moof
框都包含有关其播放顺序的信息。 MSE 预计默认情况下视频会在时间 0 开始。
此问题的一个简单解决方案是在附加第一个缓冲区后将
HTMLMediaElement.currentTime
属性设置为高值。
或者,为了支持 MSE 规范,您输入到 MSE 缓冲区的第一个 moof
框应该有 first_sample_flags_present
标志。
SourceBuffer接口的mode属性用于控制媒体片段添加到SourceBuffer的顺序是任意的还是严格的。只需将其设置为“序列”即可
sourceBuffer.mode = "序列";
https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer/mode