WebRTC: Eski getStats() taşıma rehberi

Henrik Boström
Henrik Boström

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:
  • codec: RTP akışı tarafından kodlama veya kod çözme amacıyla kullanılmakta olan bir codec. Bu, SDP'de üzerinde anlaşılan codec'lerin bir alt kümesidir.
  • remote-inbound-rtp: Bu uç noktanın gönderdiği giden RTP akışına karşılık gelen uzak bir uç noktanın gelen RTP akışı (outbound-rtp). Uzak uç noktasında ölçülür ve RTCP Alıcı Raporu (RR) veya RTCP Genişletilmiş Raporu'nda (XR) raporlanır.
  • remote-outbound-rtp: Uzak uç noktanın, bu uç noktanın aldığı gelen RTP akışına (inbound-rtp) karşılık gelen giden RTP akışı. Uzak uç noktada ölçülür ve RTCP Gönderen Raporu'nda (SR) raporlanır.
  • media-playout: Gelen RTP akışıyla (inbound-rtp) ilişkili uzak bir MediaStreamTrack oynatılmasıyla ilgili metrikler.
  • data-channel: Bir RTCDataChannel temsil eder.

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

inbound-rtp.qpSum ve outbound-rtp.qpSum

.framesEncoded outbound-rtp.framesEncoded
.googAvgEncodeMs

outbound-rtp.totalEncodeTime / outbound-rtp.framesEncoded

.codecImplementationName

inbound-rtp.decoderImplementation ve outbound-rtp.encoderImplementation

.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.