📄 一句话概括
FLV 结构极简:文件头 9 字节 + 一串 Tag——每个 Tag 都带自己的时间戳,音视频就是靠它对齐的。
📝 本节和前面几节的关系
3.2 看了【文件级】信息,3.3 往下走一层:看【流级】结构。先从最简单的容器 FLV 说起。
一、FLV 是什么
FLV(Flash Video)是早期网页视频的主流容器,结构简单是它最大的优点。 它诞生在 Flash 时代,后来网页直播大量沿用——因为简单意味着容易实现、延迟低。 虽然 Flash 已经退役,但 FLV 仍然活在直播推流这条链路上。
二、结构:头 + 一串 Tag
文件头:9 字节,包含签名 FLV、版本号、标志位、头长度。 Previous Tag Size:4 字节,记录上一个 Tag 的大小,便于倒回。 Tag:一个个数据块——音频 Tag、视频 Tag、脚本 Tag。 整个文件就是头加上这一串 Tag,没有索引、没有复杂的表。
三、Tag 里装什么
每个 Tag 都有:类型、数据大小、时间戳、流 ID、然后才是数据本体。 时间戳是最关键的一项——它就是音视频对齐的依据。 脚本 Tag 里装的是 onMetaData,包含时长、码率、宽高这类总览信息。
四、为什么直播喜欢它
因为边推边收只需要按 Tag 顺序处理,不需要先读完整个文件。 对照之下,MP4 的索引(moov 盒)如果放在文件末尾,就必须等下完才能播。 这就是【结构简单】带来的实际好处:能边来边播。
五、动手 Demo:FLV 文件是怎么排布的
FLV 结构极简,这也是它在直播里流行的原因。
parts = [
("File Header", "9 字节", "签名 FLV、版本、标志位、头长度"),
("Previous Tag Size", "4 字节", "上一个 Tag 的大小(便于倒回)"),
("Tag (Audio)", "不定", "音频帧及其时间戳"),
("Tag (Video)", "不定", "视频帧及其时间戳"),
("Tag (Script)", "不定", "onMetaData,含时长与码率"),
]
for a, b, c in parts:
print("%-18s %-7s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
FLV 文件是怎么排布的
--------------------------------------------------------------------
FLV 结构极简,这也是它在直播里流行的原因。
FLV = 文件头(9 字节)+ 若干 Tag + 结束
部分 长度 装什么
----------------------------------------------------------------
File Header 9 字节 签名 FLV、版本、标志位、头长度
Previous Tag Size 4 字节 上一个 Tag 的大小(便于倒回)
Tag (Audio) 不定 音频帧及其时间戳
Tag (Video) 不定 视频帧及其时间戳
Tag (Script) 不定 onMetaData,含时长与码率
关键在【时间戳】:**音视频就是靠它对齐的。**
Tag 里的时间戳一旦乱了,画面和声音就会对不上——这就是音画不同步。
关键在【时间戳】:音视频就是靠它对齐的。 Tag 里的时间戳一旦乱了,画面和声音就会对不上——这就是音画不同步。
30 秒实验
- 找一个 FLV 文件(或一段.flv 格式的录屏),用十六进制查看器打开前 16 个字节。
- 前三个字节应该是字母 F、L、V。
常见误区
- 以为 FLV 已经没用了。直播推流这条链路至今还在用它。
- 忽略时间戳。音画对齐全靠它,出问题也多半出在它身上。
自测三问(点开对答案)
1. FLV 文件的基本结构是什么? —— 9 字节文件头 + 一串 Tag(音频、视频、脚本)。 2. 每个 Tag 里最关键的信息是什么? —— 时间戳——它是音视频对齐的依据。 3. FLV 为什么适合直播? —— 结构简单,按 Tag 顺序处理即可,不用先读完整文件就能边推边收。- ☐ 下一节(3.3.2 FlvAnalyser)
相关笔记
- FlvAnalyser — 把 FLV 拆开看的工具
- 音视频容器 — 容器与编码的分工
- 🔵 计算机基础 · 索引 — 文件的二进制结构
- 🎬 FFmpeg入门详解 · 索引