// Display the video codec that is actually used. IEnumerator CheckActualCodec() { yield return(new WaitForSeconds(1f)); var op = _pc1.GetStats(); yield return(op); if (op.IsError) { Debug.LogErrorFormat("RTCPeerConnection.GetStats failed: {0}", op.Error); yield break; } RTCStatsReport report = op.Value; IEnumerable <RTCOutboundRTPStreamStats> outBoundStatsList = report.Stats.Values.Where( stats => stats.Type == RTCStatsType.OutboundRtp).Cast <RTCOutboundRTPStreamStats>(); RTCOutboundRTPStreamStats outBoundStats = outBoundStatsList.First(stats => stats.kind == "video"); string codecId = outBoundStats.codecId; IEnumerable <RTCCodecStats> codecStatsList = report.Stats.Values.Where( stats => stats.Type == RTCStatsType.Codec).Cast <RTCCodecStats>(); RTCCodecStats codecStats = codecStatsList.First(stats => stats.Id == codecId); var arr = outBoundStatsList.ToArray(); var arr2 = codecStatsList.ToArray(); Debug.Log(arr); Debug.Log(arr2); //foreach (var s in report.Stats.Values.Where(stats => stats is RTCCodecStats)) //{ // var s2 = s as RTCCodecStats; // Debug.Log(s2.Type + " " + s2.Id); //} actualCodecText.text = string.Format("Using {0} {1}, payloadType={2}.", codecStats.mimeType, codecStats.sdpFmtpLine, codecStats.payloadType ); }
public void AddInput(RTCOutboundRTPStreamStats input) { var timestamp = input.UtcTimeStamp; firCountGraph.AddInput(timestamp, input.firCount); pliCountGraph.AddInput(timestamp, input.pliCount); nackCountGraph.AddInput(timestamp, input.nackCount); qpSumGraph.AddInput(timestamp, input.qpSum); packetsSentGraph.AddInput(timestamp, input.packetsSent); retransmittedPacketsSentGraph.AddInput(timestamp, input.retransmittedPacketsSent); bytesSentGraph.AddInput(timestamp, input.bytesSent); headerBytesSentGraph.AddInput(timestamp, input.headerBytesSent); retransmittedBytesSentGraph.AddInput(timestamp, input.retransmittedBytesSent); targetBitrateGraph.AddInput(timestamp, (float)input.targetBitrate); framesDecodedGraph.AddInput(timestamp, input.framesEncoded); keyFramesDecodedGraph.AddInput(timestamp, input.keyFramesEncoded); totalEncodeTimeGraph.AddInput(timestamp, (float)input.totalEncodeTime); totalEncodedBytesTargetGraph.AddInput(timestamp, input.totalEncodedBytesTarget); totalPacketSendDelayGraph.AddInput(timestamp, (float)input.totalPacketSendDelay); }
// Display the video codec that is actually used. IEnumerator CheckActualCodec() { yield return(new WaitForSeconds(1f)); if (_pc1 == null) { yield break; } var op = _pc1.GetStats(); yield return(op); if (op.IsError) { Debug.LogErrorFormat("RTCPeerConnection.GetStats failed: {0}", op.Error); yield break; } RTCStatsReport report = op.Value; List <RTCOutboundRTPStreamStats> outBoundStatsList = report.Stats.Values.Where( stats => stats.Type == RTCStatsType.OutboundRtp).Cast <RTCOutboundRTPStreamStats>().ToList(); if (!outBoundStatsList.Any()) { Debug.LogWarning($"{nameof(RTCStatsReport)} don't contain any {nameof(RTCOutboundRTPStreamStats)}"); yield break; } RTCOutboundRTPStreamStats outBoundStats = outBoundStatsList.FirstOrDefault(stats => stats.kind == "video"); if (outBoundStats == null) { Debug.LogWarning($"{nameof(RTCOutboundRTPStreamStats)} with kind video is not included in {nameof(outBoundStatsList)}."); yield break; } string codecId = outBoundStats.codecId; List <RTCCodecStats> codecStatsList = report.Stats.Values.Where( stats => stats.Type == RTCStatsType.Codec).Cast <RTCCodecStats>().ToList(); if (!codecStatsList.Any()) { Debug.LogWarning($"{nameof(RTCOutboundRTPStreamStats)} don't contain any {nameof(RTCCodecStats)}"); yield break; } RTCCodecStats codecStats = codecStatsList.FirstOrDefault(stats => stats.Id == codecId); if (codecStats == null) { Debug.LogWarning($"{nameof(RTCCodecStats)} with codecId {codecId} is not included in {nameof(codecStatsList)}."); yield break; } actualCodecText.text = string.Format("Using {0} {1}, payloadType={2}.", codecStats.mimeType, codecStats.sdpFmtpLine, codecStats.payloadType ); }