Eski getStats()
WebRTC API'si Chrome 117'de kaldırılacağından, bu API'yi kullanan uygulamaların standart API'ye taşınması gerekecek. Bu makalede, kodunuzu nasıl taşıyacağınız ve bu değişikliği yapmak için daha fazla zamana ihtiyacınız olursa ne yapmanız gerektiği açıklanmaktadır.
Geçmişte WebRTC getStats()
API'sinin iki rekabet halindeki sürümü vardı. Standartlaştırma sürecinden önce gelen ve geri çağırma işlevi bağımsız değişkeni alan eski getStats() API'si ile standartlaştırılmış ve yaygın olarak desteklenen, bir promise döndüren API.
Standart API daha fazla özelliklere sahiptir ve WebRTC'nin Statistics API'si için Tanımlayıcılar adlı W3C spesifikasyonunda herkese açık olarak belgelenmiş iyi tanımlanmış metriklere sahiptir. Bu kılavuzda listelenen her metrik ve daha fazlasının açıklamaları bu dokümanda yer alır.
Chrome 117'den itibaren eski getStats()
API, kararlı sürüm kanalında istisna atacaktır (istisna atma özelliği kademeli olarak kullanıma sunulacaktır). Standart API'ye geçişinizi kolaylaştırmak için bu kılavuzu uygulayın.
Eski ve standart istatistik türleri
Standart istatistik türlerinin tam listesini, spesifikasyondaki RTCStatsType enum'una bakarak bulabilirsiniz. Bu, her tür için toplanan metrikleri açıklayan istatistik sözlüğü tanımını içerir.
Tüm istatistik nesnelerinin, birden fazla getStats()
çağrısında temel nesneyi benzersiz şekilde tanımlayan bir kimlik özelliği vardır. Yöntem her çağrıldığında aynı nesnenin kimliği aynı olur. Bu, metriklerin değişim hızını hesaplamak için yararlıdır (sonraki bölümde bir örnek verilmiştir). Kimlikler, referans ilişkileri de oluşturur. Örneğin, outbound-rtp
istatistik nesnesi, outbound-rtp.mediaSourceId
özelliği aracılığıyla ilişkili media-source
istatistik nesnesine referans verir. Tüm ...Id
ilişkilerini çizerseniz bir grafik elde edersiniz.
Eski API'de, aşağıdaki standart türlere karşılık gelen aşağıdaki istatistik türleri vardır:
Eski tür |
Standart tür |
---|---|
ssrc
|
Bir RTP akışını ve ilişkili MediaStreamTrack ile ilgili metrikleri temsil eder.Bunun için standart türler inbound-rtp (RTP akışlarını alma ve ilişkili uzak MediaStreamTrack için), outbound-rtp (RTP akışlarını gönderme) ve media-source (RTP gönderme akışı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 tahmini 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
|
Aktarımı (ICE ve DTLS) temsil eder. Standart sürüm transport 'tir. |
localcandidate and remotecandidate
|
ICE adayını temsil eder. Standart sürüm local-candidate ve remote-candidate 'tür. |
googCandidatePair
|
Yerel ve uzak bir adayın eşlemesi olan bir ICE aday çiftini temsil eder. Standart sürüm candidate-pair 'tir. |
googCertificate
|
DTLS aktarımı tarafından kullanılan bir sertifikayı temsil eder. Standart sürüm certificate 'tir. |
googLibjingleSession
|
RTCPeerConnection değerini temsil eder. İçeriği standarttaki hiçbir öğeyle eşleşmese de standartta RTCPeerConnection ile ilişkili bir tür vardır: peer-connection . |
Eski API'de yok |
Standart API'ye, eski türü olmayan aşağıdaki istatistik türleri eklendi:
|
Eski metriklerin standart metriklerle eşlenmesi
Bu eşleme, geliştiricilerin hangi eski metriğin hangi standart metriğe karşılık geldiğini bulmasına yardımcı olmayı amaçlar. Ancak ilgili metriğin farklı birimler kullanabileceğini veya anlık değer yerine toplam sayaç olarak ifade edilebileceğini unutmayın. Metrik tanımları için spesifikasyona bakın.
Standart API, oranlar yerine toplam sayaçları göstermeyi tercih eder. Bu, eski API'de olduğu gibi ilgili hızı (ör. bit hızı) almak için uygulamanın iki getStats()
çağrısı arasındaki farkı alarak ortalama hızı hesaplaması gerektiği anlamına gelir. Ö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ı bu şekilde kendiniz hesaplamak zahmetli bir ek adım gibi görünse de istediğiniz zaman aralığı için ortalamaları alma avantajına sahiptir. Standart API'yi eski API ile yapmak zorunda kalacağınızdan daha seyrek çağırmak bazı performans avantajları sağlar.
Eski metrik
googCertificate |
Standart yazışmalar
certificate |
---|---|
.googFingerprint
|
.fingerprint
|
.googFingerprintAlgorithm
|
.fingerprintAlgorithm
|
.googDerBase64
|
.base64Certificate
|
Eski metrik
googComponent |
Standart yazışmalar
transport |
---|---|
.localCertificateId
|
.localCertificateId
|
.remoteCertificateId
|
.remoteCertificateId
|
.selectedCandidatePairId
|
.selectedCandidatePairId
|
.dtlsCipher
|
.dtlsCipher
|
.srtpCipher
|
.srtpCipher
|
Eski metrik
localcandidate |
Standart yazışmalar
local-candidate veya candidate-pair |
---|---|
.stunKeepaliveRequestsSent
|
candidate-pair.requestsSent (candidate-pair.localCandidateId üzerinden candidate-pair ters 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ışmalar
remote-candidate |
---|---|
Yukarıdaki localcandidate ile aynıdır. |
Yukarıdaki local-candidate ile aynıdır. |
Eski metrik
googCandidatePair |
Standart yazışmalar
candidate-pair |
---|---|
.responsesSent
|
candidate-pair.responsesSent
|
.requestsReceived
|
candidate-pair.requestsReceived
|
.googRemoteCandidateType
|
remote-candidate.candidateType ( candidate-pair.remoteCandidateId üzerinden remote-candidate 'yi arayın) |
.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 'yi arayın) |
.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 , candidate-pair.responsesReceived değerini yakın zamanda 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 şu anda seçilen aday çiftidir (ör. 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
|
Eski metrik
ssrc |
Standart yazışmalar
inbound-rtp , outbound-rtp , media-source |
---|---|
.audioInputLevel
|
media-source.audioLevel . Eski metrik [0..32768] aralığındadır ancak standart metrik [0..1] aralığındadır. |
.audioOutputLevel
|
inbound-rtp.audioLevel . Eski metrik [0..32768] aralığındadır ancak standart metrik [0..1] aralığındadır. |
.packetsLost
|
inbound-rtp.packetsLost
|
.googTrackId
|
Yerel MediaStreamTrack için media-source.trackIdentifier ve uzak MediaStreamTrack için inbound-rtp.trackIdentifier |
.googRtt
|
remote-inbound-rtp.roundTripTime (outbound-rtp.remoteId bölümüne bakın) |
.googEchoCancellationReturnLossEnhancement
|
inbound-rtp.echoReturnLossEnhancement
|
.googCodecName
|
Kodek adı, "type/subtype" MIME türünün alt türüdür (codec.mimeType ) (inbound-rtp.codecId ve outbound-rtp.codecId 'ye bakın) |
.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 'un değişim hızıdır ancak bu aslında FPS'yi kodlayan outbound-rtp.framesPerSecond olarak uygulanır. |
.googFrameWidthReceived
|
inbound-rtp.frameWidth
|
.googFrameHeightReceived
|
inbound-rtp.frameHeight
|
.googFrameRateDecoded
|
inbound-rtp.framesDecoded değerinin değişim oranı |
.googFrameRateOutput
|
inbound-rtp.framesDecoded - inbound-rtp.framesDropped değerinin değişim hızı |
.hugeFramesSent
|
outbound-rtp.hugeFramesSent
|
.qpSum
|
|
.framesEncoded
|
outbound-rtp.framesEncoded
|
.googAvgEncodeMs
|
|
.codecImplementationName
|
|
.googCpuLimitedResolution
|
outbound-rtp.qualityLimitationReason == "cpu" ise doğrudur |
.googBandwidthLimitedResolution
|
outbound-rtp.qualityLimitationReason == "bandwidth" ise doğrudur |
.googAdaptationChanges
|
Klasik metrik, qualityLimitationReason ile ilgili nedenlerle çözünürlüğün veya kare hızının kaç kez değiştiğini sayar. Bu, diğer metriklerden (ör. gönderme çözünürlüğü veya kare hızı, kaynak çözünürlüğünden veya kare hızından farklıysa) çıkarılabilir ancak sınırlı olduğumuz süre (outbound-rtp.qualityLimitationDurations ), çözünürlüğün veya kare hızının yeniden yapılandırılmasının ne sıklıkta gerçekleştiğinden daha yararlı 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üzeltmesi içeren paketlerin son 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 değilken gizlenen örneklerin son oranı: (inbound-rtp.concealedSamples - inbound-rtp.silentConcealedSamples ) / inbound-rtp.concealedSamples |
.googAccelerateRate
|
Oynatma hızını artırmak için atlanan örneklerin son oranı: inbound-rtp.removedSamplesForAcceleration / inbound-rtp.totalSamplesReceived |
.googPreemptiveExpandRate
|
Oynatma hızını yavaşlatmak için sentezlenen örneklerin son 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ışmalar
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 yayınlamalar hariç olmak üzere yükü baytlardır: outbound-rtp.bytesSent - outbound-rtp.retransmittedBytesSent değişim hızı |
.googBucketDelay
|
outbound-rtp.totalPacketSendDelay /outbound-rtp.packetsSent
|
.googTransmitBitrate
|
RTP akışı başına bit hızı için outbound-rtp.headerBytesSent + outbound-rtp.bytesSent , ICE adayı başına bit hızı için candidate-pair.bytesSent veya taşıma başına bit hızı için transport.bytesSent değişim oranı |
.googRetransmitBitrate
|
outbound-rtp.retransmittedBytesSent değerinin değişim aralığı |
.googAvailableSendBandwidth
|
candidate-pair.availableOutgoingBitrate
|
.googAvailableReceiveBandwidth
|
candidate-pair.availableIncomingBitrate
|
Standart API, eş zamanlı yayından haberdardır.
Aynı anda yayın özelliğini kullanıyorsanız eski API'nin, üç ayrı SSRC üzerinden üç RTP akışı göndermek için (ör.) aynı anda yayın özelliğini kullanırken bile yalnızca tek bir SSRC bildirdiğini 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 RTP akışını ayrı ayrı analiz edebileceğiniz anlamına gelir ancak tüm RTP gönderme akışlarının toplam bit hızını elde etmek için bunları kendiniz toplamanız gerektiği anlamına da gelir.
Öte yandan, scalabilityMode
API aracılığıyla yapılandırılmış birden fazla mekansal katmana sahip SVC akışları veya RTP akışları, tek bir SSRC üzerinden gönderildikleri için tek bir outbound-rtp
olarak gösterilmeye devam eder.
Taşıma işlemi için daha fazla zamana ihtiyacınız varsa
Eski API, Chrome 117'de kaldırıldığında kullanılması istisna oluşturacaktır. Kodunuzu zamanında taşıyamıyorsanız RTCPeerConnection geri çağırma tabanlı getStats() API'si için kaynak denemesi, kayıtlı web sitelerine taşıma işlemi için daha fazla süre tanır. Kaynak deneme jetonu ile eski getStats() API'si Chrome 121'e kadar kullanılmaya devam edebilir.