📄 一句话概括
把 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 秒实验
- 用 VLC 录一段网络直播成 FLV,再拿 FlvAnalyser 打开它。
- 看前 20 个 Tag 的类型分布——音频和视频大致是什么比例?
常见误区
- 以为音频 Tag 多就说明音频数据量大。只是粒度更细,总量未必更大。
- 先看码流分析再看 Tag 顺序。容器层的问题要排在编码层之前排查。
自测三问(点开对答案)
1. FlvAnalyser 能看出哪四类信息? —— 音视频密度、时间戳连续性、码率分布、关键帧位置。 2. 为什么音频 Tag 比视频 Tag 密? —— 音频每帧只装 1024 个采样点,约 23 毫秒一帧,比视频帧短。 3. FLV 分析和码流分析分别看哪一层? —— FLV 分析看容器层(Tag),码流分析看编码层(帧内部)。- ☐ 下一节(3.4.1 简介)
相关笔记
- FLV简介 — 它分析的那只盒子
- 简介 — 再往下一层:帧内部
- 短视频的特点 — 低延迟为什么重要
- 🎬 FFmpeg入门详解 · 索引