android - Android WebRTC - getStats() 没有提供足够的信息
问题描述
我正在尝试获取与媒体流相关的所有信息以获取通话质量。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”。
解决方案
我在我的身上看到了这个:
{ 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);
}
推荐阅读
- javascript - 加载 vue 组件并获取 HTML 作为 fullcalendar 的字符串
- c# - 使用 Polly 从异步函数重试
- php - 返回 200 OK 响应
- reactjs - 如何修复 React Router 问题的 webpack 文件?
- python - Python ZeroMQ PUSH/PULL 逻辑,将高水位标记设置为低端 puller 而不会丢失任何消息
- java - 从文件中获取值并将它们分配给java中的数组
- c# - 需要帮助将事件按钮与文件连接起来
- c++ - 为什么用户交互会阻止qt本地事件循环中的http请求
- python - 并行化一个简单的计算
- c++ - 有人可以帮我弄清楚如何从我的代码中删除来自hackerrank的分段错误