音视频学习(三十):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,降低延迟,提高兼容性。
相关推荐
布伦鸽1 小时前
C# Modbus TCP/IP学习记录
开发语言·学习·c#
yzhSWJ1 小时前
vue3使用video.js播放m3u8格式视频
音视频
Jack电子实验室1 小时前
STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]
stm32·学习·算法
程序员Linc2 小时前
《数字图像处理》第三章 3.8 基于模糊技术的图像强度变换与空间滤波学习笔记
笔记·学习·数字图像处理·模糊技术·强度变换·空间滤波
张张张3122 小时前
3.25学习总结 抽象类和抽象方法+接口+内部类+API
java·学习
viperrrrrrrrrr72 小时前
大数据学习(88)-zookeeper实现的高可用(HA)
大数据·学习·zookeeper
亭午3 小时前
pyspark学习rdd处理数据方法——学习记录
学习
promising-w4 小时前
【TI MSPM0】PWM学习
单片机·学习·ti 单片机
Wallace Zhang5 小时前
STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断
笔记·stm32·学习