音视频学习(三十):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)

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

  • 主要包含 mvhd、trak、udta 等 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,降低延迟,提高兼容性。
相关推荐
lisw0511 小时前
作为人类代理的大语言模型及其角色分类!
人工智能·学习·语言模型
Z21-X11 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生
坤坤子吖11 小时前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
Rabitebla11 小时前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习
楚山之石11 小时前
【MRM】CAPLEX 对比剂灌注 MRI 开源术语库:ISMRM OSIPI 共识报告
图像处理·人工智能·学习·mri
ck01357912 小时前
视频片段提取与视频修剪的区别:多时间段选择及导出流程
人工智能·音视频·视频
沐飞工具箱12 小时前
游戏、漫画、视频里的外语怎么实时翻译?从 OCR + AI 原理聊聊 VoriTrans 屏幕翻译
人工智能·游戏·实时互动·音视频·自动翻译
前进的李工1 天前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
小豆庄1 天前
监控视频脱敏的追踪漂移与ID撞号陷阱
目标跟踪·ffmpeg·音视频·视频·敏捷流程
正在走向自律1 天前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付