Eski getStats()
WebRTC API'si Chrome 117'de kaldırılacaktır. Bu nedenle, bu API'yi kullanan uygulamaların standart API'ye taşınması gerekecektir. Bu makalede, kodunuzu nasıl taşıyacağınız ve bu değişikliği yapmak için daha fazla zamana ihtiyacınız varsa ne yapmanız gerektiği açıklanmaktadır.
Geçmişte WebRTC getStats()
API'nin birbiriyle rekabet eden iki sürümü olmuştur. Standartlaştırma işleminden önce gelen ve bir geri çağırma bağımsız değişkeni alan eski getStats() API'si ve bir taahhüt döndüren, standartlaştırılmış ve yaygın olarak desteklenen API.
Standart API daha fazla özelliğe sahiptir ve WebRTC'nin Tanımlayıcıları for WebRTC İstatistik API'si W3C spesifikasyonunda herkese açık şekilde belgelenmiş, iyi tanımlanmış metriklere sahiptir. Spesifikasyon, bu kılavuzda listelenen her bir metriğin açıklamasını ve daha fazlasını içerir.
Chrome 117'den itibaren eski getStats()
API, Kararlı sürüm kanalında bir istisna oluşturacaktır (İstisna ekleme işlemi kademeli olarak kullanıma sunulacaktır). Standart API'ye geçişinizi kolaylaştırmak için bu kılavuzdaki adımları uygulayın.
Eski istatistik türleri ile standart istatistik türleri karşılaştırması
Standart istatistik türlerinin tam listesini, spesifikasyondaki RTCStatsType sıralamasına bakarak bulabilirsiniz. Her tür için toplanan metrikleri açıklayan istatistik sözlüğü tanımı da buna dahildir.
İstatistik nesnelerinin tümünde, birden fazla getStats()
çağrısında temel nesneyi benzersiz şekilde tanımlayan bir id [no] özelliği vardır. Yöntem her çağrıldığında aynı nesne aynı kimliğe sahip olur. Bu, metriklerdeki değişim oranını hesaplamak için yararlıdır (sonraki bölümde bir örnek bulunmaktadır). Kimlikler ayrıca referans ilişkilerini de oluşturur. Örneğin, outbound-rtp
istatistik nesnesi, outbound-rtp.mediaSourceId
özelliği aracılığıyla ilişkilendirilmiş media-source
istatistik nesnesine başvuruda bulunur. ...Id
ilişkilerinin tümünü çizerseniz bir grafik elde edersiniz.
Eski API, standart türlere karşılık gelen aşağıdaki istatistik türlerine sahiptir:
. Eski tür |
. Standart tür |
---|---|
ssrc
|
. RTP akışını ve ilişkili MediaStreamTrack ile ilgili metrikleri temsil eder.. . . Bunun standart türleri inbound-rtp (RTP akışlarını ve ilişkili uzak MediaStreamTrack akışlarını almak için), outbound-rtp (RTP akışlarını gönderme için) ve media-source (gönderen RTP akışlarıyla ilişkili yerel MediaStreamTrack metrikleri için) şeklindedir. RTP akış metrikleri, RTP akışı tarafından kullanılan kodlayıcı veya kod çözücüyle ilgili bilgileri de içerir. |
VideoBwe
|
. Bant genişliği tahmin metrikleri, hedef bit hızı, kodlayıcı bit hızı ve gerçek bit hızı. Bu tür metrikler, RTP metriklerinin ( outbound-rtp ve inbound-rtp ) ve ICE aday çifti metriklerinin (candidate-pair ) bir parçasıdır. |
googComponent
|
. Taşımayı (ICE ve DTLS) temsil eder. Standart sürüm: transport . |
localcandidate and remotecandidate
|
. Bir ICE adayını temsil eder. Standart sürüm: local-candidate ve remote-candidate . |
googCandidatePair
|
. Yerel ve uzaktaki bir adayı temsil eden ICE aday çiftini temsil eder. Standart sürüm: candidate-pair . |
googCertificate
|
. DTLS aktarımı tarafından kullanılan bir sertifikayı temsil eder. Standart sürüm: certificate . |
googLibjingleSession
|
. RTCPeerConnection temsil eder. İçeriği, standarttaki hiçbir şeyle eşleşmese de standart, RTCPeerConnection : peer-connection ile ilişkilendirilmiş bir türe sahiptir. |
. Eski API'de eksik |
. Karşılık gelen bir eski türü olmayan standart API'ye şu istatistik türleri eklendi:
|
Eski metrikleri standart metriklerle eşleme
Bu eşlemenin amacı, geliştiricilerin hangi eski metriğin hangi standart metriğe karşılık geldiğini bulmalarına yardımcı olmaktır. Ancak ilgili metriğin farklı birimler kullanabileceğini veya anlık bir değer yerine toplam sayaç olarak ifade edilebileceğini unutmayın. Metrik tanımları için spesifikasyona bakın.
.
Standart API, ücretler yerine toplam sayaçları göstermeyi tercih eder. Yani, eski API'de olduğu gibi karşılık gelen hızı (ör. bit hızı) almak için uygulamanın iki getStats()
çağrısı arasındaki deltayı alarak ortalama hızı hesaplaması gerekir. Örneğin:
// 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;
Ücretleri ve ortalamaları kendiniz bu şekilde hesaplamak zahmetli bir ek adım gibi görünse de, istenen herhangi bir zaman aralığındaki ortalamaları elde etmenize olanak sağlaması açısından avantajlıdır. Standart API'yi, eski API'yi kullanmak zorunda kaldığınızdan daha seyrek çağırmanın bazı performans avantajları vardır.
Eski metrik
googCertificate |
Standart yazışma
certificate |
---|---|
.googFingerprint
|
.fingerprint
|
.googFingerprintAlgorithm
|
.fingerprintAlgorithm
|
.googDerBase64
|
.base64Certificate
|
Eski metrik
googComponent |
Standart yazışma
transport |
---|---|
.localCertificateId
|
.localCertificateId
|
.remoteCertificateId
|
.remoteCertificateId
|
.selectedCandidatePairId
|
.selectedCandidatePairId
|
.dtlsCipher
|
.dtlsCipher
|
.srtpCipher
|
.srtpCipher
|
Eski metrik
localcandidate |
Standart yazışma
local-candidate veya candidate-pair |
---|---|
.stunKeepaliveRequestsSent
|
candidate-pair.requestsSent (candidate-pair.localCandidateId üzerinden candidate-pair araması) |
.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
|
Eski metrik
remotecandidate |
Standart yazışma
remote-candidate |
---|---|
Yukarıdaki localcandidate ile aynı. |
Yukarıdaki local-candidate ile aynı. |
Eski metrik
googCandidatePair |
Standart yazışma
candidate-pair |
---|---|
.responsesSent
|
candidate-pair.responsesSent
|
.requestsReceived
|
candidate-pair.requestsReceived
|
.googRemoteCandidateType
|
remote-candidate.candidateType ( candidate-pair.remoteCandidateId üzerinden remote-candidate araması) |
.googReadable
|
googReadable , yakın zamanda candidate-pair.requestsReceived veya candidate-pair.responsesReceived değerini artırıp artırmadığımızı yansıtan bir boole değeridir.
|
.googLocalAddress
|
local-candidate.address ( candidate-pair.localCandidateId üzerinden local-candidate araması) |
.consentRequestsSent
|
candidate-pair.consentRequestsSent
|
.googTransportType
|
local-candidate.protocol ve remote-candidate.protocol ile aynıdır. |
.googChannelId
|
candidate-pair.transportId
|
.googLocalCandidateType
|
local-candidate.candidateType
|
.googWritable
|
googWritable , yakın zamanda candidate-pair.responsesReceived değerini artırıp artırmadığımızı yansıtan bir boole değeridir.
|
.googRemoteAddress
|
remote-candidate.address
|
.googRtt
|
candidate-pair.currentRoundTripTime
|
.googActiveConnection
|
Etkin bağlantı, aktarım tarafından seçilmiş olan aday çifti (ör. candidate-pair.id == transport.selectedCandidatePairId ) belirtir. |
.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
|
Eski metrik
ssrc |
Standart yazışma
inbound-rtp outbound-rtp , media-source |
---|---|
.audioInputLevel
|
media-source.audioLevel . Eski metrik [0..32768] aralığında ancak standart metrc [0..1] aralığında. |
.audioOutputLevel
|
. inbound-rtp.audioLevel . Eski metrik [0..32768] aralığında ancak standart metrc [0..1] aralığında. |
.packetsLost
|
inbound-rtp.packetsLost
|
.googTrackId
|
Yerel MediaStreamTrack 'lar için media-source.trackIdentifier , uzak MediaStreamTrack 'lar için inbound-rtp.trackIdentifier |
.googRtt
|
remote-inbound-rtp.roundTripTime (bkz. outbound-rtp.remoteId ) |
.googEchoCancellationReturnLossEnhancement
|
inbound-rtp.echoReturnLossEnhancement
|
.googCodecName
|
codec adı, "tür/alt tür"ün alt türüdür MIME türü, codec.mimeType (bkz. inbound-rtp.codecId ve outbound-rtp.codecId ) |
.transportId
|
inbound-rtp.transportId ve outbound-rtp.transportId |
.mediaType
|
inbound-rtp.kind ve outbound-rtp.kind veya media-source.kind
|
.googEchoCancellationReturnLoss
|
inbound-rtp.echoReturnLoss
|
.totalAudioEnergy
|
inbound-rtp.totalAudioEnergy ve media-source.totalAudioEnergy
|
ssrc.totalSamplesDuration
|
inbound-rtp.totalSamplesDuration ve media-source.totalSamplesDuration
|
.ssrc
|
inbound-rtp.ssrc ve outbound-rtp.ssrc
|
.googJitterReceived
|
inbound-rtp.jitter
|
.packetsSent
|
outbound-rtp.packetsSent
|
.bytesSent
|
outbound-rtp.bytesSent
|
.googContentType
|
inbound-rtp.contentType ve outbound-rtp.contentType |
.googFrameWidthInput
|
media-source.width
|
.googFrameHeightInput
|
media-source.height
|
.googFrameRateInput
|
media-source.framesPerSecond
|
.googFrameWidthSent
|
outbound-rtp.frameWidth
|
.googFrameHeightSent
|
outbound-rtp.frameHeight
|
.googFrameRateSent
|
. Gönderme FPS'si, outbound-rtp.framesSent değişim hızıdır, ancak aslında FPS'yi kodlayan outbound-rtp.framesPerSecond olarak uygulanır. |
.googFrameWidthReceived
|
inbound-rtp.frameWidth
|
.googFrameHeightReceived
|
inbound-rtp.frameHeight
|
.googFrameRateDecoded
|
. inbound-rtp.framesDecoded değişim oranı |
.googFrameRateOutput
|
. inbound-rtp.framesDecoded - inbound-rtp.framesDropped değişim oranı |
.hugeFramesSent
|
outbound-rtp.hugeFramesSent
|
.qpSum
|
|
.framesEncoded
|
outbound-rtp.framesEncoded
|
.googAvgEncodeMs
|
|
.codecImplementationName
|
|
.googCpuLimitedResolution
|
. outbound-rtp.qualityLimitationReason == "cpu" ise doğru |
.googBandwidthLimitedResolution
|
. outbound-rtp.qualityLimitationReason == "bandwidth" ise doğru |
.googAdaptationChanges
|
. Eski metrik, qualityLimitationReason ile ilgili nedenden dolayı çözünürlük veya kare hızının kaç kez değiştiğini sayar. Bu değer, diğer metriklerden (ör.gönderme çözünürlüğü veya kare hızının kaynak çözünürlüğünden ya da kare hızından farklı olması) çıkarılabilir. Ancak sınırladığımız süre (outbound-rtp.qualityLimitationDurations ), çözünürlük veya kare hızının yeniden yapılandırılma sıklığından daha faydalı olabilir. |
.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
|
. Hata düzeltmesini içeren son paket oranı: inbound-rtp.fecPacketsReceived - inbound-rtp.fecPacketsDiscarded |
.packetsReceived
|
inbound-rtp.packetsReceived
|
.googJitterBufferMs
|
inbound-rtp.jitterBufferDelay /inbound-rtp.jitterBufferEmittedCount
|
.googTargetDelayMs (video) |
inbound-rtp.jitterBufferTargetDelay /inbound-rtp.jitterBufferEmittedCount
|
.googPreferredJitterBufferMs (ses) |
inbound-rtp.jitterBufferTargetDelay /inbound-rtp.jitterBufferEmittedCount
|
.googExpandRate
|
. Gizli örneklerin son oranı: inbound-rtp.concealedSamples / inbound-rtp.totalSamplesReceived |
.googSpeechExpandRate
|
Akış sessiz moddayken son zamanlarda gizlenmiş örneklerin oranı: (inbound-rtp.concealedSamples - inbound-rtp.silentConcealedSamples ) / inbound-rtp.concealedSamples |
.googAccelerateRate
|
Son zamanlarda oynatma hızını artırmak için silinen örneklerin oranı: inbound-rtp.removedSamplesForAcceleration / inbound-rtp.totalSamplesReceived |
.googPreemptiveExpandRate
|
. Oynatma hızını azaltmak için sentezlenen son örneklerin oranı: 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
|
. Kalan tek goog-metriği. inbound-rtp.googTimingFrameInfo |
.framesDecoded
|
inbound-rtp.framesDecoded
|
Eski metrik
VideoBwe |
Standart yazışma
outbound-rtp ve candidate-pair |
---|---|
.googTargetEncBitrate
|
. Anlık değer olarak outbound-rtp.targetBitrate veya ortalama olarak outbound-rtp.totalEncodedBytesTarget / outbound-rtp.framesEncoded |
.googActualEncBitrate
|
Kodlayıcı tarafından üretilen baytlar, yeniden iletimler hariç yük baytlarıdır: outbound-rtp.bytesSent - outbound-rtp.retransmittedBytesSent değişim hızı |
.googBucketDelay
|
outbound-rtp.totalPacketSendDelay /outbound-rtp.packetsSent
|
.googTransmitBitrate
|
RTP başına akış bit hızı için outbound-rtp.headerBytesSent + outbound-rtp.bytesSent , ICE adayı başına bit hızı için candidate-pair.bytesSent veya aktarım başına bit hızı için transport.bytesSent değişim hızı |
.googRetransmitBitrate
|
outbound-rtp.retransmittedBytesSent değişim aralığı |
.googAvailableSendBandwidth
|
candidate-pair.availableOutgoingBitrate
|
.googAvailableReceiveBandwidth
|
candidate-pair.availableIncomingBitrate
|
Standart API, simulcast duyarlı
Simulcast kullanıyorsanız, (örneğin) üç ayrı SSRC'de üç RTP akışı göndermek için simulcast'i kullanıyor olsanız bile eski API'nin yalnızca tek bir SSRC raporladığını fark etmiş olabilirsiniz.
Standart API bu sınırlamayı paylaşmaz ve her SSRC için bir tane olmak üzere üç outbound-rtp
istatistik nesnesi döndürür. Bu, her bir RTP akışını ayrı ayrı analiz edebileceğiniz anlamına gelir, ancak aynı zamanda tüm RTP gönderme akışlarının toplam bit hızını elde etmek için bunları kendiniz toplamanız gerekir.
Diğer yandan scalabilityMode
API'si aracılığıyla yapılandırılan birden fazla mekansal katmana sahip SVC akışları veya RTP akışları, tek bir SSRC üzerinden gönderildiğinden yine tek bir outbound-rtp
olarak görünür.
Taşıma için daha fazla zamana ihtiyacınız varsa
Eski API, Chrome 117'de kaldırıldığında bu API'nin kullanılması bir istisna oluşturur. Kodunuzu zamanında taşıyamıyorsanız RTCPeerConnection geri çağırmaya dayalı getStats() API'sinin kaynak denemesi, kayıtlı web sitelerinin taşınması için daha fazla zaman tanır. Kaynak deneme jetonuyla eski getStats() API, Chrome 121'e kadar kullanılmaya devam edebilir.