getStats()
WebRTC API को Chrome 117 से हटा दिया जाएगा. इसलिए, इसका इस्तेमाल करने वाले ऐप्लिकेशन को स्टैंडर्ड एपीआई पर माइग्रेट करना होगा. इस लेख में, कोड को माइग्रेट करने का तरीका बताया गया है. साथ ही, यह भी बताया गया है कि अगर बदलाव करने के लिए आपको ज़्यादा समय चाहिए, तो क्या करें.
WebRTC getStats()
API के दो वर्शन ही उपलब्ध हैं. लेगसी getStats() API, जो स्टैंडर्ड प्रोसेस के लिए पहले से तय होता है. साथ ही, यह एक कॉलबैक आर्ग्युमेंट का इस्तेमाल करता है. साथ ही, यह स्टैंडर्ड और बड़े पैमाने पर काम करने वाले एपीआई का इस्तेमाल करता है, जो प्रॉमिस देता है.
स्टैंडर्ड एपीआई में ज़्यादा सुविधाएं होती हैं और इसकी मेट्रिक, W3C स्पेसिफ़िकेशन WebRTC के स्टैटिस्टिक्स एपीआई में सार्वजनिक तौर पर दर्ज हैं. खास जानकारी में, इस गाइड में दी गई हर मेट्रिक के साथ-साथ और भी बहुत कुछ शामिल है.
Chrome 117 के लेगसी getStats()
एपीआई को, स्टेबल रिलीज़ चैनल में अपवाद के तौर पर इस्तेमाल किया जाएगा. अपवाद के तौर पर, डेटा थ्रो को धीरे-धीरे रोल आउट किया जाएगा. आसानी से स्टैंडर्ड एपीआई का इस्तेमाल करने के लिए, इस गाइड का पालन करें.
लेगसी बनाम स्टैंडर्ड आंकड़े के टाइप
मानक आंकड़ों की पूरी सूची, स्पेसिफ़िकेशन में RTCStatsType enum को देखकर मिल सकती है. इसमें यह भी शामिल है कि आंकड़ों वाली डिक्शनरी की कौनसी परिभाषा, हर टाइप के लिए इकट्ठा की गई मेट्रिक की जानकारी देती है.
आंकड़ों से जुड़े सभी ऑब्जेक्ट में एक आईडी एट्रिब्यूट होता है, जो कई getStats()
कॉल में मौजूद ऑब्जेक्ट की खास तौर पर पहचान करता है. जब भी तरीका कॉल किया जाएगा, एक ही ऑब्जेक्ट का आईडी एक ही होगा. यह मेट्रिक में बदलाव की दर का हिसाब लगाने के लिए मददगार है. इसका उदाहरण अगले सेक्शन में दिया गया है. आईडी, रेफ़रंस के साथ संबंध भी बनाते हैं. उदाहरण के लिए, outbound-rtp
आंकड़े ऑब्जेक्ट, outbound-rtp.mediaSourceId
एट्रिब्यूट के ज़रिए असोसिएट किए गए media-source
आंकड़े ऑब्जेक्ट का रेफ़रंस देता है. सभी ...Id
संबंध बनाने पर, आपको एक ग्राफ़ मिलता है.
लेगसी एपीआई में इस तरह के आंकड़े होते हैं जो स्टैंडर्ड टाइप के हिसाब से इस तरह के होते हैं:
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है लेगसी टाइप |
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है स्टैंडर्ड टाइप |
---|---|
ssrc
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह आरटीपी स्ट्रीम और इससे जुड़ी MediaStreamTrack की मेट्रिक दिखाता है.अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इसके लिए स्टैंडर्ड टाइप inbound-rtp (आरटीपी स्ट्रीम और उससे जुड़े रिमोट MediaStreamTrack पाने के लिए), outbound-rtp (आरटीपी स्ट्रीम भेजने के लिए), और media-source (भेजे गए आरटीपी स्ट्रीम से जुड़ी लोकल MediaStreamTrack मेट्रिक के लिए) हैं. आरटीपी स्ट्रीम मेट्रिक में, उस एन्कोडर या डिकोडर की जानकारी भी शामिल होती है जिसका इस्तेमाल आरटीपी स्ट्रीम करता है. |
VideoBwe
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है बैंडविथ का अनुमान लगाने वाली मेट्रिक, टारगेट बिटरेट, एन्कोडर बिटरेट, और असल बिटरेट. इस तरह की मेट्रिक, आरटीपी मेट्रिक ( outbound-rtp और inbound-rtp ) और ICE कैंडिडेट पेयर मेट्रिक (candidate-pair ) का हिस्सा हैं. |
googComponent
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ट्रांसपोर्ट (ICE और DTLS) को दिखाता है. स्टैंडर्ड वर्शन transport है. |
localcandidate and remotecandidate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ICE उम्मीदवार का प्रतिनिधित्व करता है. स्टैंडर्ड वर्शन local-candidate और remote-candidate हैं. |
googCandidatePair
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ICE उम्मीदवार की जोड़ी का प्रतिनिधित्व करता है. यह स्थानीय और रिमोट उम्मीदवार की जोड़ी होती है. स्टैंडर्ड वर्शन candidate-pair है. |
googCertificate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह उस सर्टिफ़िकेट को दिखाता है जिसका इस्तेमाल डीटीएलएस ट्रांसपोर्ट करता है. स्टैंडर्ड वर्शन certificate है. |
googLibjingleSession
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है RTCPeerConnection को दिखाता है. इसका कॉन्टेंट स्टैंडर्ड में मौजूद किसी भी चीज़ से मैप नहीं होता है. हालांकि, स्टैंडर्ड में RTCPeerConnection : peer-connection से जुड़ा टाइप होता है. |
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है लेगसी एपीआई में वैल्यू मौजूद नहीं है |
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस तरह के आंकड़े स्टैंडर्ड एपीआई में जोड़े गए हैं. इनमें मिलता-जुलता कोई लेगसी टाइप नहीं है:
|
लेगसी से स्टैंडर्ड मेट्रिक मैपिंग
इस मैपिंग का मकसद डेवलपर को यह पता लगाने में मदद करना है कि कौनसी लेगसी मेट्रिक, किस स्टैंडर्ड मेट्रिक से मेल खाती है. हालांकि, ध्यान रखें कि संबंधित मेट्रिक में अलग-अलग यूनिट का इस्तेमाल हो सकता है या इसे इंस्टैंट वैल्यू के बजाय कुल काउंटर के रूप में दिखाया जा सकता है. मेट्रिक की परिभाषाओं के बारे में खास जानकारी देखें.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
स्टैंडर्ड एपीआई, दरों के बजाय कुल काउंटर दिखाने को प्राथमिकता देता है. इसका मतलब है कि ऐप्लिकेशन को पुराने एपीआई की तरह, उसी दर (उदाहरण के लिए, बिटरेट) पाने के लिए औसत दर का पता लगाना होगा. इसके लिए, ऐप्लिकेशन को दो getStats()
कॉल के बीच डेल्टा का पता लगाना होगा. उदाहरण के लिए:
// Periodically (e.g. every second or every 10 seconds)...
const currReport = await pc.getStats();
// Calculate bitrate since the last getStats() call.
// Handling of undefined is omitted for clarity.
const currOutboundRtp = currReport.values().find(s => s.type == 'outbound-rtp');
const prevOutboundRtp = prevReport.get(currOutboundRtp.id);
const deltaBits = (currOutboundRtp.bytesSent - prevOutboundRtp.bytesSent) * 8;
const deltaSeconds = (currOutboundRtp.timestamp - prevOutboundRtp.timestamp) / 1000;
logBitrateMeasurement(deltaBits / deltaSeconds);
// Remember the report for next time.
prevReport = currReport;
अपने हिसाब से दरों और औसत का हिसाब लगाना थोड़ा मुश्किल लग सकता है, लेकिन इसका एक फ़ायदा भी है कि किसी भी समयावधि में औसत निकाला जाता है. एपीआई के पुराने वर्शन की तुलना में, स्टैंडर्ड एपीआई को कम बार कॉल करने के कुछ फ़ायदे हैं.
लेगसी मेट्रिक
googCertificate |
स्टैंडर्ड पत्राचार
certificate |
---|---|
.googFingerprint
|
.fingerprint
|
.googFingerprintAlgorithm
|
.fingerprintAlgorithm
|
.googDerBase64
|
.base64Certificate
|
लेगसी मेट्रिक
googComponent |
स्टैंडर्ड पत्राचार
transport |
---|---|
.localCertificateId
|
.localCertificateId
|
.remoteCertificateId
|
.remoteCertificateId
|
.selectedCandidatePairId
|
.selectedCandidatePairId
|
.dtlsCipher
|
.dtlsCipher
|
.srtpCipher
|
.srtpCipher
|
लेगसी मेट्रिक
localcandidate |
स्टैंडर्ड पत्राचार
local-candidate या candidate-pair |
---|---|
.stunKeepaliveRequestsSent
|
candidate-pair.requestsSent (candidate-pair.localCandidateId से होकर candidate-pair रिवर्स लुकअप) |
.portNumber
|
local-candidate.port
|
.networkType
|
local-candidate.networkType
|
.ipAddress
|
local-candidate.address
|
.stunKeepaliveResponsesReceived
|
candidate-pair.responsesReceived
|
.stunKeepaliveRttTotal
|
candidate-pair.totalRoundTripTime
|
.transport
|
local-candidate.protocol
|
.candidateType
|
local-candidate.candidateType
|
.priority
|
local-candidate.priority
|
लेगसी मेट्रिक
remotecandidate |
स्टैंडर्ड पत्राचार
remote-candidate |
---|---|
ऊपर दिए गए localcandidate के बराबर. |
ऊपर दिए गए local-candidate के बराबर. |
लेगसी मेट्रिक
googCandidatePair |
स्टैंडर्ड पत्राचार
candidate-pair |
---|---|
.responsesSent
|
candidate-pair.responsesSent
|
.requestsReceived
|
candidate-pair.requestsReceived
|
.googRemoteCandidateType
|
remote-candidate.candidateType ( candidate-pair.remoteCandidateId से होकर remote-candidate खोजें) |
.googReadable
|
googReadable एक बूलियन है. इससे पता चलता है कि हमने हाल ही में candidate-pair.requestsReceived या candidate-pair.responsesReceived की बढ़ोतरी की है या नहीं
|
.googLocalAddress
|
local-candidate.address ( candidate-pair.localCandidateId से होकर local-candidate खोजें) |
.consentRequestsSent
|
candidate-pair.consentRequestsSent
|
.googTransportType
|
local-candidate.protocol और remote-candidate.protocol के बराबर. |
.googChannelId
|
candidate-pair.transportId
|
.googLocalCandidateType
|
local-candidate.candidateType
|
.googWritable
|
googWritable एक बूलियन है. इससे पता चलता है कि हमने हाल ही में candidate-pair.responsesReceived की बढ़ोतरी की है या नहीं
|
.googRemoteAddress
|
remote-candidate.address
|
.googRtt
|
candidate-pair.currentRoundTripTime
|
.googActiveConnection
|
ऐक्टिव कनेक्शन का मतलब है, उम्मीदवार की वह जोड़ी जिसे फ़िलहाल ट्रांसपोर्ट ने चुना है. जैसे, candidate-pair.id == transport.selectedCandidatePairId |
.packetsDiscardedOnSend
|
candidate-pair.packetsDiscardedOnSend
|
.bytesReceived
|
candidate-pair.bytesReceived
|
.responsesReceived
|
candidate-pair.responsesReceived
|
.remoteCandidateId
|
candidate-pair.remoteCandidateId
|
.localCandidateId
|
candidate-pair.localCandidateId
|
.bytesSent
|
candidate-pair.bytesSent
|
.packetsSent
|
candidate-pair.packetsSent
|
.bytesReceived
|
candidate-pair.bytesReceived
|
.bytesReceived
|
candidate-pair.bytesReceived
|
लेगसी मेट्रिक
ssrc |
स्टैंडर्ड पत्राचार
inbound-rtp , outbound-rtp , और media-source |
---|---|
.audioInputLevel
|
media-source.audioLevel . लेगसी मेट्रिक की रेंज [0..32768] है, लेकिन स्टैंडर्ड मीटर [0..1] रेंज में है. |
.audioOutputLevel
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है inbound-rtp.audioLevel . लेगसी मेट्रिक की रेंज [0..32768] है, लेकिन स्टैंडर्ड मीटर [0..1] रेंज में है. |
.packetsLost
|
inbound-rtp.packetsLost
|
.googTrackId
|
लोकल MediaStreamTrack के लिए media-source.trackIdentifier और रिमोट MediaStreamTrack के लिए inbound-rtp.trackIdentifier |
.googRtt
|
remote-inbound-rtp.roundTripTime (outbound-rtp.remoteId देखें) |
.googEchoCancellationReturnLossEnhancement
|
inbound-rtp.echoReturnLossEnhancement
|
.googCodecName
|
कोडेक का नाम, "टाइप/सब-टाइप" का सब-टाइप है MIME टाइप, codec.mimeType (inbound-rtp.codecId और outbound-rtp.codecId देखें) |
.transportId
|
inbound-rtp.transportId और outbound-rtp.transportId |
.mediaType
|
inbound-rtp.kind और outbound-rtp.kind या media-source.kind
|
.googEchoCancellationReturnLoss
|
inbound-rtp.echoReturnLoss
|
.totalAudioEnergy
|
inbound-rtp.totalAudioEnergy और media-source.totalAudioEnergy
|
ssrc.totalSamplesDuration
|
inbound-rtp.totalSamplesDuration और media-source.totalSamplesDuration
|
.ssrc
|
inbound-rtp.ssrc और outbound-rtp.ssrc
|
.googJitterReceived
|
inbound-rtp.jitter
|
.packetsSent
|
outbound-rtp.packetsSent
|
.bytesSent
|
outbound-rtp.bytesSent
|
.googContentType
|
inbound-rtp.contentType और outbound-rtp.contentType |
.googFrameWidthInput
|
media-source.width
|
.googFrameHeightInput
|
media-source.height
|
.googFrameRateInput
|
media-source.framesPerSecond
|
.googFrameWidthSent
|
outbound-rtp.frameWidth
|
.googFrameHeightSent
|
outbound-rtp.frameHeight
|
.googFrameRateSent
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है हालांकि, भेजे जाने वाले एफ़पीएस (फ़्रेम प्रति सेकंड) का मतलब, outbound-rtp.framesSent में होने वाले बदलाव की दर से है. हालांकि, इसे outbound-rtp.framesPerSecond के रूप में लागू किया जाता है, जो एफ़पीएस (फ़्रेम प्रति सेकंड) को कोड में बदलता है. |
.googFrameWidthReceived
|
inbound-rtp.frameWidth
|
.googFrameHeightReceived
|
inbound-rtp.frameHeight
|
.googFrameRateDecoded
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है inbound-rtp.framesDecoded के बदलाव की दर |
.googFrameRateOutput
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है inbound-rtp.framesDecoded - inbound-rtp.framesDropped के बदलाव की दर |
.hugeFramesSent
|
outbound-rtp.hugeFramesSent
|
.qpSum
|
|
.framesEncoded
|
outbound-rtp.framesEncoded
|
.googAvgEncodeMs
|
|
.codecImplementationName
|
|
.googCpuLimitedResolution
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सही है, अगर outbound-rtp.qualityLimitationReason == "cpu" |
.googBandwidthLimitedResolution
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सही है, अगर outbound-rtp.qualityLimitationReason == "bandwidth" |
.googAdaptationChanges
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है लेगसी मेट्रिक में यह गिना जाता है कि qualityLimitationReason से जुड़ी वजहों से, रिज़ॉल्यूशन या फ़्रेम रेट में कितनी बार बदलाव हुए. इसमें बदलाव करने के लिए, अन्य मेट्रिक इस्तेमाल की जा सकती हैं. जैसे, भेजें रिज़ॉल्यूशन या फ़्रेम रेट, सोर्स रिज़ॉल्यूशन या फ़्रेम रेट से अलग होना चाहिए. हालांकि, रिज़ॉल्यूशन या फ़्रेम रेट में बार-बार बदलाव किए जाने की अवधि को फिर से कॉन्फ़िगर करने की तुलना में, outbound-rtp.qualityLimitationDurations की समयसीमा को सीमित किया जा सकता है. यह ज़्यादा फ़ायदेमंद हो सकता है. |
.googNacksReceived
|
inbound-rtp.nackCount
|
.googNacksSent
|
inbound-rtp.nackCount
|
.googPlisReceived
|
inbound-rtp.pliCount
|
.googPlisSent
|
inbound-rtp.pliCount
|
.googFirsReceived
|
inbound-rtp.firCount
|
.googFirsSent
|
inbound-rtp.firCount
|
.googSecondaryDecodedRate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है उन पैकेट का हाल ही का अनुपात जिनमें गड़बड़ी ठीक करने की जानकारी दी गई है: inbound-rtp.fecPacketsReceived - inbound-rtp.fecPacketsDiscarded |
.packetsReceived
|
inbound-rtp.packetsReceived
|
.googJitterBufferMs
|
inbound-rtp.jitterBufferDelay / inbound-rtp.jitterBufferEmittedCount
|
.googTargetDelayMs (वीडियो) |
inbound-rtp.jitterBufferTargetDelay / inbound-rtp.jitterBufferEmittedCount
|
.googPreferredJitterBufferMs (ऑडियो) |
inbound-rtp.jitterBufferTargetDelay / inbound-rtp.jitterBufferEmittedCount
|
.googExpandRate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है छिपे हुए सैंपल का हाल ही का अनुपात: inbound-rtp.concealedSamples / inbound-rtp.totalSamplesReceived |
.googSpeechExpandRate
|
स्ट्रीम शांत नहीं होने पर, छिपे हुए सैंपल का हाल ही का अनुपात: (inbound-rtp.concealedSamples - inbound-rtp.silentConcealedSamples ) / inbound-rtp.concealedSamples |
.googAccelerateRate
|
प्लेआउट की रफ़्तार बढ़ाने के लिए खारिज किए गए सैंपल का हाल ही का अनुपात: inbound-rtp.removedSamplesForAcceleration / inbound-rtp.totalSamplesReceived |
.googPreemptiveExpandRate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है प्लेआउट स्पीड को कम करने के लिए, हाल ही में बनाए गए सैंपल का अनुपात: inbound-rtp.insertedSamplesForDeceleration / inbound-rtp.totalSamplesReceived |
.googSecondaryDiscardedRate
|
inbound-rtp.fecPacketsDiscarded
|
.bytesReceived
|
inbound-rtp.bytesReceived
|
s.googCurrentDelayMs
|
inbound-rtp.jitterBufferDelay और Media-playout.totalPlayoutDelay
|
.googDecodeMs
|
inbound-rtp.totalDecodeTime / inbound-rtp.framesDecoded
|
.googTimingFrameInfo
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिर्फ़ वही goog-मेट्रिक. inbound-rtp.googTimingFrameInfo |
.framesDecoded
|
inbound-rtp.framesDecoded
|
लेगसी मेट्रिक
VideoBwe |
स्टैंडर्ड पत्राचार
outbound-rtp और candidate-pair |
---|---|
.googTargetEncBitrate
|
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है तुरंत वैल्यू के तौर पर outbound-rtp.targetBitrate या औसत के तौर पर outbound-rtp.totalEncodedBytesTarget / outbound-rtp.framesEncoded |
.googActualEncBitrate
|
एन्कोडर से जनरेट हुई बाइट, पेलोड बाइट होती हैं. इनमें फिर से ट्रांसमिशन को शामिल नहीं किया जाता है: outbound-rtp.bytesSent से outbound-rtp.retransmittedBytesSent तक के बदलाव की दर |
.googBucketDelay
|
outbound-rtp.totalPacketSendDelay / outbound-rtp.packetsSent
|
.googTransmitBitrate
|
हर आरटीपी स्ट्रीम बिटरेट के लिए outbound-rtp.headerBytesSent + outbound-rtp.bytesSent , हर ICE उम्मीदवार के बिटरेट के लिए candidate-pair.bytesSent या हर ट्रांसपोर्ट बिटरेट के लिए transport.bytesSent बदलाव की दर |
.googRetransmitBitrate
|
outbound-rtp.retransmittedBytesSent के बदलाव की सीमा |
.googAvailableSendBandwidth
|
candidate-pair.availableOutgoingBitrate
|
.googAvailableReceiveBandwidth
|
candidate-pair.availableIncomingBitrate
|
स्टैंडर्ड एपीआई, सिमुलकास्ट के बारे में जानकारी देने वाला होता है
अगर आपने सिमुलकास्ट का इस्तेमाल किया है, तो आपने देखा होगा कि लेगसी एपीआई सिर्फ़ एक एसएसआरसी की रिपोर्ट करता है. ऐसा तब भी होता है, जब आपने तीन अलग-अलग एसएसआरसी पर तीन आरटीपी स्ट्रीम भेजने के लिए सिमुलकास्ट का इस्तेमाल किया हो.
स्टैंडर्ड एपीआई इस सीमा को शेयर नहीं करता और हर एसएसआरसी के लिए outbound-rtp
आंकड़ों के तीन ऑब्जेक्ट दिखाएगा. इसका मतलब है कि हर आरटीपी स्ट्रीम का अलग-अलग विश्लेषण किया जा सकता है. हालांकि, इसका यह मतलब भी है कि आरटीपी से भेजी गई सभी स्ट्रीम का कुल बिटरेट जानने के लिए, आपको उन्हें खुद ही इकट्ठा करना होगा.
कई स्पेशल लेयर वाली एसवीसी स्ट्रीम या आरटीपी स्ट्रीम, scalabilityMode
एपीआई की मदद से कॉन्फ़िगर की गई हैं. वे अब भी एक outbound-rtp
के तौर पर दिखती हैं, क्योंकि इन्हें एक ही एसएसआरसी पर भेजा जाता है.
अगर माइग्रेशन के लिए आपको ज़्यादा समय चाहिए
जब Chrome 117 से लेगसी एपीआई को हटाया जाता है, तो इसका इस्तेमाल करने से अपवाद जनरेट होगा. अगर कोड को समय पर माइग्रेट नहीं हो पा रहा है, तो RTCPeerConnection कॉलबैक-आधारित getStats() API का ऑरिजिन ट्रायल, रजिस्टर की गई वेबसाइटों को माइग्रेट करने के लिए ज़्यादा समय देता है. ऑरिजिन ट्रायल टोकन के साथ, लेगसी getStats() API का इस्तेमाल Chrome 121 तक जारी रह सकता है.