Administrator
发布于 2026-08-14 / 43 阅读
0
0

安卓音视频开发中,音频采集的原数据是什么格式,经过编码后的数据又是什么格式

如上图所示,安卓音频开发中数据经历两个阶段的变化:

1. 采集阶段:PCM 原始数据

通过 AudioRecord 从麦克风采集,得到的是 PCM (Pulse Code Modulation) 裸数据——未经任何压缩的原始采样值。

PCM 本身不是文件格式,而是一串原始二进制数据,它的"元数据"就是 AudioFormat 中配置的三个核心参数:

参数

说明

常见值

采样率 (sampleRate)

每秒采样次数

44100 Hz (CD音质)、48000 Hz

声道数 (channelCount)

单声道还是立体声

1 (MONO)、2 (STEREO)

量化位深 (encoding)

每个采样用多少 bit 表示

ENCODING_PCM_16BIT (最常用)、ENCODING_PCM_8BIT、ENCODING_PCM_FLOAT

每秒数据量 = 采样率 × 声道数 × 每样本字节数

例如 44100 Hz / 16-bit / Stereo → 每秒 176400 字节 ≈ 1.4 Mbps,数据量非常大。

PCM 可以直接写入 .pcm 文件或 .wav 文件(WAV = PCM + 44字节文件头)。

2. 编码阶段:压缩码流

PCM 送入 MediaCodec 编码器后,输出的是压缩音频码流,格式取决于选择的编码器:

编码器

MIME type

输出帧格式

说明

AAC

audio/mp4a-latm

AAC 帧 (1024 samples/帧)

安卓最常用,音质好、兼容性高

Opus

audio/opus

Opus 帧 (20ms/帧)

低延迟,实时通话首选

MP3

audio/mpeg

MP3 帧

兼容性好但安卓编码支持有限

AAC 码流的两种封装形式

这是最常遇到的区分:

  • 裸 AAC (Raw / LATM) — 仅含压缩音频数据,无帧头。需要外部信息告知采样率等参数。MediaCodec 直接输出的默认就是这个。

  • ADTS (Audio Data Transport Stream) — 每个 AAC 帧前加 7字节头,包含采样率、声道、帧长度等信息。可以独立解析,适合网络传输或直接写入 .aac 文件。

在 Android 中通过 MediaCodec 编码 AAC 时,默认输出裸帧,如果需要 ADTS 格式需要手动在每个帧前拼接 7 字节头(或设置 KEY_AAC_PROFILE 让编码器自动加)。

3. 封装阶段:容器格式

压缩码流本身不能直接作为音频文件播放,需要通过 MediaMuxer 封装到容器中:

容器

扩展名

内部编码

用途

MP4/M4A

.m4a .mp4

AAC

通用音频文件

ADTS

.aac

AAC

裸 AAC 流,可直接播放

Ogg

.ogg

Opus

Opus 标准容器

Matroska

.mkv

任意

通常与视频一起

完整管线

麦克风 (模拟信号)
  → ADC 模数转换
    → PCM 原始数据 (未压缩, ~1.4 Mbps)
      → MediaCodec 编码器 (AAC/Opus)
        → 压缩码流 (~128 Kbps, 压缩比 ~10:1)
          → MediaMuxer 封装
            → .m4a / .aac / .ogg 文件

对应 Android API 链路:AudioRecord → MediaCodec (encoder) → MediaMuxer,与视频侧的 ImageReader → MediaCodec → MediaMuxer 完全对称。


评论