Pion WebRTC中TrackRemote对应空RemoteOutboundRTPStreamStats、OutboundRTPStreamStats、RemoteInboundRTPStreamStats问题咨询
你好,针对你遇到的Pion WebRTC里TrackRemote对应统计数据为空的问题,结合你给出的浏览器发视频给Pion广播端的场景,我整理了几个可能的原因和解决思路:
统计数据还没到可收集的时机
WebRTC的各类统计数据不是一开始就有的,得等ICE连接稳定、媒体流真正开始传输后才会生成。如果是刚创建PeerConnection或者刚触发OnTrack回调就去查统计,大概率是空的。你可以试试在ICE连接状态变为connected之后(通过监听PeerConnection.OnICEConnectionStateChange),或者等媒体流传输个几秒钟再去获取统计数据。Interceptor配置没到位
你提到了要创建InterceptorRegistry,但代码没写完。Pion的统计功能依赖StatsInterceptor,如果没正确注册这个拦截器,就没法收集到对应的RTP统计。正确的配置方式应该是这样:
// 创建InterceptorRegistry并添加StatsInterceptor interceptorRegistry := webrtc.NewInterceptorRegistry() statsInterceptor, err := webrtc.NewStatsInterceptor() if err != nil { panic(err) } interceptorRegistry.Add(statsInterceptor) // 创建API时传入MediaEngine和InterceptorRegistry api := webrtc.NewAPI(webrtc.WithMediaEngine(mediaEngine), webrtc.WithInterceptorRegistry(interceptorRegistry)) // 用这个API创建PeerConnection peerConnection, err := api.NewPeerConnection(peerConnectionConfig)
搞混了收发端的统计类型
你要注意,Pion这边是接收浏览器发来的视频,属于接收端,所以OutboundRTPStreamStats为空是正常的——因为Pion没有发送这个Track的媒体数据,只有浏览器作为发送端才会有Outbound相关统计。另外RemoteOutboundRTPStreamStats是对端(浏览器)的发送统计,RemoteInboundRTPStreamStats是对端的接收统计,这些数据需要ICE连接完全建立、媒体流传输一段时间后才会同步过来,而且得通过正确的方式查询。统计查询方式不对
不要直接从TrackRemote上硬找统计数据,正确的做法是调用PeerConnection.GetStats()来统一获取,然后根据TrackID筛选对应的统计项:
stats, err := peerConnection.GetStats() if err != nil { panic(err) } for _, report := range stats { switch report.Type { case webrtc.TypeInboundRTPStream: inboundStats := report.(webrtc.InboundRTPStreamStats) if inboundStats.TrackID == track.ID() { // 这里可以拿到Pion作为接收端的统计,比如已接收字节数 fmt.Printf("已接收字节数:%d\n", inboundStats.BytesReceived) } case webrtc.TypeRemoteOutboundRTPStream: remoteOutboundStats := report.(webrtc.RemoteOutboundRTPStreamStats) if remoteOutboundStats.TrackID == track.ID() { // 这里拿到浏览器作为发送端的统计,比如已发送字节数 fmt.Printf("对端已发送字节数:%d\n", remoteOutboundStats.BytesSent) } } }
备注:内容来源于stack exchange,提问作者LST

