音视频学习(三十):fmp4

FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP) HLS(HTTP Live Streaming)等自适应流媒体协议。FMP4 的主要特点是将视频和音频数据拆分成片段(Fragment),以更灵活的方式进行传输和存储。

FMP4 与普通 MP4 的区别

普通 MP4 采用"单一 MOOF + MDAT"结构,文件内通常包含完整的媒体元数据(moov)和媒体数据(mdat),适用于本地播放。

而 FMP4 采用"多个 MOOF + MDAT 片段"结构,适用于流式传输,能减少初始加载时间,支持动态码率切换。

特性 普通 MP4 FMP4
存储方式 完整文件 分片存储
适用场景 本地存储、下载 直播、点播、流媒体传输
结构 单一 moov 多个 moof 片段
码率自适应 不支持 支持
点播跳转 整个文件解析 直接访问片段

FMP4 结构

FMP4 由文件级、初始化段(Init Segment)和媒体片段(Media Fragment)组成。

文件级

整个 FMP4 文件仍然遵循 ISO BMFF(Base Media File Format)格式,基础结构包括:

  • ftyp:文件类型(File Type Box)
  • moov:元数据(Movie Box)
  • 多个片段(Fragments) :由 moof(Movie Fragment)和 mdat(Media Data)组成的多个片段。

初始化段(Init Segment)

初始化段包含:

  • ftyp:声明文件类型。
  • moov:存储编解码信息、轨道信息(TrackBox)、采样表(Sample Table)等,不含实际音视频数据。

作用:初始化播放器,告知解码器如何解码后续的片段。

片段(Media Fragment)

每个片段都包含:

  • moof(Movie Fragment Box):表示一个新的片段,包含元数据,如时间戳、帧信息。
  • mdat(Media Data Box):存储实际的音视频数据。

多个 moof + mdat 片段可以连续存储或按需加载,使其适用于直播和点播流媒体。

FMP4 关键 Box 解析

ftyp(文件类型 Box)

reStructuredText 复制代码
ftyp
 ├── major_brand(主品牌,如 isom)
 ├── minor_version(次版本)
 ├── compatible_brands(兼容品牌)

示例:

hex 复制代码
00000018 66747970 69736F6D 00000200 69736F6D 61766331

这里 isom 代表 MP4 文件格式,avc1 代表 H.264 兼容。

moov(Movie Box)

  • 存储文件全局信息,包括轨道信息、时长、编解码信息等。

  • 主要包含 mvhdtrakudta 等 Box。

reStructuredText 复制代码
moov
 ├── mvhd(Movie Header Box)
 ├── trak(Track Box,存储音视频轨道)
 │    ├── tkhd(Track Header Box,轨道信息)
 │    ├── mdia(Media Box,媒体信息)
 │         ├── mdhd(Media Header Box,媒体头)
 │         ├── hdlr(Handler Box,解码器类型)
 │         ├── minf(Media Information Box,采样、压缩信息)
 │              ├── stbl(Sample Table Box)
 ├── mvex(Movie Extends Box,用于分片)

作用 :播放器解析 moov 后,可知道如何解码音视频数据。

moof(Movie Fragment Box)

  • moof 是 FMP4 的核心,它表示一个新的片段,包含时间戳、采样信息。

  • moof 结构:

reStructuredText 复制代码
moof
 ├── mfhd(Movie Fragment Header Box,片段序号)
 ├── traf(Track Fragment Box,轨道片段信息)
      ├── tfhd(Track Fragment Header Box,轨道 ID)
      ├── tfdt(Track Fragment Decode Time Box,时间戳)
      ├── trun(Track Fragment Run Box,存储帧偏移量、大小等)

作用 :播放器加载 moof 后,知道这个片段的起始时间、轨道 ID,以及解码顺序。

  • moof 解析示例
    • mfhd 00000001 → 片段序号 1
    • tfhd 00000001 → 轨道 ID 1
    • tfdt 00000001 → 时间戳起点 1
hex 复制代码
0000006C 6D6F6F66 00000010 6D666864 00000001
00000058 74726166 00000014 74666864 00000001
00000010 74666474 00000001 00000000

mdat(Media Data Box)

  • mdat 包含真正的音视频数据帧,按 moof 指定的时间顺序排列。
reStructuredText 复制代码
mdat(Media Data)
  • 示例:
hex 复制代码
0000017C 6D646174 ... (H.264/HEVC 视频帧数据)

作用 :播放器解码 mdat 并播放视频。

解析示例

mp4

fmp4

FMP4 在流媒体中的应用

在 HLS 中

  • 传统 HLS 使用 .ts 作为分片格式,但 ts 容量大,时延较高。
  • Apple 推出了 CMAF(Common Media Application Format) ,支持 fMP4 作为 HLS 的片段格式,提高兼容性和性能。

示例:HLS playlist(m3u8)

m3u8 复制代码
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MAP:URI="init.mp4"
#EXTINF:6.000,
segment1.m4s
#EXTINF:6.000,
segment2.m4s

init.mp4 是初始化段,segment1.m4s 是 FMP4 片段。

在 DASH 中

DASH 直接支持 fMP4 作为流格式,每个片段可独立请求。

示例:DASH MPD(Media Presentation Description)

xml 复制代码
<MPD>
  <Period>
    <AdaptationSet>
      <Representation mimeType="video/mp4">
        <SegmentTemplate media="segment$Number$.m4s" initialization="init.mp4" />
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

总结

  • FMP4 适用于流媒体传输,支持按片段加载,提高播放灵活性。
  • 主要由 moov(初始化)和 moof + mdat(片段)组成。
  • 广泛应用于 HLS(CMAF)和 DASH,降低延迟,提高兼容性。
相关推荐
karmueo4617 分钟前
视频序列和射频信号多模态融合算法Fusion-Vital解读
算法·音视频·多模态
昨日之日200618 分钟前
Video Background Remover V3版 - AI视频一键抠像/视频换背景 支持50系显卡 一键整合包下载
人工智能·音视频
DKPT5 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好好研究7 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师8 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF9 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上9 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Chef_Chen10 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
站在巨人肩膀上的码农12 小时前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
X_StarX12 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生