Android WebRTC-getStats()没有提供足够的信息

时间:2019-05-06 12:39:34

标签: android webrtc mediastream webrtc-android

我正在尝试获取与媒体流有关的所有信息,以提高通话质量。 Peerconnection.getStats()方法已弃用,但根据我的要求提供了所有信息,例如“ bytesReceived”,“ packetsLost”,“ packetsReceived”,“ googCodecName”和“ googJitterBufferMs”。

peerConnection.getStats(reports -> {
   for (StatsReport report : reports) {
      Log.d(TAG, "Stats: " + report.toString());
   }
}, null);

Response:

{
values: [
    bytesReceived: 951618
  ],
  [
    codecImplementationName: OMX.qcom.video.decoder.vp8
  ],
  [
    framesDecoded: 171
  ],
  [
    mediaType: video
  ],
  [
    packetsLost: 4
  ],
  [
    packetsReceived: 908
  ],
  [
    qpSum: 6409
  ],
  [
    ssrc: 3637617127
  ],
  [
    transportId: Channel-audio-1
  ],
  [
    googCaptureStartNtpTimeMs: 3766113175824
  ],
  [
    googCodecName: VP8
  ],
  [
    googContentType: realtime
  ],
  [
    googCurrentDelayMs: 196
  ],
  [
    googDecodeMs: 54
  ],
  [
    googFirsSent: 0
  ],
  [
    googFirstFrameReceivedToDecodedMs: 225
  ],
  [
    googFrameHeightReceived: 720
  ],
  [
    googFrameRateDecoded: 22
  ],
  [
    googFrameRateOutput: 22
  ],
  [
    googFrameRateReceived: 20
  ],
  [
    googFrameWidthReceived: 960
  ],
  [
    googInterframeDelayMax: 55
  ],
  [
    googJitterBufferMs: 116
  ],
  [
    googMaxDecodeMs: 70
  ],
  [
    googMinPlayoutDelayMs: 91
  ],
  [
    googNacksSent: 6
  ],
  [
    googPlisSent: 0
  ],
  [
    googRenderDelayMs: 10
  ],
  [
    googTargetDelayMs: 196
  ],
  [
    googTrackId: 100
  ]
}

现在我不能使用此方法,因为它已过时。当我尝试使用新的getStats()方法时,它没有提供所有此类信息,并且响应也非常无组织。

peerConnection.getStats(new RTCStatsCollectorCallback() {
          @Override
          public void onStatsDelivered(RTCStatsReport rtcStatsReport) {
                 Log.d(TAG, "RTCStatsReport: "+rtcStatsReport.getStatsMap().toString());
          }
});

Response:-

    {
  RTCCodec_audio_Inbound_0={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_0,
    payloadType: 0,
    mimeType: "audio/PCMU",
    clockRate: 8000
  },
  RTCCodec_audio_Inbound_102={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_102,
    payloadType: 102,
    mimeType: "audio/ILBC",
    clockRate: 8000
  },
  RTCCodec_audio_Inbound_103={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_103,
    payloadType: 103,
    mimeType: "audio/ISAC",
    clockRate: 16000
  },
  RTCCodec_audio_Inbound_105={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_105,
    payloadType: 105,
    mimeType: "audio/CN",
    clockRate: 16000
  },
  RTCCodec_audio_Inbound_110={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_110,
    payloadType: 110,
    mimeType: "audio/telephone-event",
    clockRate: 48000
  },
  RTCCodec_audio_Inbound_111={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_111,
    payloadType: 111,
    mimeType: "audio/opus",
    clockRate: 48000
  },
  RTCCodec_audio_Inbound_113={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_113,
    payloadType: 113,
    mimeType: "audio/telephone-event",
    clockRate: 16000
  },
  RTCCodec_audio_Inbound_126={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_126,
    payloadType: 126,
    mimeType: "audio/telephone-event",
    clockRate: 8000
  },
  RTCCodec_audio_Inbound_13={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_13,
    payloadType: 13,
    mimeType: "audio/CN",
    clockRate: 8000
  },
  RTCCodec_audio_Inbound_8={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_8,
    payloadType: 8,
    mimeType: "audio/PCMA",
    clockRate: 8000
  },
  RTCCodec_audio_Inbound_9={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Inbound_9,
    payloadType: 9,
    mimeType: "audio/G722",
    clockRate: 8000
  },
  RTCCodec_audio_Outbound_0={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Outbound_0,
    payloadType: 0,
    mimeType: "audio/PCMU",
    clockRate: 8000
  },
  RTCCodec_audio_Outbound_102={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Outbound_102,
    payloadType: 102,
    mimeType: "audio/ILBC",
    clockRate: 8000
  },
  RTCCodec_audio_Outbound_103={
    timestampUs: 1557124386437087,
    type: codec,
    id: RTCCodec_audio_Outbound_103,
    payloadType: 103,
    mimeType: "audio/ISAC",
    clockRate: 16000
  }
}

每隔一秒钟,每次给我不同数据的响应时,我就会击中getStats()方法。 WebRTC文档上的任何地方都未记录此响应。

如何使用新的getStats()方法获取“ bytesReceived”,“ packetsLost”,“ packetsReceived”,“ googCodecName”和“ googJitterBufferMs”。

1 个答案:

答案 0 :(得分:1)

我在我的身上看到了这个

{ timestampUs: 1606895449567493, type: inbound-rtp, id: RTCInboundRTPVideoStream_512, ssrc: 512, isRemote: false, mediaType: "video", kind: "video", trackId: "RTCMediaStreamTrack_receiver_2", transportId: "RTCTransport_1_1", firCount: 0, pliCount: 0, nackCount: 0, packetsReceived: 0, bytesReceived: 0, headerBytesReceived: 0, packetsLost: 0, framesReceived: 0, framesDecoded: 0, keyFramesDecoded: 0, framesDropped: 0, totalDecodeTime: 0.0, totalInterFrameDelay: 0.0, totalSquaredInterFrameDelay: 0.0, decoderImplementation: "unknown" },
{ timestampUs: 1606895449567493, type: track, id: RTCMediaStreamTrack_receiver_1, trackIdentifier: "c68ef0fb-7ac9-4008-97db-100f9a04c66e", remoteSource: true, ended: false, detached: false, kind: "audio", jitterBufferDelay: 0.0, jitterBufferEmittedCount: 0, totalAudioEnergy: 0.0, totalSamplesReceived: 0, totalSamplesDuration: 0.0, concealedSamples: 0, silentConcealedSamples: 0, concealmentEvents: 0, insertedSamplesForDeceleration: 0, removedSamplesForAcceleration: 0, jitterBufferFlushes: 0, delayedPacketOutageSamples: 0, relativePacketArrivalDelay: 0.0, jitterBufferTargetDelay: 0.0, interruptionCount: 0, totalInterruptionDuration: 0.0 },
{ timestampUs: 1606895449567493, type: track, id: RTCMediaStreamTrack_receiver_2, trackIdentifier: "05c66233-cb7f-4984-9d27-3dde1ef92a36", remoteSource: true, ended: false, detached: false, kind: "video", jitterBufferDelay: 0.0, jitterBufferEmittedCount: 0, framesReceived: 0, framesDecoded: 0, framesDropped: 0, freezeCount: 0, pauseCount: 0, totalFreezesDuration: 0.0, totalPausesDuration: 0.0, totalFramesDuration: 0.0, sumOfSquaredFramesDuration: 0.0 }

您可以在统计信息中查找这些数据吗?

我这样称呼它:

peerConnection.getStats(new RTCStatsCollectorCallback() {
  @Override
  public void onStatsDelivered(RTCStatsReport rtcStatsReport) {
    longInfo("RTC Stats: \n" + rtcStatsReport.toString());
  }
});

编辑:由于统计报告太长,因此您需要制作一个longInfo方法,以查看所有内容。那应该可以解决您的问题。

  public void longInfo(String str) {
    if (str.length() > 4000) {
        Log.i(TAG, str.substring(0, 4000));
        longInfo(str.substring(4000));
    } else
        Log.i(TAG, str);
    }