Fragmented MP4分片式 mp4 实战
FMP4 终于搞懂了
😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

新手小白最近在研究 hls 协议相关内容,怎么看网上都到V6 版本了,我们公司才用到V3 版本,后面问了研发,研发说V2和V3 公司内容规定的,而其他的版本是 HLS 标准的东西,另外HLS V6,其实就是 hls(fmp4),它是 HLS 的一种 “新格式”,不是大家常说的 “常用版本”。
fmp4 概述
fmp4的全称是 Fragmented MP4,也就是分片式 MP4。这个和 fmp4 和普通 mp4 又有什么关系呢?普通 MP4 是整体的,而 fmp4 是切成小块的,适合流媒体。
HLS 的分片格式有两种
- 普通 HLS(你们说的 v2/v3):用TS 文件当分片(比如你之前生成的
.ts),兼容性极强,支持 HEVC 编码,但 Safari 对它有特殊限制。 - HLS (fMP4)(对应官方 v6):用fMP4 文件当分片,是苹果推的新格式 —— Safari 浏览器播放 HEVC 编码的视频时,必须用 fMP4 格式的 HLS,传统 TS 格式的 HLS 即使是 HEVC 编码,Safari 也不认。
fMP4 的核心结构
fMP4 的文件由两部分组成:
- 初始化片段(Initialization Segment):包含全局元数据(
moov原子),记录音视频的编码格式、分辨率、采样率等 “全局配置信息”—— 播放器只需加载一次初始化片段,就能理解后续所有分片的编码规则。 - 媒体片段(Media Fragment):每个片段是独立的 “小 MP4 块”,包含
moof(片段元数据)和mdat(片段媒体数据)—— 播放器可以按顺序加载片段,下载一个片段就播放一个片段,无需等待整个文件下载完成。
fMP4 的主要应用场景(和你的 HLS 场景强相关)
fMP4 最核心的应用是网络流媒体协议,尤其是和你之前聊的 HLS 高度绑定:
- HLS (fMP4)(对应 HLS 官方 v6 + 版本):
- 传统 HLS 用 TS 文件作为分片,而 fMP4 是苹果推的 HLS “新分片格式”;
- 苹果 Safari 浏览器强制要求:播放 HEVC(H.265)编码的 HLS 视频时,必须用 fMP4 格式(TS 格式的 HEVC HLS 在 Safari 上无法播放)—— 这就是之前聊天里说 “Safari 播 HEVC 需要发 HLS (fMP4)” 的原因。
- MPEG-DASH:DASH 是国际标准的流媒体协议,唯一推荐的容器格式就是 fMP4,几乎所有 DASH 流都是基于 fMP4 封装的。
- 低延迟直播:fMP4 的片段可以切得很小(比如几百毫秒),配合 “Chunked Transfer Encoding” 能实现秒级以下的直播延迟,比传统 TS 格式更适合低延迟场景。
通用 fMP4 格式和适配 Safari 播放 HEVC 的 fMP4 HLS
fMP4 格式的 HLS,FFmpeg 会自动生成:
- 1 个播放列表文件(
.m3u8) - 1 个初始化片段(
init.m4s,存储全局编码配置) - N 个媒体分片(
seg-0.m4s、seg-1.m4s…,每个是独立的 fMP4 片段)
案例一
ffmpeg -i bbb_30fps_gop_60_3mbps.mp4 -c copy -f hls -hls_time 5 -start_number 0 -hls_list_size 0 -hls_segment_type fmp4 -hls_playlist_type vod output.m3u8

案例二
ffmpeg -i ../bbb_30fps_gop_60_3mbps.mp4 -vcodec libx265 -crf 28 -preset medium -tag:v hvc1 -f hls -hls_time 5 -start_number 0 -hls_list_size 0 -hls_segment_type fmp4 -hls_playlist_type vod output.m3u8
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)