Fragmented mp4(fMP4) 究竟是啥?它与普通的mp4有啥不同?

Posted

技术标签:

【中文标题】Fragmented mp4(fMP4) 究竟是啥?它与普通的mp4有啥不同?【英文标题】:What exactly is Fragmented mp4(fMP4)? How is it different from normal mp4?Fragmented mp4(fMP4) 究竟是什么?它与普通的mp4有什么不同? 【发布时间】:2016-05-12 16:39:33 【问题描述】:

媒体源扩展 (MSE) 需要分段 mp4 才能在浏览器中播放。

【问题讨论】:

【参考方案1】:

一个分段的 MP4 包含一系列片段,如果您的服务器支持字节范围请求,则可以单独请求这些片段。

盒子又名原子

所有 MP4 文件都使用包含boxes aka atoms 的面向对象格式。

您可以使用在线工具(例如MP4 Parser)查看 MP4 中方框的表示,如果您使用的是 Windows,则可以使用 MP4 Explorer。让我们比较一下普通 MP4 和碎片化的 MP4:

非分段 MP4

这张截图(来自MP4 Parser)显示了一个没有被分割的MP4,只是有一个巨大的mdat(电影数据)框。

如果我们正在构建支持自适应比特率的视频播放器,我们可能需要知道 0.5Mbps 和 1Mbps 文件中 10 秒标记的字节位置,以便此时在两个文件之间切换视频源.在每个文件中的一个巨大的mdat 中确定这个确切的字节位置并非易事。

分段 MP4

此屏幕截图显示了使用MP4Box 和onDemand 配置文件分割的分段MP4。

您会注意到sidx 和一系列moof+mdat 框。 sidx 是段索引,存储moof+mdat 段的精确字节范围位置的元数据。

基本上,您可以独立加载sidx(其字节范围将在随附的.mpd 媒体演示描述符文件中定义),然后选择您想要随后加载并添加到MSE 的段@ 987654329@.

重要的是,每个片段都是按照您选择的固定间隔(即每 5 秒)创建的,因此片段可以在不同比特率的文件之间进行时间对齐,从而在播放期间轻松调整比特率。

【讨论】:

在 3.3 节的HLS specification 中也可以找到关于什么是 fMP4 的简明规范。 sidx 是存储在 mp4 标头还是某个字节范围内?我想获取有关 sidx 的所有信息,但不想下载整个 mp4 文件并进行解析。谢谢 我想知道在哪里可以找到moof框架的规格。似乎有一个我需要访问的计数器和时间戳信息。 那么发送 moof+mdat 并将其附加到 SourceBuffer 可以吗?这就是媒体所期待的吗?因此,例如,我可以一个接一个地连接 10 帧 h264 数据并只创建一个 mdat 并使其包装 10 帧连接的 h264 数据。所以像 moof+mdat(10*h264 data) @EvrenBingøl,你试过你的方法吗 - moof+mdat(10*h264_data)。 Sourcebuffer 是否适用于该数据?

以上是关于Fragmented mp4(fMP4) 究竟是啥?它与普通的mp4有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

LLVM 究竟是啥?

究竟是啥导致二进制文件“乱码”?

“通过引用传递”究竟是啥意思?

对于 FOR 循环中的目录,“%~zI”究竟是啥?

究竟是啥触发了 Angular 中的 main.ts

Gmail API 推送通知速率限制究竟是啥意思?