Eski getStats()
WebRTC API'si Chrome 117'de kaldırılacak. Bu nedenle, 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'nin iki rakip sürümü bulunuyordu. Standartlaştırma sürecinden önceki ve bir geri çağırma bağımsız değişkeni alan eski getStats() API'si ile vade döndüren, standartlaştırılmış ve yaygın olarak desteklenen API.
Standart API daha zengin özelliklere sahiptir ve WebRTC'nin İstatistik API'si için Tanımlayıcılar adlı W3C spesifikasyonunda herkese açık şekilde belgelenmiş, iyi tanımlanmış metriklere sahiptir. Spesifikasyon, bu kılavuzda listelenen her metriğin açıklamasını ve daha birçok metriğin açıklamasını içerir.
Chrome 117 sürümünden itibaren eski getStats()
API, Kararlı sürüm kanalında bir istisna oluşturacaktır (İstisna bildirimi kademeli olarak kullanıma sunulacaktır). Standart API'ye geçişinizi kolaylaştırmak için bu kılavuzdan yararlanın.
Eski ve standart istatistik türleri karşılaştırması
Standart istatistik türlerinin tam listesini, spesifikasyondaki RTCStatsType sıralamasına bakarak bulabilirsiniz. Bu, her tür için toplanan metrikleri açıklayan istatistik sözlüğü tanımını da içerir.
İstatistik nesnelerinin tümü, birden çok getStats()
çağrısında temel nesneyi benzersiz şekilde tanımlayan bir kimlik özelliğine sahiptir. 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 verilmiştir). Kimlikler aynı zamanda referansların ilişkilerini oluşturur. Örneğin, outbound-rtp
istatistik nesnesi, outbound-rtp.mediaSourceId
özelliği aracılığıyla ilişkilendirilen media-source
istatistik nesnesine başvuruda bulunur. Tüm ...Id
ilişkileri çizerseniz bir grafik elde edersiniz.
Eski API, aşağıdaki standart türlere karşılık gelen, aşağıdaki istatistik türlerine sahiptir:
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 şunlardır: inbound-rtp (RTP akışlarını ve ilişkili uzak MediaStreamTrack alanlarını almak için), outbound-rtp (RTP akışları göndermek için) ve media-source (gönderilen RTP akışıyla ilişkili yerel MediaStreamTrack metrikleri için). RTP akış metrikleri, RTP akışı tarafından kullanılan kodlayıcı veya kod çözücü hakkında da bilgi 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 metrikleri ( outbound-rtp ve inbound-rtp ) ve ICE aday çifti metrikleri (candidate-pair ) kapsamında yer alır. |
googComponent
|
Aktarımı temsil eder (ICE ve DTLS). Standart sürüm: transport . |
localcandidate and remotecandidate
|
Bir ICE adayını temsil eder. Standart sürüm local-candidate ve remote-candidate sürümleridir. |
googCandidatePair
|
ICE adayı çiftini temsil eder. ICE adayı, yerel ve uzak adaylardan oluşur. 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 herhangi bir öğeyle eşleşmese de standardın RTCPeerConnection ile ilişkilendirilmiş bir türü vardır: peer-connection . |
Eski API'de yok |
Aşağıdaki istatistik türleri, karşılık gelen eski türe sahip olmayan standart API'ye eklenmiştir:
|
Eski ile standart metrik eşleme
Bu eşleştirmenin 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 edildiğ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ı (örneğin, 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;
Oranları ve ortalamaları kendiniz hesaplamak zorunda olmak külfetli ek bir adım gibi görünebilir, ancak istenen herhangi bir zaman aralığı için ortalamaları almanıza olanak tanıma avantajını da sunar. Standart API'yi eski API'ye göre daha az ç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 ters arama) |
.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ıdır. |
Yukarıdaki local-candidate ile aynıdır. |
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 belirtir. Örneğin, 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ışma
inbound-rtp , outbound-rtp , media-source |
---|---|
.audioInputLevel
|
media-source.audioLevel . Eski metrik [0..32768] aralığında ancak standart ölçüm [0..1] aralığında. |
.audioOutputLevel
|
inbound-rtp.audioLevel Eski metrik [0..32768] aralığında ancak standart ölçüm [0..1] aralığında. |
.packetsLost
|
inbound-rtp.packetsLost
|
.googTrackId
|
Yerel MediaStreamTrack 'ler için media-source.trackIdentifier ve uzak MediaStreamTrack 'lar için inbound-rtp.trackIdentifier |
.googRtt
|
remote-inbound-rtp.roundTripTime (outbound-rtp.remoteId politikasına bakın) |
.googEchoCancellationReturnLossEnhancement
|
inbound-rtp.echoReturnLossEnhancement
|
.googCodecName
|
codec adı, "tür/alt tür" mime türünün alt türüdü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 oranıdır. Ancak bu, aslında FPS kodlama olan 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 nedenlerle çözünürlük veya kare hızının kaç kez değiştirildiğini sayar. Bu durum, diğer metriklerden çıkarılabilir (ör. gönderme çözünürlüğünün veya kare hızının kaynak çözünürlüğünden ya da kare hızından farklı olması), ancak sınırladığımız süre (outbound-rtp.qualityLimitationDurations ), çözünürlüğün veya kare hızının yeniden yapılandırılma sıklığından 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
|
Gizlenen ö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 son zamanlarda 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
|
outbound-rtp.targetBitrate anlık değer olarak veya ortalama outbound-rtp.totalEncodedBytesTarget / outbound-rtp.framesEncoded |
.googActualEncBitrate
|
Kodlayıcı tarafından üretilen baytlar yük baytlarıdır. Yeniden iletimler hariçtir: outbound-rtp.bytesSent - outbound-rtp.retransmittedBytesSent değişim oranı. |
.googBucketDelay
|
outbound-rtp.totalPacketSendDelay / outbound-rtp.packetsSent
|
.googTransmitBitrate
|
RTP başına akış bit hızı için outbound-rtp.headerBytesSent + outbound-rtp.bytesSent değişim hızı, ICE aday bit hızı için candidate-pair.bytesSent veya aktarım başına bit hızı için transport.bytesSent |
.googRetransmitBitrate
|
outbound-rtp.retransmittedBytesSent değişim aralığı |
.googAvailableSendBandwidth
|
candidate-pair.availableOutgoingBitrate
|
.googAvailableReceiveBandwidth
|
candidate-pair.availableIncomingBitrate
|
Standart API eş zamanlı çalışmaya duyarlıdır
Eş zamanlı yayını kullanıyorsanız, üç ayrı SSRC üzerinden üç RTP akışı göndermek için simulcast kullanıyor olsanız bile eski API'nın yalnızca tek bir SSRC'yi bildirdiğini fark etmiş olabilirsiniz.
Standart API bu sınırlamayı paylaşmaz ve her SSRC'den bir tane olmak üzere üç outbound-rtp
istatistik nesnesi döndürür. Bu, her bir RTP akışını ayrı olarak 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ı sizin toplamanız gerektiği anlamına da gelir.
Öte yandan scalabilityMode
API'sı aracılığıyla yapılandırılmış birden fazla mekansal katman içeren SVC akışları veya RTP akışları, tek bir SSRC üzerinden gönderildiğinden tek bir outbound-rtp
olarak görünmeye devam eder.
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 sitelerine taşıma için daha fazla zaman tanır. Kaynak deneme jetonuyla, eski getStats() API, Chrome 121 sürümüne kadar kullanılmaya devam edebilir.