Visual LabINTERACTIVE LEARNING
阶段 9 · 原生实践进阶26 分钟

原生音频输出:重采样、环形缓冲与设备回调

Resample、Channel Mix、Ring Buffer 与 Underrun

把解码出的任意音频格式转换为设备格式,用环形缓冲连接解码线程和实时音频回调。

LEARNING GOALS

先明确本课目标

1

理解重采样与声道混音

2

用 Ring Buffer 解耦生产消费

3

避免实时音频线程阻塞和分配

MENTAL MODEL · 再建立心智模型

解码器按媒体节奏生产 PCM,声卡按固定时钟消费 PCM;重采样解决格式差异,环形缓冲吸收短时抖动。

MINIMAL EXAMPLE

为什么音频队列既不能空也不能无限长?

缓冲为空时设备拿不到样本产生 underrun;缓冲过深则用户操作要等很久才能听到。播放器围绕目标水位调节生产速度和延迟。

最小例子cpp
void audioCallback(float* output, int frames) {
  const int read = ringBuffer.read(output, frames);
  if (read < frames) {
    std::fill(output + read * channels,
              output + frames * channels, 0.0f);
    underruns++;
  }
}
  1. 非阻塞读取样本 回调只从预先分配的 Ring Buffer 取数据。
  2. 不足部分补静音 宁可输出零,也不要阻塞等待解码线程。
  3. 记录欠载指标 Underrun 计数帮助调整目标缓冲和线程优先级。

设备时钟持续推进,即使上游短暂抖动也不会让实时回调卡住。

本课概念
OPTIONAL · 按需查阅完整术语表与概念边界

遇到陌生术语时再展开,不打断主线实验。

展开⌄
音视频原理PCM连续声音经过采样与量化后,将每个时刻的幅度编码成数值样本并按时间和声道排列的表示;它通常是未压缩音频数据,不是文件格式、容器或有损 Codec。音视频原理Sample Format音频样本的数值类型和内存布局描述,例如 s16、float、planar 或 interleaved。音视频原理AVFrameFFmpeg 中承载解码后音频样本或视频像素及其格式、时间戳、引用的通用帧对象。音视频原理Ring Buffer用循环读写指针复用固定内存、连接实时音频生产者和消费者的缓冲结构。音视频原理Audio Clock根据音频设备实际已播放样本估算的媒体时钟,常作为播放器同步主时钟。音视频原理Audio Channel一条独立采样和传输的声音信号序列;左、右、中置、环绕和低频效果(LFE)等角色各自对应一个声道。音视频原理Resampling把 PCM 从一个采样率转换到另一个采样率的过程,需使用滤波避免频谱混叠,并可能引入延迟。音视频原理Channel Mixing根据声道角色和混音矩阵,把输入声道重新组合为设备需要的输出布局,例如 5.1 下混为立体声。音视频原理Audio Callback音频设备按固定节奏请求下一块 PCM 的实时回调;代码必须及时、稳定地供数并避免阻塞和动态分配。音视频原理Underrun音频设备需要新样本时缓冲区已经耗尽的状态,通常表现为爆音、静音或播放中断。音视频原理Channel Layout音频声道数量、角色及排列顺序的描述,例如单声道、立体声或 5.1;它比单独的 channels 数字更完整。
LIVE EXPERIMENT · 先获得反馈

边改边运行

浏览器加载后会激活代码编辑器、独立运行环境与实时输出。

本课挑战

实现单生产者单消费者 Ring Buffer,并输出实时 buffer duration。

DEEP DIVE · 实验之后

回到原理,解释刚才发生了什么

先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。

CORE IDEA

核心讲解

01

解码格式未必等于设备格式

媒体可能是 44.1kHz planar float,设备需要 48kHz interleaved int16。重采样器同时处理采样率、格式和声道布局转换。

02

设备回调必须按时交付

实时回调中不应做网络、解码、锁等待或大内存分配。数据不足会 underrun,通常表现为爆音或短暂静音。

OPTIONAL · 迁移时查阅Web 与原生实现对照

主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。

展开⌄
API COMPARISON

Web Audio 隐藏实时线程与设备协商,原生音频要求应用尊重回调期限。

WebGL

AAudio、Core Audio、WASAPI 等提供低延迟回调,应用显式管理 Ring Buffer 与设备格式。

WebGPU

AudioWorklet 在受控音频渲染线程处理固定块,设备格式由浏览器管理。

原生低延迟音频的第一原则是让设备回调只搬运或轻量处理已准备好的样本。