如何在WebRTC中检测远端对等方是否已禁用媒体轨道
问题原因
你碰到的mute/unmute事件不触发是正常现象:当调用RTCRtpSender.replaceTrack(null)时,浏览器默认会持续发送静音音频帧/黑屏视频帧,而非真正停止对应SSRC的RTP包传输,因此接收端的MediaStreamTrack不会被标记为 muted 状态,对应的事件自然不会触发。
无需信令的原生检测方案
有两种成熟的原生实现方案可以实现检测:
方案1:轮询
RTCPeerConnection的统计数据
定期调用对应RTCRtpReceiver或者RTCPeerConnection的getStats()方法,检查inbound-rtp类型的统计项:- 视频轨道可以监控
framesReceived、framesDecoded字段,如果字段数值在1~2秒内没有增长,即可判定为对端暂停发送,数值重新增长即为恢复发送 - 音频轨道可以监控
totalSamplesReceived、audioLevel字段,规则和视频轨道一致
该方案实现简单、性能开销极低,仅需设置500ms~1s的轮询间隔即可满足普通场景的延迟要求。
- 视频轨道可以监控
方案2:实时分析音视频帧内容
- 音频场景:将接收的音频轨道接入Web Audio API的
AnalyserNode,实时检测音频输出的音量大小,持续低于静音阈值即可判定为暂停发送 - 视频场景:将接收的视频轨道渲染到离屏
Canvas,定期采样帧的像素值,如果持续多帧均为黑屏/固定纯色,即可判定为暂停发送
该方案检测延迟更低、判定更精准,但是实现复杂度更高,性能开销比统计轮询方案更大。
- 音频场景:将接收的音频轨道接入Web Audio API的
补充说明
如果你要强制触发接收端的mute事件,可以在调用replaceTrack(null)之后,额外调用RTCRtpSender.setParameters()将编码的active属性设为false,此时发送端会停止发送对应SSRC的RTP包,接收端超时后就会触发mute事件,恢复时将active改回true即可触发unmute事件。
内容的提问来源于stack exchange,提问作者Nathan Xabedi
相关产品推荐
相关产品推荐

