
如上图所示,安卓音频开发中数据经历两个阶段的变化:
1. 采集阶段:PCM 原始数据
通过 AudioRecord 从麦克风采集,得到的是 PCM (Pulse Code Modulation) 裸数据——未经任何压缩的原始采样值。
PCM 本身不是文件格式,而是一串原始二进制数据,它的"元数据"就是 AudioFormat 中配置的三个核心参数:
每秒数据量 = 采样率 × 声道数 × 每样本字节数
例如 44100 Hz / 16-bit / Stereo → 每秒 176400 字节 ≈ 1.4 Mbps,数据量非常大。
PCM 可以直接写入 .pcm 文件或 .wav 文件(WAV = PCM + 44字节文件头)。
2. 编码阶段:压缩码流
PCM 送入 MediaCodec 编码器后,输出的是压缩音频码流,格式取决于选择的编码器:
AAC 码流的两种封装形式
这是最常遇到的区分:
裸 AAC (Raw / LATM) — 仅含压缩音频数据,无帧头。需要外部信息告知采样率等参数。
MediaCodec直接输出的默认就是这个。ADTS (Audio Data Transport Stream) — 每个 AAC 帧前加 7字节头,包含采样率、声道、帧长度等信息。可以独立解析,适合网络传输或直接写入
.aac文件。
在 Android 中通过 MediaCodec 编码 AAC 时,默认输出裸帧,如果需要 ADTS 格式需要手动在每个帧前拼接 7 字节头(或设置 KEY_AAC_PROFILE 让编码器自动加)。
3. 封装阶段:容器格式
压缩码流本身不能直接作为音频文件播放,需要通过 MediaMuxer 封装到容器中:
完整管线
麦克风 (模拟信号)
→ 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 完全对称。