如何在Firefox中通过getStats() API获取AudioLevel和Codec值?
在Firefox中获取WebRTC的Codec和AudioLevel统计信息
我懂你现在的困扰——Firefox的WebRTC Stats API和Chrome确实有不少细节差异,尤其是Codec和AudioLevel的获取方式,下面分两部分给你讲清楚怎么搞定:
一、获取AudioLevel(音频电平)
Firefox里的音频电平数据并不在outbound_rtcp这类常规RTP统计项里,而是存放在**media-source类型**的统计对象中(针对本地音频轨道)。你需要遍历统计结果,筛选出类型为media-source且关联目标音频轨道的项,里面的audioLevel字段就是当前的音频电平值(范围0-1)。
二、获取Codec信息
Firefox把Codec信息单独放在**rtp-codec类型**的统计对象里,每个Codec项会包含payloadType、mimeType(比如audio/opus)等关键信息。要关联到具体的流,你需要把rtp-codec的id和inbound-rtp/outbound-rtp项里的codecId对应起来,这样就能知道某个RTP流用的是什么编码。
完整代码示例
替换你原来的循环逻辑,改成这样就能拿到想要的数据:
cs.pc.getStats(cs.pc.getLocalStreams()[0].getAudioTracks()[0], function (results) { // 存储Codec信息,方便后续关联到具体流 const codecsMap = new Map(); for (const key in results) { if (!results.hasOwnProperty(key)) continue; const statItem = results[key]; // 1. 收集Codec详细信息 if (statItem.type === 'rtp-codec') { codecsMap.set(statItem.id, { mimeType: statItem.mimeType, payloadType: statItem.payloadType, clockRate: statItem.clockRate }); console.log(`找到Codec: ${statItem.mimeType}, 负载类型: ${statItem.payloadType}`); } // 2. 获取本地音频电平 if (statItem.type === 'media-source' && statItem.kind === 'audio') { console.log(`当前本地音频电平: ${statItem.audioLevel}`); } // 3. 关联RTP流与对应的Codec(可选,按需使用) if (statItem.type === 'outbound-rtp' && statItem.kind === 'audio') { const matchedCodec = codecsMap.get(statItem.codecId); if (matchedCodec) { console.log(`当前发送的音频流使用Codec: ${matchedCodec.mimeType}`); } } // 保留你原来的其他统计项逻辑(比如Jitter、包数等) if (statItem.type === 'outbound-rtp') { console.log(`Jitter: ${statItem.jitter}, 已发送包数: ${statItem.packetsSent}`); } if (statItem.type === 'inbound-rtp') { console.log(`已接收包数: ${statItem.packetsReceived}`); } } });
关键注意点
- Firefox的Stats类型命名用短横线分隔(比如
media-source),而Chrome用驼峰命名(比如mediaSource),这是两者最直观的区别。 - 若要获取远端音频电平,需要查看
remote-inbound-rtp类型项里的audioLevel字段,不过这依赖远端的统计反馈支持。 - Codec的
mimeType会直接显示编码格式,比如audio/opus、audio/PCMU,足够判断当前使用的音频编码。
内容的提问来源于stack exchange,提问作者Cherry
相关产品推荐
相关产品推荐

