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

【音视频】FMP4 介绍

参考博客: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
特性普通 MP4FMP4
存储方式完整文件分片存储
适用场景本地存储、下载直播、点播、流媒体传输
结构单一 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,降低延迟,提高兼容性。
http://www.dtcms.com/a/365342.html

相关文章:

  • 从 MMLU 到 HumanEval:为什么评估大型语言模型(LLM)的基准至关重要?
  • 策略模式 + 工厂模式
  • 海伯森检测应用案例之--光学板轮廓及瑕疵检测
  • 嵌入式 Linux 启动流程详解 (以 ARM + U-Boot 为例)
  • [Ai Agent] 打造一个真正可落地的客服智能体
  • 论文理解:Reflexion: Language Agents with Verbal Reinforcement Learning
  • 封装一个redis获取并解析数据的工具类
  • 基于web的云智教育在线平台设计与实现
  • 利用 openssl api 实现 TLS 双向认证
  • Jenkins和Fastlane的原理、优缺点、用法、如何选择
  • SpringAI Alibaba Graph 流式对话
  • python sqlalchemy模型的建立
  • 嵌入式硬件学习-2
  • Algorithms library
  • Qoder如何免费续杯,立即参与实践分享,赢 1000Credits
  • 解决windows下火狐浏览器开机会同时启动两个或多个页面
  • 为何quest3设备会强制更新,如何屏蔽更新
  • GoogleNet:更深的网络与更高的效率
  • 大模型的偏见:从训练数据到推理结果,如何检测与修正?
  • Voicemod-免费即时变声器
  • 【程序人生】有梦想就能了不起,就怕你没梦想
  • Redis 集群模式与高可用机制
  • 深度学习篇---Adam优化器
  • 计算机网络模型总概述
  • python抖音弹幕获取方案
  • 考研复习-计算机网络-第二章-物理层
  • 服务器安装vnc服务端
  • 深度学习篇---InceptionNet网络结构
  • Ecovadis评估认证准备期间对于公司员工培训有没有什么技巧?
  • 对轮询的理解