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

如何在Peer.js中使用sdpTransform修改SDP启用DTX优化音频延迟

Peer.js 启用DTX Audio及低延迟调优方案

SDP修改实现(含DTX启用)

Peer.js 原生提供sdpTransform配置项,可直接在呼叫、接听流程中拦截并修改SDP,不需要手动操作底层RTCPeerConnection实例。
DTX是Opus编码的内置特性,需要在SDP的Opus编码参数中追加usedtx=1标记开启,同时可搭配前向纠错、比特率限制进一步降低带宽占用。
可直接复用的SDP处理函数:

function applyLowLatencySdp(sdp) {
  let sdpContent = sdp;
  // 匹配Opus编码的参数行
  const opusParamRegex = /a=fmtp:(\d+) ([^\r\n]+)/g;
  let matchRes;
  while ((matchRes = opusParamRegex.exec(sdpContent)) !== null) {
    const pt = matchRes[1];
    const originParams = matchRes[2];
    // 避免重复追加参数
    if (!originParams.includes('usedtx=1')) {
      const updatedParams = `${originParams};usedtx=1;useinbandfec=1;maxaveragebitrate=24000;stereo=0;sprop-stereo=0`;
      sdpContent = sdpContent.replace(matchRes[0], `a=fmtp:${pt} ${updatedParams}`);
    }
  }
  // 强制设置Opus打包时长为20ms,降低打包缓冲延迟
  if (!sdpContent.includes('a=ptime:20')) {
    sdpContent = sdpContent.replace(/m=audio ([^\r\n]+)/g, (match) => {
      return `${match}\r\na=ptime:20`;
    });
  }
  return sdpContent;
}

将SDP处理逻辑挂载到呼叫、接听流程中,替换原有代码中的对应部分:

  1. 接听侧修改(listen函数内)
// 原代码 call.answer(stream); 替换为
call.answer(stream, {
  sdpTransform: applyLowLatencySdp
});
  1. 呼叫发起侧修改(startCall函数内)
// 原代码 const call = peer.call(otherUserId, stream); 替换为
const call = peer.call(otherUserId, stream, {
  sdpTransform: applyLowLatencySdp,
  config: {
    bundlePolicy: 'max-bundle',
    iceCandidatePoolSize: 0
  }
});

如果使用的是低于1.4版本的Peer.js无sdpTransform支持,可以在拿到call实例后,监听底层peerConnection的signalingstatechange事件,在setLocalDescription前拦截修改SDP即可,优先升级版本用官方钩子稳定性更高。

audioConstraints 参数调优

原有参数中存在部分兼容性差、反而会提升延迟的配置,调优后参数如下,兼顾语音质量和低延迟:

const audioConstraints = {
  channelCount: 1,
  sampleRate: 16000,
  latency: 0.02, // 20ms为WebRTC语音标准帧长,兼容性远好于0.003的激进配置,不会触发浏览器回退到高延迟缓冲
  echoCancellation: true,
  noiseSuppression: true,
  autoGainControl: true,
  echoCancellationType: 'system', // 优先使用系统级回声消除,比软件处理延迟更低
  googDtx: true, // 安卓WebView/Chrome原生DTX开关,和SDP配置配合生效
  googCpuOveruseDetection: true, // 开启CPU过载检测,避免性能不足导致的编码堆积延迟
  googHighpassFilter: true // 过滤低频无效噪音,减少待传输数据量
};
// 移除原有配置中的sampleSize、volume字段:sampleSize手动指定8位会触发额外转码延迟,volume字段已被主流浏览器废弃无实际作用
const constraints = { audio: audioConstraints, video: false };

额外降延迟注意点

  • 不要在本地/远端音频流上挂载任何Web Audio处理节点,所有额外音频处理都会引入至少20ms的缓冲延迟
  • 安卓端WebView必须开启硬件加速,否则音频渲染层会增加数百毫秒的缓冲
  • 测试时关闭其他占用带宽的应用,弱网下如果需要进一步降延迟,可以把SDP中Opus的maxaveragebitrate下调到16000,人声清晰度依然可以满足通话需求

内容的提问来源于stack exchange,提问作者Sujith S Manjavana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:36:20