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

把 Tag 按时间顺序列出来,就能看出流的节奏——音频 Tag 比视频密得多,每个 Tag 都带自己的时间戳。

📝 本节和前面几节的关系

3.3.1 讲了 FLV 的结构,这一节讲专门用来拆它的工具。

一、FlvAnalyser 是干什么的

它是一款专门分析 FLV 文件的小工具,会把文件里的 Tag 一个个列出来。 每一行是一个 Tag:类型、时间戳、大小——整个流的结构一目了然。 它的定位很明确:只看 FLV,但看得足够细。

二、能看出什么

音频与视频的密度对比:Demo 33 里,每秒 30 个视频 Tag 对 43 个音频 Tag。 时间戳的连续性:有没有跳跃、有没有回退——这直接关系到音画同步。 码率分布:哪些时刻数据量突然变大(比如场景切换)。 关键帧位置:I 帧在哪,决定能不能从中途开始播。

三、为什么音频 Tag 更多

因为音频帧比视频帧短——44.1 kHz 的音频每帧只装 1024 个采样点,约 23 毫秒一帧。 视频 30 fps 是 33 毫秒一帧;音频 23 毫秒一帧,密度自然更高。 这不是缺陷,是两种媒体天生的粒度差异——处理时必须分开对待。

四、和码流分析工具的差别

FLV 分析工具看的是【容器层】:Tag 怎么排、时间戳怎么走。 码流分析工具(3.4)看的是【编码层】:H.264 的 NAL、切片、宏块。 两者是两层:先看 Tag 有没有问题,再看帧内部有没有问题——顺序不能反。

五、动手 Demo:模拟一段 FLV 码流的 Tag 序列

按时间顺序把 Tag 列出来,就能看出流的【节奏】。 按 30 fps 视频 + 44.1 kHz 音频的典型间隔模拟前 0.5 秒:

events = [(i * 1000.0 / 30.0, "V") for i in range(16)]
events += [(i * 1000.0 / 43.0, "A") for i in range(23)]
events.sort(key=lambda e: (e[0], e[1]))

prev = 0
for i, (ts, kind) in enumerate(events[:10], 1):
    size = 4200 if kind == "V" else 380
    print("%2d  %s  %4d ms  %6d 字节  间隔 %d ms"
          % (i, "视频" if kind == "V" else "音频", round(ts), size, round(ts) - prev))
    prev = round(ts)

实跑输出:

--------------------------------------------------------------------
模拟一段 FLV 码流的 Tag 序列
--------------------------------------------------------------------

按时间顺序把 Tag 列出来,就能看出流的【节奏】。

按 30 fps 视频 + 44.1 kHz 音频的典型间隔模拟前 0.5 秒:

  序号     类型     时间戳(ms)     大小(字节)     间隔(ms)
  ---------------------------------------------------------
  1        音频     0              380            0
  2        视频     0              4,200          0
  3        音频     23             380            23
  4        视频     33             4,200          10
  5        音频     46             380            14
  6        视频     67             4,200          20
  7        音频     70             380            3
  8        音频     93             380            23
  9        视频     100            4,200          7
  10       音频     116            380            16

  注意两点:① 音频 Tag 比视频密得多(每秒 43 个对 30 个);
  ② 每个 Tag 都带自己的时间戳——**播放器就是按这两列对齐音画的。**

两个看点:① 音频 Tag 比视频密得多(每秒 43 个对 30 个); ② 每个 Tag 都带自己的时间戳——播放器就是按这两列对齐音画的。

30 秒实验

  1. 用 VLC 录一段网络直播成 FLV,再拿 FlvAnalyser 打开它。
  2. 看前 20 个 Tag 的类型分布——音频和视频大致是什么比例?

常见误区

  1. 以为音频 Tag 多就说明音频数据量大。只是粒度更细,总量未必更大。
  2. 先看码流分析再看 Tag 顺序。容器层的问题要排在编码层之前排查。
自测三问(点开对答案) 1. FlvAnalyser 能看出哪四类信息? —— 音视频密度、时间戳连续性、码率分布、关键帧位置。 2. 为什么音频 Tag 比视频 Tag 密? —— 音频每帧只装 1024 个采样点,约 23 毫秒一帧,比视频帧短。 3. FLV 分析和码流分析分别看哪一层? —— FLV 分析看容器层(Tag),码流分析看编码层(帧内部)。

相关笔记