Pion WebRTC中调用peerConnection.GetStats()无法获取InboundRTPStreamStats
问题描述
我正尝试为我的WebRTC应用获取接收字节数、丢包率、延迟等通用统计数据,为此编写了如下函数以验证是否能访问该信息:
func getInboundRTPStreamStats(peerConnection *webrtc.PeerConnection) { stats := peerConnection.GetStats() for k, stat := range stats { log.Infof("Stats %v :: %v\n", k, stats) if inboundStat, ok := stat.(webrtc.InboundRTPStreamStats); ok { log.Infof("Bytes Received: %d, Packets Lost: %d\n", inboundStat.BytesReceived, inboundStat.PacketsLost) } } }
我将该函数放在peerConnection.OnTrack中执行:
peerConnection.OnTrack(func(t *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) { // ... go func() { for { time.Sleep(1 * time.Second) getInboundRTPStreamStats(peerConnection) } }() // ... }
尽管能获取到部分统计数据,但始终无法得到webrtc.InboundRTPStreamStats,想请教可能的问题原因是什么?我尝试调用peerConnection.GetStats(),预期能获取到InboundRTPStreamStats,但实际并未成功,不确定具体原因。
可能的原因及解决办法
统计数据类型匹配偏差
不同WebRTC Go库的统计结构可能存在差异,InboundRTPStreamStats可能被归类到其他相似类型下,或者需要从特定对象获取。先打印所有统计项的具体类型,确认是否有遗漏的入站统计类型:for k, stat := range stats { log.Infof("Stat key: %v, Type: %T\n", k, stat) }未处理
GetStats()的异步特性
部分WebRTC Go实现中,GetStats()是异步操作,同步调用可能无法实时获取到入流统计。检查库文档是否需要用异步回调方式获取:peerConnection.GetStats(func(stats webrtc.Stats) { // 在此回调中处理统计数据 })流未完全建立就触发统计获取
OnTrack触发仅代表轨道已添加,但RTP流可能还未完全建立(如ICE连接未完成、媒体流未开始传输)。可以先检查ICE连接状态,或者延长初始延迟,确保流稳定传输后再获取统计。库版本或实现的差异
以pion/webrtc为例,不同版本对统计的暴露方式可能变化。入站RTP统计可能需要通过RTPReceiver的GetStats()方法获取,而非直接从PeerConnection获取:// 在OnTrack回调中使用receiver获取统计 receiverStats := receiver.GetStats() for k, stat := range receiverStats { if inboundStat, ok := stat.(webrtc.InboundRTPStreamStats); ok { log.Infof("Bytes Received: %d, Packets Lost: %d\n", inboundStat.BytesReceived, inboundStat.PacketsLost) } }
内容的提问来源于stack exchange,提问作者Asif Mammadov
相关产品推荐
相关产品推荐

