音视频基础概念:采样率、帧率、时间戳与编码格式
做音画同步,说白了就是跟这几个概念打交道。采样率、帧率、时间戳、编码格式——它们是整个系统的地基。我见过太多人上来就调同步参数,结果发现是采样率对不上,或者时间戳单位搞错了。嗯,咱们先把地基打牢。
2.1 采样率:声音的“像素”
声音是连续的模拟信号,计算机只能处理离散的数字。采样率就是每秒从连续信号中提取多少个样本点。单位是 Hz(赫兹)。
核心公式:采样率 = 每秒采样点数
比如 44100 Hz,就是每秒采集 44100 个点。
常见的采样率有这些:
| 采样率 | 常见场景 | 说明 |
|---|---|---|
| 8000 Hz | 电话语音 | 够用,但音质差 |
| 16000 Hz | VoIP、语音识别 | 语音质量尚可 |
| 44100 Hz | CD 音质、MP3 | 最通用的标准 |
| 48000 Hz | DVD、专业视频 | 视频行业标准 |
| 96000 Hz | 高解析音频 | 录音棚常用 |
我的经验:做音画同步时,音频采样率必须跟视频容器约定好。我遇到过项目里音频用 44100,视频容器却按 48000 算时间戳,结果声音越跑越偏。排查了一整天,最后发现是采样率不统一。
2.2 帧率:画面的“节奏”
帧率就是每秒显示多少帧画面。单位是 fps(frames per second)。
帧率决定了视频的流畅度。你想想看,电影是 24fps,游戏要 60fps 才觉得顺。为什么?因为人眼的视觉暂留效应。
常见的帧率标准:
- 24 fps —— 电影标准,有“胶片感”
- 25 fps —— PAL 制式(欧洲、中国电视)
- 29.97 fps —— NTSC 制式(美国、日本电视)
- 30 fps —— 网络视频常用
- 50/60 fps —— 高帧率视频、游戏录制
注意:帧率不是越高越好。帧率越高,数据量越大,编码压力也越大。做直播时,我建议根据网络带宽动态调整帧率,而不是死磕 60fps。
2.3 时间戳:PTS 与 DTS
这是音画同步的核心。没有时间戳,音频和视频就是两盘散沙。
时间戳有两种:
- PTS(Presentation Time Stamp) —— 显示时间戳。告诉解码器:这帧画面/这段音频应该在什么时候显示/播放。
- DTS(Decoding Time Stamp) —— 解码时间戳。告诉解码器:这帧数据应该在什么时候解码。
为什么会需要两个时间戳?因为视频编码有 B 帧(双向预测帧)。B 帧需要参考前后的帧才能解码,所以解码顺序和显示顺序不一样。
举个例子:
假设一个 GOP(图像组)的显示顺序是:I1 - B2 - B3 - P4
但解码顺序是:I1 - P4 - B2 - B3
因为 B2 和 B3 需要 P4 的信息才能解码。
所以 DTS 是 I1→P4→B2→B3,而 PTS 是 I1→B2→B3→P4。
时间戳的单位通常是毫秒(ms)或微秒(μs)。在 FFmpeg 里,时间基(time_base)决定了时间戳的精度。比如 time_base = 1/1000,时间戳就是毫秒。
避坑指南:我曾经在对接一个硬件编码器时,发现它的 PTS 是从 0 开始累加的,但解码器期望的是绝对时间戳。结果画面一直卡在开头不动。后来我手动加了一个初始偏移量才解决。记住:不同设备的时间戳起点可能不一样,一定要确认清楚。
2.4 编码格式:H.264 与 AAC
原始的音视频数据太大了,不压缩根本没法存、没法传。编码就是压缩的过程。
2.4.1 H.264(视频编码)
H.264 是目前最主流的视频编码标准。它用到了帧内预测、帧间预测、变换量化、熵编码等一系列技术。说白了,就是去掉空间冗余(同一帧里相似的区域)和时间冗余(相邻帧相似的内容)。
H.264 的核心概念:
- I 帧(关键帧) —— 完整的一帧,不依赖其他帧。解码的起点。
- P 帧(预测帧) —— 只记录跟前面 I 帧或 P 帧的差异。
- B 帧(双向预测帧) —— 参考前后帧,压缩率最高,但需要缓存。
- GOP(图像组) —— 两个 I 帧之间的所有帧。GOP 越长,压缩率越高,但随机访问越慢。
我个人的习惯:做直播时,GOP 设 2 秒(比如 50 帧 @25fps)。太长的话,用户切换频道要等很久才能看到画面。做点播时,GOP 可以设长一些,比如 5-10 秒,压缩率更好。
2.4.2 AAC(音频编码)
AAC 是 Advanced Audio Coding 的缩写,是 MP4 容器里最常用的音频编码格式。它比 MP3 效率更高,同等码率下音质更好。
AAC 的常见档次:
| 档次 | 说明 | 适用场景 |
|---|---|---|
| AAC-LC | 低复杂度,最通用 | 直播、点播、通话 |
| AAC-HE | 高效编码,低码率表现好 | 流媒体、低带宽场景 |
| AAC-HEv2 | 在 HE 基础上加参数立体声 | 极低码率(< 32kbps) |
注意:AAC 编码时,采样率、声道数、位深必须跟原始音频一致。我见过有人把 48000 Hz 的音频重采样到 44100 Hz 再编码,结果音调变了,听起来像“唐老鸭”。
2.5 知识体系总览
下面这张图把本章的核心概念串起来了。你可以看到采样率和帧率是原始数据的基础,时间戳是同步的纽带,编码格式是压缩的手段。它们共同决定了音画同步的成败。
2.6 小结
这一章我们聊了四个基础概念:
- 采样率 —— 音频的“分辨率”,常见 44100 和 48000
- 帧率 —— 视频的“节奏”,24/25/30/60 fps 各有用途
- 时间戳 —— PTS 管显示,DTS 管解码,B 帧让它们不一样
- 编码格式 —— H.264 压缩视频,AAC 压缩音频
这些概念看着简单,但实际项目里踩坑的往往就是它们。我建议你动手验证一下:拿一个 MP4 文件,用 FFprobe 看看它的采样率、帧率、编码格式和时间戳信息。亲眼看到数据,比死记硬背强得多。