当前位置: 首页 > article >正文

音视频学习(三十):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 片段”结构,适用于流式传输,能减少初始加载时间,支持动态码率切换。

特性普通 MP4FMP4
存储方式完整文件分片存储
适用场景本地存储、下载直播、点播、流媒体传输
结构单一 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)

ftyp
 ├── major_brand(主品牌,如 isom)
 ├── minor_version(次版本)
 ├── compatible_brands(兼容品牌)

示例:

00000018 66747970 69736F6D 00000200 69736F6D 61766331

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

moov(Movie Box)

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

  • 主要包含 mvhdtrakudta 等 Box。

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 结构:

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
0000006C 6D6F6F66 00000010 6D666864 00000001
00000058 74726166 00000014 74666864 00000001
00000010 74666474 00000001 00000000

mdat(Media Data Box)

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

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

解析示例

mp4

在这里插入图片描述

fmp4

在这里插入图片描述

FMP4 在流媒体中的应用

在 HLS 中

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

示例:HLS playlist(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)

<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,降低延迟,提高兼容性。

http://www.kler.cn/a/598577.html

相关文章:

  • Shell正则表达式
  • fastapi+playwright爬取google搜索1-3页的关键词返回json
  • 《Solidity智能合约开发:从零到一实战指南》大纲
  • SpringBoot 第三课(Ⅰ) 数据层开发
  • Simple-BEV的bilinear_sample 作为view_transformer的解析,核心是3D-2D关联点生成
  • 8、undo log
  • 使用HAI来打通DeepSeek的任督二脉
  • 我的uniapp自定义模板
  • 基于AT89C52单片机的智能家居安全监控系统设计
  • 【RabbitMQ】RabbitMQ消息的重复消费问题如何解决?
  • 编译安装redis,systemtcl配置redis自启动,系统并发调优
  • IMX8MP Android 10系统编译SDK
  • elasticsearch+sentencetransformer检索样例
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序源码在社交电商渠道拓宽中的协同应用研究
  • 石家庄 10 年 PHP 开发者转岗分析
  • Python 用户账户(让用户拥有自己的数据)
  • Java EE(13)——网络编程——UDP/TCP回显服务器
  • 【系统架构设计师】调用/返回体系结构风格
  • 如何在 Linux 中递归解压所有子目录下的 `.tar.gz` 文件
  • 前端面试:[React] scheduler 调度机制原理?