1、音视频基础概念

在深入 Android 音视频采集与编解码之前,我们必须先建立一套通用的“语言”体系。音视频的本质是数字信号对模拟世界的模拟,而采样率、位深、帧率、码率等参数,正是描述这种模拟精度的标尺。本章将逐一拆解这些核心概念,并重点剖析色彩空间与 YUV/RGB 的转换逻辑,这是后续开发中理解 Camera 数据与编码器输入的关键。

1.1 音频基础三要素

音频数字化过程可以概括为:采样 → 量化 → 编码。其中采样率、位深、声道决定了原始音频数据量的大小与质量。

概念 定义 常见值 对质量的影响
采样率 (Sample Rate) 每秒从连续信号中提取并组成离散信号的采样次数,单位 Hz。 8000Hz (电话)、44100Hz (CD)、48000Hz (视频) 决定频率上限(奈奎斯特采样定理:采样率需 ≥ 2倍信号最高频率)。采样率越高,高频还原越好。
位深 (Bit Depth) 每个采样点用多少比特来表示其振幅大小。 8bit、16bit、24bit、32bit float 决定动态范围与信噪比。16bit 可表示 65536 个振幅等级,每增加 1bit,信噪比提升约 6dB。
声道 (Channels) 独立音频信号的数量,用于模拟空间感。 1 (Mono)、2 (Stereo)、5.1、7.1 声道数越多,空间定位越丰富,但数据量成倍增加。

原始音频数据量计算公式:

数据量 (Byte/s) = 采样率 (Hz) × 位深 (bit) ÷ 8 × 声道数

例如:CD 音质 (44100Hz, 16bit, Stereo) 每秒数据量为:
44100 × 16 ÷ 8 × 2 = 176,400 Bytes/s ≈ 172 KB/s

1.2 视频基础四要素

视频本质上是快速连续播放的静态图像序列。其核心参数决定了视觉清晰度与流畅度。

概念 定义 常见值 对质量的影响
分辨率 (Resolution) 一帧图像中包含的像素总数,通常表示为 宽×高。 640×480 (VGA)、1920×1080 (Full HD)、3840×2160 (4K) 决定图像细节的丰富程度。分辨率越高,画面越清晰,但数据量呈平方级增长。
帧率 (Frame Rate / FPS) 每秒显示的帧数。 24fps (电影)、30fps (视频)、60fps (高帧率) 决定运动流畅度。帧率越高,运动画面越平滑,拖影越少。
码率 (Bit Rate) 单位时间内用于表示视频数据的比特数,单位 bps (bit per second)。 1~2 Mbps (720p)、5~10 Mbps (1080p)、20~50 Mbps (4K) 决定压缩后的画质保真度。码率越高,画质损失越小,但文件体积越大。
色彩空间 (Color Space) 描述颜色在数字设备中如何被表示和映射的数学模型。 BT.601 (标清)、BT.709 (高清)、BT.2020 (超高清) 决定了色域范围与色彩还原的准确性。不同色彩空间下,相同的 RGB 值会呈现不同的颜色。

原始视频数据量计算公式(以 RGB24 为例):

数据量 (Byte/s) = 宽 × 高 × 3 (字节/像素) × 帧率

例如:1080p (1920×1080) 30fps 的原始 RGB 数据量为:
1920 × 1080 × 3 × 30 ≈ 186,624,000 Bytes/s ≈ 178 MB/s

如此巨大的数据量必须经过压缩(编码)才能存储和传输,而码率正是衡量压缩后数据量的关键指标。

1.3 色彩空间与 YUV/RGB

在 Android 音视频开发中,YUV 色彩空间 是绕不开的核心概念。几乎所有 Camera 原始数据、视频编码器的输入、解码器的输出,都采用 YUV 格式。理解 YUV 是理解视频压缩的第一步。

1.3.1 RGB 与 YUV 的本质区别

  • RGB:面向显示设备。用红 (R)、绿 (G)、蓝 (B) 三个分量直接混合出所有颜色。每个分量占用相同的带宽,数据量大。
  • YUV:面向人眼视觉与压缩。将亮度信息 (Y) 与色度信息 (U/V) 分离。人眼对亮度变化敏感,对色度变化不敏感。因此可以对 U/V 分量进行色度子采样,大幅降低数据量,而人眼几乎察觉不到画质下降。

1.3.2 常见的 YUV 采样格式

采样格式用“J:a:b”表示,描述了 Y、U、V 分量的采样比例。最常用的三种:

格式 描述 每 4 个像素的 Y/U/V 样本数 数据量对比 (相对于 RGB24) 典型应用
YUV 4:4:4 每个像素都有独立的 Y、U、V 分量,无压缩。 4Y : 4U : 4V 100% (与 RGB24 相同) 专业影视后期、高质量图像处理
YUV 4:2:2 水平方向上每 2 个像素共享一组 U/V。 4Y : 2U : 2V 66.7% 广播级视频、高端采集卡
YUV 4:2:0 水平与垂直方向上每 2×2 像素块共享一组 U/V。 4Y : 1U : 1V 50% Android Camera、H.264/H.265 编码、JPEG

重点: 在 Android 开发中,Camera2 API 输出的 ImageFormat.YUV_420_888 以及 MediaCodec 编码器接受的输入格式,绝大多数都是 YUV 4:2:0 的变体(如 NV12、NV21、I420)。

1.3.3 YUV 数据在内存中的排列方式 (以 4:2:0 为例)

YUV 4:2:0 在内存中有多种排列方式,Android 中最常见的是 NV21NV12(属于 Semi-Planar 半平面模式)以及 I420(属于 Planar 平面模式)。

  • I420 (YUV420P):三个平面完全分离。先存储所有 Y 数据,再存储所有 U 数据,最后存储所有 V 数据。
    内存布局:[Y1, Y2, Y3, ...] [U1, U2, ...] [V1, V2, ...]
  • NV12 (YUV420SP):Y 平面单独存储,U 和 V 交错存储在一个平面中,顺序为 UVUV...
    内存布局:[Y1, Y2, Y3, ...] [U1, V1, U2, V2, ...]
  • NV21 (YUV420SP):与 NV12 类似,但 U 和 V 交错顺序为 VUVU...
    内存布局:[Y1, Y2, Y3, ...] [V1, U1, V2, U2, ...]

Android 历史遗留问题: 早期的 Android Camera 默认输出 NV21 格式。虽然现在 Camera2 推荐使用 YUV_420_888(一种灵活的抽象格式),但底层硬件通常仍以 NV12 或 NV21 输出。理解这些布局对于编写高效的 RenderScriptOpenGL ES 转换代码至关重要。

1.3.4 YUV 与 RGB 的转换公式 (BT.601 标准)

在 Android 中,当你需要将 YUV 数据渲染到 SurfaceView 或进行图像处理时,通常需要转换为 RGB。以下为 BT.601 标准下,YUV 与 RGB 的线性转换公式(范围 0-255):

YUV → RGB (用于解码/显示):

R = Y + 1.402 * (V - 128)
G = Y - 0.344 * (U - 128) - 0.714 * (V - 128)
B = Y + 1.772 * (U - 128)

RGB → YUV (用于编码):

Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.169 * R - 0.331 * G + 0.500 * B + 128
V = 0.500 * R - 0.419 * G - 0.081 * B + 128

开发提示: 在实际 Android 开发中,应优先使用 ColorMatrixRenderScriptOpenGL Shader 进行转换,避免在 Java/Kotlin 层逐像素循环,否则会导致严重的性能瓶颈。后续章节会详细讲解如何利用 GPU 加速这一过程。

1.4 本章小结

  • 音频:采样率决定频宽,位深决定动态范围,声道决定空间感。原始数据量 = 采样率 × 位深 × 声道数。
  • 视频:分辨率决定清晰度,帧率决定流畅度,码率决定压缩后的画质。原始数据量巨大,必须编码压缩。
  • YUV:利用人眼对色度不敏感的特性,通过色度子采样(尤其是 4:2:0)将数据量压缩至 RGB 的一半,是视频编码的基础。
  • 内存布局:Android 中 YUV 420 的常见变体为 NV21 (旧)、NV12 (新) 和 I420,理解其排列是操作 Camera 数据的前提。

掌握这些基础概念后,下一章我们将正式进入 Android 平台,学习如何利用 Camera2 API 采集这些 YUV 数据。