一句话总结
FLV像快餐——随到随吃(边下边播);MP4像礼盒——必须拆完包装(加载元数据)才能开箱!
一、经典结构对比:流式设计 vs 索引设计
1. FLV(Flash Video):为流而生
FLV的核心是基于**Tag(标签)**的交错复用结构。整个文件由一系列连续的Tag组成,每个Tag包含了类型(音频/视频/脚本)、时间戳和数据负载。
- 结构示例:
[文件头] -> [Tag1: 视频帧K] -> [Tag2: 音频帧A] -> [Tag3: 视频帧P] -> ... - 流式优势:播放器无需预读索引。只要按顺序接收Tag,就能根据Tag自带的时间戳直接解码播放。这使其天然适用于对首屏时间要求苛刻的直播场景(如RTMP推流)。
- 缺点:由于缺乏全局索引,精确Seek(拖动进度条)操作相对困难且低效,需要遍历附近的Tag来定位关键帧。
2. 传统MP4(ISO Base Media File Format):为存储和编辑而生
MP4的核心是基于**Box(盒子/Atom)**的嵌套结构。最重要的两个Box是moov和mdat。
moov(Movie Atom) :元数据索引区。包含了文件的所有元信息,如时长、分辨率、编码格式、每一帧在mdat中的偏移位置和大小等。mdat(Media Data Atom) :实际的音视频数据裸流。- 结构示例:
[ftyp Box] -> [moov Box] -> [mdat Box] - 流式困境:如果
moov位于文件末尾(常见于录制生成的文件),播放器必须下载完整个文件才能获取索引,无法在线播放。即使通过faststart工具将moov前置,对于大文件,moov本身也可能很大(几MB),导致首屏加载依然需要等待索引下载完成。
二、MP4的自我革命:fMP4 (Fragmented MP4)
为了解决传统MP4在流媒体上的根本缺陷,fMP4被设计出来。它在保留MP4兼容性的基础上,吸收了FLV的流式思想。
1. fMP4的核心结构:引入moof Box
fMP4将单一、庞大的mdat数据块分解为一系列小的片段(Fragment),每个片段由moof和mdat成对出现。
-
moof(Movie Fragment Box) :片段索引。它只描述紧随其后的那个mdat片段的数据信息。 -
结构演变:
- 传统MP4:
[moov (全局索引)] -> [mdat (全部数据)] - fMP4:
[moov (初始化信息)] -> [Fragment 1: moof + mdat] -> [Fragment 2: moof + mdat] -> ...
- 传统MP4:
2. fMP4如何实现流式播放
- 启动加载:播放器首先加载
moovBox,获取基础的初始化信息(编码器配置等)。 - 按片加载:播放器按需下载后续的Fragment (e.g., Fragment 1)。
- 即时解码:在下载Fragment 1后,播放器读取其
moof来解析紧邻的mdat数据,立即解码播放。无需等待后续所有数据下载完成。
通过这种方式,fMP4将“必须先读完整个菜单才能点菜”的MP4,改造成了“拿一个菜的配方、做一个菜”的FLV模式,完美契合HLS和DASH等HTTP流媒体协议。
三、技术选型与生态演进
1. 为什么FLV被淘汰?
- 生态封闭:FLV强依赖于Adobe Flash插件,而Flash因安全性和性能问题被浏览器全面弃用。
- 功能局限:MP4容器对高级特性的支持远超FLV,例如DRM数字版权管理、HDR(高动态范围)、多轨道音频和字幕等。
2. fMP4的全面胜利:HLS/DASH的基石
- HLS (HTTP Live Streaming) :早期使用TS切片,但现在已全面转向fMP4。fMP4相比TS有更低的封装开销和更好的音视频同步性。
- DASH (Dynamic Adaptive Streaming over HTTP) :原生标准,fMP4是其首选容器格式。
- 低延迟直播(CMAF) :基于fMP4的块式传输(Chunked Transfer Encoding),可以实现接近RTMP的低延迟效果,同时享受HTTP的CDN分发优势。
四、选型建议总结
| 场景 | 推荐格式/方案 | 核心理由 |
|---|---|---|
| 超低延迟直播(<1s) | RTMP推流 (FLV) 或 WebRTC | 依然是延迟最低的方案,但兼容性受限。适用于专业推流端和特定播放器。 |
| 大规模CDN分发直播 | HLS / DASH (fMP4) | 行业标准。兼容性最佳(全平台HTML5支持),易于CDN加速,支持自适应码率。 |
| 点播/短视频 | MP4 (moov前置) | 编辑友好性最高,元数据丰富(封面、章节),全平台兼容。 |
| 历史遗留系统维护 | FLV | 维持旧有监控系统或Flash应用运行。 |