如何从react-native-audio-record返回的原始字节中解码出PCM样本?
解答
你当前从回调中拿到的chunk本身就是符合你初始化配置的裸PCM数据流,没有WAV头不影响PCM数据本身的格式,不需要额外做解码操作,只需要按照你配置的采样参数将二进制Buffer解析为可读取的采样值数组即可。
你初始化时配置的是bitsPerSample: 16、channels: 1,对应PCM格式为16位有符号小端整数单声道流,可按如下代码解析:
AudioRecord.on('data', data => { const chunk = Buffer.from(data, 'base64'); // 16位采样每个采样点占2字节,数组长度为总字节长度/2 const pcmSamples = new Int16Array(chunk.length / 2); // 按小端序逐位读取16位整型采样值 for (let i = 0; i < pcmSamples.length; i++) { pcmSamples[i] = chunk.readInt16LE(i * 2); } // 拿到的pcmSamples是取值范围在-32768~32767的采样数组,可直接用于可视化计算 // 示例:计算当前音频块的平均幅值,可作为波形/音量展示的依据 const averageAmplitude = pcmSamples.reduce((sum, val) => sum + Math.abs(val), 0) / pcmSamples.length; // 如需归一化到0-1区间,将采样值除以32768即可 });
注意事项
- 如果你修改配置为
bitsPerSample: 8,则将读取方法替换为readInt8,用Int8Array存储采样值即可 - 如果配置了多声道(
channels > 1),采样值按声道交替存储,例如双声道存储顺序为左声道采样1、右声道采样1、左声道采样2、右声道采样2,需要自行按顺序拆分不同声道的采样值 - 如果你需要把实时PCM拼接成完整WAV文件,才需要手动在流开头补充对应格式的WAV头,仅做可视化不需要该操作
内容的提问来源于stack exchange,提问作者Anathapindika
相关产品推荐
相关产品推荐

