Reputation: 236
I am trying to get all information related to mediastreams to get call quality. Peerconnection.getStats() method is deprecated but provides all information as per my requirement like "bytesReceived", "packetsLost", "packetsReceived" ,"googCodecName" and "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
]
}
Now I can't use this method as its deprecated. When I am trying to use new getStats() method, It does not provides all such information and also the response is also very unorganised.
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
}
}
I am hitting getStats() method after every second and each time it gives me response with different data. This response is not documented anywhere on WebRTC docs.
How I can get "bytesReceived", "packetsLost", "packetsReceived" ,"googCodecName" and "googJitterBufferMs" with new getStats() method.
Upvotes: 2
Views: 2199
Reputation:
I see this on mine:
{ 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 }
Can you look for those in your stats?
I call it like this:
peerConnection.getStats(new RTCStatsCollectorCallback() {
@Override
public void onStatsDelivered(RTCStatsReport rtcStatsReport) {
longInfo("RTC Stats: \n" + rtcStatsReport.toString());
}
});
Edit: Since the stats report is so long, you will need to make a longInfo method like this to see everything. That should solve your problem.
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);
}
Upvotes: 1