WebRTC: Eski getStats() taşıma rehberi

Henrik Boström
Henrik Boström

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:
  • codec: Şu anda bir RTP akışı tarafından kodlama veya kod çözme için kullanılan codec. Bu, SDP'de pazarlık yapılan codec'lerin alt kümesidir.
  • remote-inbound-rtp: Uzak uç noktanın, bu uç noktanın gönderdiği giden RTP akışına (outbound-rtp) karşılık gelen gelen RTP akışı. Uzak uç noktada ö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ığı bir gelen RTP akışına (inbound-rtp) karşılık gelen giden RTP akışı. Uzak uç noktada ölçülür ve bir RTCP Gönderen Raporu'nda (SR) raporlanır.
  • media-playout: Gelen bir RTP akışıyla (inbound-rtp) ilişkili uzak MediaStreamTrack oynatmayla ilgili metrikler.
  • data-channel: RTCDataChannel değerini temsil eder.

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

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