NodeJS WebRTC中RTCAudioSource报byteLength不匹配错误:期望为480
解决RTCAudioSource.onData样本长度必须为480的错误
问题根源
@roamhq/wrtc的RTCAudioSource.onData方法对输入的音频样本长度有严格要求:必须匹配WebRTC标准的20ms音频帧大小。对于你使用的24kHz单声道、16位音频,20ms对应的样本数计算如下:24000 (采样率) * 0.02 (秒) = 480 个Int16样本。你的分块大小不固定(在17-2770之间),所以触发了长度校验报错。
修复方案
需要维护一个临时缓存,将零散的PCM数据累积后,按固定480样本的帧拆分处理,剩余不足一帧的数据留到下次合并新数据后再处理。
完整代码示例
import { nonstandard } from '@roamhq/wrtc'; const source = new nonstandard.RTCAudioSource(); // 缓存不足一帧的样本数据 let pendingSamples = []; function feedAudio(buffer) { // 将输入Buffer转换为Int16Array样本 const newSamples = new Int16Array( buffer.buffer, buffer.byteOffset, buffer.byteLength / Int16Array.BYTES_PER_ELEMENT ); // 合并缓存与新样本 pendingSamples = [...pendingSamples, ...Array.from(newSamples)]; const frameSampleCount = 480; // 24kHz单声道的标准帧样本数 // 循环处理所有完整帧 while (pendingSamples.length >= frameSampleCount) { // 截取一帧样本并转换为Int16Array const frame = new Int16Array(pendingSamples.splice(0, frameSampleCount)); source.onData({ samples: frame, sampleRate: 24000, bitsPerSample: 16, channelCount: 1, }); } } // 使用时传入你的PCM缓冲: // feedAudio(yourPCMBuffer);
额外说明
- 若你后续切换为多声道音频(如立体声),需将
frameSampleCount乘以声道数(比如24kHz立体声对应960样本),同时同步修改channelCount参数。 - 你的原始PCM格式(24kHz、16位有符号小端)是正确的,这也是它能通过WAV或WebSocket正常播放的原因,问题仅出在WebRTC的帧长度要求上。
内容的提问来源于stack exchange,提问作者Royi Bernthal
相关产品推荐
相关产品推荐

