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 参数是否一致。多数问题源于参数不匹配,而非网络本身。

音视频基础参数关系与 RTP 时间戳映射 采样率 · 分辨率 · 帧率 · 码率 · 像素格式 · 声道布局 · 时间基 音频参数 采样率:48000 Hz 位深:16 bit / fltp 声道布局:stereo 时间基:1/48000 20 ms → 960 采样点 视频参数 分辨率:1280×720 帧率:30 fps 像素格式:yuv420p 时间基:1/90000 每帧增量 3000 时间基与 RTP 视频时钟:90 kHz 音频时钟:采样率 换算:av_rescale_q 同步:RTCP / 缓冲 时间戳错 → 音画不同步 码率 = 压缩后的综合结果 视频 2500 kbps + 音频 128 kbps ≈ 2.6 Mbps 受分辨率、帧率、像素格式、编码器效率共同影响 采集 / 解码 原始帧与样本 编码 / 打包 H.264 / AAC → RTP 传输 / 同步 时间戳 + RTCP