🎬 第三章 音视频开发常用工具
📄 一句话概括

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 秒实验

  1. 找一个 FLV 文件(或一段.flv 格式的录屏),用十六进制查看器打开前 16 个字节。
  2. 前三个字节应该是字母 F、L、V。

常见误区

  1. 以为 FLV 已经没用了。直播推流这条链路至今还在用它。
  2. 忽略时间戳。音画对齐全靠它,出问题也多半出在它身上。
自测三问(点开对答案) 1. FLV 文件的基本结构是什么? —— 9 字节文件头 + 一串 Tag(音频、视频、脚本)。 2. 每个 Tag 里最关键的信息是什么? —— 时间戳——它是音视频对齐的依据。 3. FLV 为什么适合直播? —— 结构简单,按 Tag 顺序处理即可,不用先读完整文件就能边推边收。

相关笔记