3. 媒体流基础:音频采样与量化、视频帧与码率、编解码器概念

做实时转码,你得先搞懂媒体流到底长什么样。说白了,我们处理的不是「视频文件」,而是一串串数字化的音频样本和视频帧。我见过不少新手,上来就调编码器参数,结果音画不同步、码率炸了,根本原因就是没吃透这些基础概念。

这一章,咱们把音频采样、视频帧、码率、还有 Opus、VP8/VP9、H264 这几个核心编解码器,一次性讲透。

3.1 音频采样与量化:把声波变成数字

声音是连续的模拟信号。计算机要处理它,就得「采样」和「量化」。你想想看,就像用一把尺子去量一根曲线——采样率决定你量得多密,量化精度决定你量得多准。

3.1.1 采样率

采样率(Sample Rate)就是每秒从连续信号中提取多少个样本点。单位是 Hz。

  • 8,000 Hz:电话语音质量,够用但很糊。
  • 16,000 Hz:WebRTC 语音通话的标配,我个人习惯用这个做语音识别。
  • 44,100 Hz:CD 音质,音乐场景常用。
  • 48,000 Hz:视频制作和 WebRTC 高清通话的标准,我建议你优先选这个。
我的经验:在 WebRTC 里,如果只传人声,16kHz 就够了。但要做音乐直播或高清会议,必须上 48kHz。采样率低了,高频信息全丢,后期想补都补不回来。

3.1.2 量化精度与位深

量化精度(Bit Depth)决定每个样本用多少 bit 来表示。常见的就两种:

  • 16-bit:动态范围 96dB,WebRTC 默认值,够用。
  • 24-bit:动态范围 144dB,录音棚级别,转码时一般用不上。

量化精度不够,就会出现「量化噪声」。嗯,这里要注意:噪声不是背景杂音,而是数字信号还原模拟信号时产生的误差。我曾经在项目里遇到过,用 8-bit 量化录了一段钢琴,结果回放时高频部分全是嘶嘶声,那就是量化精度太低导致的。

3.1.3 音频数据量计算

音频的裸数据量很好算:

数据量 (bps) = 采样率 × 量化精度 × 声道数

举个例子:48kHz、16-bit、双声道立体声:

48,000 × 16 × 2 = 1,536,000 bps ≈ 1.5 Mbps

这就是未经压缩的 PCM 数据量。实时传输这么大数据量?不现实。所以我们需要编解码器来压缩,比如 Opus。

3.2 视频帧与码率:理解画面的「帧」和「流」

视频说白了就是快速播放一系列图片。每一张图片就是一帧(Frame)。帧率(FPS)决定流畅度,分辨率决定清晰度,码率决定数据量。这三者互相制约,你不可能既要高清又要流畅还要省带宽。

3.2.1 帧类型

在视频编码里,帧不是平等的。我刚开始做转码时,以为每一帧都是独立图片,后来才发现编码器会利用帧之间的冗余信息来压缩。常见的帧类型有三种:

帧类型 全称 特点 数据量
I 帧 Intra Frame 关键帧,完整编码,不依赖其他帧 最大
P 帧 Predictive Frame 参考前面的 I 帧或 P 帧,只存差异 中等
B 帧 Bidirectional Frame 参考前后帧,压缩率最高 最小
避坑指南:我曾经在低延迟直播里用了 B 帧,结果延迟直接飙到 2 秒以上。为什么?因为 B 帧需要参考后面的帧,编码器必须缓存好几帧才能解码。实时场景下,我建议你只用 I 帧和 P 帧,或者把 B 帧数量限制在 1-2 个。

3.2.2 码率控制模式

码率控制就是决定「每秒钟给视频分配多少 bit」。常见的模式有三种:

  • CBR(恒定码率):码率始终不变。适合带宽稳定的场景,比如电话会议。缺点是画面复杂时质量会下降。
  • VBR(可变码率):码率根据画面复杂度动态变化。简单场景码率低,复杂场景码率高。质量好,但不适合实时传输,因为码率会突然飙升。
  • CRF(恒定质量):你设定一个质量值(比如 23),编码器自动调整码率来保持这个质量。我建议离线转码用这个,实时场景慎用。
我的建议:WebRTC 实时转码,优先用 CBR 或带最大码率限制的 VBR。你想想看,如果码率突然从 1Mbps 跳到 5Mbps,网络瞬间就撑爆了,用户直接卡成 PPT。

3.3 编解码器概念:Opus、VP8/VP9、H264

编解码器(Codec)就是压缩和解压缩的算法。选对编解码器,转码就成功了一半。我见过有人用 H264 传 4K 视频,结果带宽不够,画质还不如 720p。下面我逐个说说。

3.3.1 Opus:音频编解码器的「万金油」

Opus 是 WebRTC 的默认音频编解码器。它最大的特点是:全场景覆盖。从 6 kbps 的窄带语音到 510 kbps 的高保真音乐,它都能搞定。

  • 延迟极低:最低 5ms 的算法延迟,适合实时通话。
  • 动态码率:支持从 6 kbps 到 510 kbps 的码率范围。
  • 采样率自适应:支持 8kHz、16kHz、24kHz、48kHz。
我的经验:在 WebRTC 里,Opus 默认用 20ms 的帧长,延迟和压缩率平衡得最好。如果你做的是音乐类应用,可以试试 10ms 帧长,延迟更低,但码率会高一些。

3.3.2 VP8 与 VP9:Google 的「开源双雄」

VP8 是 WebRTC 的默认视频编解码器,VP9 是它的升级版。两者都是开源的,没有专利费。

特性 VP8 VP9
压缩率 基准 比 VP8 高 30%-50%
计算复杂度 低 高(编码慢 2-3 倍)
硬件支持 广泛 较新设备才支持
适用场景 实时通话、低延迟 高清直播、点播

VP8 的优势是快,编码延迟低,适合实时转码。VP9 的优势是省带宽,同样画质下码率更低。但 VP9 编码很吃 CPU,我建议你只在服务端转码时用 VP9,客户端还是用 VP8 或 H264。

3.3.3 H264:行业「老大哥」

H264 是目前兼容性最好的视频编解码器。几乎所有设备都支持硬件解码,包括手机、电视、浏览器。

  • Profile(档次):Baseline(低延迟)、Main(平衡)、High(高质量)。实时场景用 Baseline 或 Main。
  • Level(级别):限制分辨率、帧率、码率。比如 Level 3.1 支持 720p@30fps,Level 4.0 支持 1080p@30fps。
  • 硬件编码:Intel QSV、NVIDIA NVENC、Apple VideoToolbox 都支持 H264 硬件编码,能大幅降低 CPU 负载。
避坑指南:H264 有专利费问题。如果你做商业产品,尤其是面向欧美市场,记得确认专利授权。我见过一个小团队因为用了 H264 没交专利费,被律师函找上门。VP8 和 VP9 就没有这个问题。

3.4 知识体系总览

下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速索引。

媒体流基础:核心知识体系 音频采样与量化 采样率 (Hz) 量化精度 (bit) Opus 编解码器 视频帧与码率 帧类型 (I/P/B) 码率控制 (CBR/VBR/CRF) VP8 / VP9 / H264 编解码器选择 延迟 兼容性 硬件加速 核心原则 音频:采样率决定带宽,量化精度决定信噪比 视频:帧类型影响延迟,码率控制影响稳定性 编解码器:没有最好的,只有最合适的

这张图把音频、视频、编解码器三个分支拆开了。你可以看到,音频的核心是采样率和量化精度,视频的核心是帧类型和码率控制,而编解码器选择则要综合考虑延迟、兼容性和硬件加速。

嗯,这一章的内容就到这里。记住:基础不牢,地动山摇。搞懂了这些,后面讲转码架构、自适应码率、SVC 分层,你才能听得明白。