WebRTC: Eski getStats() taşıma rehberi

Henrik Boström
Henrik Boström

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

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

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