【音视频】FMP4 介绍

发布于:2025-09-04 ⋅ 阅读:(30) ⋅ 点赞:(0)

参考博客:https://blog.csdn.net/www_dong/article/details/146463046

一、FMP4是什么?

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

1.1 FMP4 和 MP4 的区别

  • 普通 MP4 采用“单一 MDAT”结构,文件内通常包含完整的媒体元数据(moov)和媒体数据(mdat),适用于本地播放
  • 普通的MP4格式如果要播放,必须要下载完最后的moov盒子才可以解析视频,而存放媒体信息的moov通常在文件的尾部,如果要实现MP4的点播,必须将moov盒子前置,可以使用ffmpeg工具来操作
ffmpeg -i inout.mp4 -movflags faststart output.mp4
  • FMP4是将音视频数据拆分为多个MOOF和MDAT,并且moov存在于文件的头部,因此可以快速获得视频的编解码格式、轨道信息等数据,实现快速点播,支持流式播放。同时FMP4支持DASH,因此可以支持码率转换

可以使用ffmpeg将MP4格式转换为FMP4格式:

ffmpeg -i input.mp4 -c copy -movflags frag_keyframe+empty_moov+default_base_moof output.fmp4
特性 普通 MP4 FMP4
存储方式 完整文件 分片存储
适用场景 本地存储、下载 直播、点播、流媒体传输
结构 单一 moov 多个 moof 片段
码率自适应 不支持 支持
点播跳转 整个文件解析 直接访问片段

二、FMP4的结构

2.1 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 片段可以连续存储或按需加载,使其适用于直播和点播流媒体。

2.2 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
  • 结构为 ftyp(文件类型标识) + moov(全局元数据,包含编解码、轨道等信息) + 单个mdat(所有媒体数据,比如整个视频的画面、音频帧都存在这一个 “大盒子” 里)。

  • 媒体数据是连续存储的,没有被拆分。

在这里插入图片描述

FMP4
  • 结构为 ftyp + moov(初始化段,仅含全局元数据) + 多个moof + mdat的 “片段组合”
  • 每个moof单个片段的元数据(记录该片段的时间戳、轨道 ID 等),每个mdat该片段的媒体数据(比如 “5 秒钟的视频帧 + 音频帧”)。
  • 媒体数据被拆分成多个小片段,按需传输。

在这里插入图片描述

三、FMP4 在流媒体中的应用

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

网站公告

今日签到

点亮在社区的每一天
去签到