You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:23:24