2. 音视频基础
在 FFmpeg 流媒体开发中,几乎所有“参数配置错误”最终都能追溯到几个基础概念:音频的采样率、声道布局,视频的分辨率、帧率、像素格式,以及贯穿音视频的码率与时间基。理解这些参数不仅是为了“看懂命令行”,更是为了在 RTP 打包、转码、同步与性能调优时做出正确判断。本章从工程视角梳理这些概念,并给出它们之间的换算关系与常见误区。
一、核心原理:采样与量化的两条主线
音频与视频在数字化时遵循不同但相似的逻辑。音频是“时间轴上的一维信号”,通过采样率决定每秒采集多少个样本点,通过位深决定每个样本用多少比特表示幅度,通过声道布局决定空间维度。视频则是“二维空间加时间轴的三维信号”,通过分辨率决定每帧的像素矩阵大小,通过像素格式决定每个像素如何存储颜色与亮度,通过帧率决定每秒呈现多少帧。
码率是上述所有参数在压缩后的综合结果。它表示单位时间内音视频数据量,通常以 kbps 或 Mbps 计量。码率不是独立参数,而是采样率、分辨率、帧率、像素格式与编码器效率共同作用后的“输出”。因此,调优时不能只盯码率,而要回到源头参数。
关键关系:原始数据量 ≈ 采样率 × 位深 × 声道数(音频);原始数据量 ≈ 宽 × 高 × 帧率 × 每像素比特数(视频)。压缩后的码率则取决于编码器、GOP、量化参数与内容复杂度。
二、参数详解与工程含义
采样率:常见值有 8000 Hz(电话)、16000 Hz(窄带语音)、44100 Hz(CD)、48000 Hz(视频制作与 RTP 常用)。采样率越高,可表示的频率上限越高,但数据量线性增长。RTP 音频打包时,采样率直接决定时间戳增量:例如 48000 Hz 下,每 20 ms 对应 960 个采样点。
分辨率:如 640×360、1280×720、1920×1080。分辨率决定画面细节,但并非越高越好。在弱网 RTP 场景中,过高的分辨率会导致单帧过大,增加分片与丢包风险。工程上常按“目标码率 ÷ 帧率”估算单帧预算,再反推合适分辨率。
帧率:常见 24、25、30、50、60 fps。帧率影响运动流畅度,也直接影响码率与时间基。RTP 视频时间戳通常以 90 kHz 时钟为基准,因此 30 fps 下每帧时间戳增量为 90000/30 = 3000。
像素格式:如 yuv420p、yuv422p、yuv444p、rgb24、nv12。它决定亮度与色度的采样比例。yuv420p 在水平和垂直方向都对色度减半采样,数据量最小,是 H.264 与 RTP 场景最常用的格式。若源为 rgb24 而编码器要求 yuv420p,必须显式转换,否则会报错或产生颜色异常。
声道布局:如 mono、stereo、5.1。它决定声道数量与空间位置。RTP 音频打包时,声道数影响每包负载大小;AAC 编码通常要求特定声道布局,错误布局会导致解码失败或声音错位。
时间基:FFmpeg 中最重要的隐藏参数之一。时间基是一个分数,表示“一个时间单位对应多少秒”。例如 AVRational{1, 1000} 表示时间基为毫秒。不同流可能使用不同时间基,转码或封装时必须通过 av_rescale_q 进行换算,否则会出现音视频不同步、时间戳跳变等问题。
三、参数关系与换算示例
下面用一段 FFmpeg 命令与日志片段说明参数如何共同作用。该命令将输入转为 720p、30 fps、yuv420p、AAC 48 kHz 立体声,并输出 RTP 流:
ffmpeg -i input.mp4 \
-vf "scale=1280:720,fps=30,format=yuv420p" \
-c:v libx264 -b:v 2500k -g 60 \
-c:a aac -ar 48000 -ac 2 -b:a 128k \
-f rtp rtp://192.168.1.100:5004
从日志中可以观察到时间基与时间戳的对应关系:
Stream #0:0: Video: h264, yuv420p, 1280x720, 30 fps
time_base=1/90000, tbn=90000
Stream #0:1: Audio: aac, 48000 Hz, stereo, fltp
time_base=1/48000
视频时间基为 1/90000,因此每帧时间戳增量为 90000/30=3000;音频时间基为 1/48000,每 20 ms 包时间戳增量为 960。两者在 RTP 层通过 RTCP 与接收端缓冲进行同步。
| 参数 | 典型值 | 对码率/性能的影响 | RTP 相关注意点 |
|---|---|---|---|
| 采样率 | 48000 Hz | 线性增加音频数据量 | 决定音频时间戳增量 |
| 分辨率 | 1280×720 | 像素数增加,码率上升 | 单帧过大需分片 |
| 帧率 | 30 fps | 帧数增加,码率上升 | 90 kHz 下增量 3000 |
| 像素格式 | yuv420p | 比 rgb24 节省约一半 | 编码器兼容性最好 |
| 声道布局 | stereo | 双声道数据量翻倍 | 影响每包负载 |
| 时间基 | 1/90000 | 不直接影响码率 | 换算错误导致不同步 |
四、案例场景:RTP 推流参数配置
假设需要将本地摄像头采集的 1080p、30 fps、yuv422p、48 kHz 立体声推送到 RTP 服务器,但目标网络带宽仅 3 Mbps。直接推流会因码率过高导致丢包。合理的处理流程是:先将像素格式转为 yuv420p,再缩放至 1280×720,保持 30 fps,视频码率设为 2500 kbps,音频保持 48 kHz 立体声 128 kbps。这样总码率约 2.6 Mbps,留出余量。若网络进一步恶化,可降帧率至 15 fps 或降分辨率至 960×540,而不是盲目降低码率导致画质崩溃。
实用估算:视频码率 ≈ 分辨率像素数 × 帧率 × 运动系数 × 编码效率。工程中常用“每像素每帧比特数”粗略比较:720p30 在 2.5 Mbps 下约为 0.09 bit/pixel/frame,属于可接受范围。
五、常见误区与复盘
- 误区一:只调码率,不改分辨率与帧率。码率是结果,不是原因。降低码率而不降分辨率,会导致量化参数升高、块效应明显。
- 误区二:忽略像素格式转换。许多编码器只接受 yuv420p,若输入为 yuv444p 或 rgb24,FFmpeg 可能自动插入转换,增加 CPU 开销,甚至因未显式指定而失败。
- 误区三:时间基混用。在 RTP 打包时,若直接使用解码器输出的时间基而不换算到 90 kHz,接收端会出现时间戳跳跃或音视频不同步。
- 误区四:采样率与声道布局不匹配。AAC 编码器对某些声道布局支持有限,错误配置会导致编码失败或播放异常。
排障提示:当 RTP 流出现花屏、卡顿或音画不同步时,优先检查 ffprobe 输出的分辨率、帧率、像素格式、采样率、声道布局与时间基,再核对 SDP 中的 rtpmap 与 fmtp 参数是否一致。多数问题源于参数不匹配,而非网络本身。