লিগ্যাসি getStats()
WebRTC API Chrome 117-এ সরিয়ে দেওয়া হবে, তাই এটি ব্যবহার করা অ্যাপগুলিকে স্ট্যান্ডার্ড API-এ স্থানান্তর করতে হবে। এই নিবন্ধটি ব্যাখ্যা করে যে কীভাবে আপনার কোড স্থানান্তর করতে হয় এবং এই পরিবর্তনটি করার জন্য আপনার আরও সময় প্রয়োজন হলে কী করতে হবে।
ঐতিহাসিকভাবে WebRTC getStats()
API-এর দুটি প্রতিযোগী সংস্করণ রয়েছে। লিগ্যাসি getStats() API, যা প্রমিতকরণ প্রক্রিয়ার পূর্ব-তারিখ করে এবং একটি কলব্যাক আর্গুমেন্ট নেয়, এবং প্রমিত এবং ব্যাপকভাবে সমর্থিত API যা একটি প্রতিশ্রুতি প্রদান করে।
স্ট্যান্ডার্ড API আরও বৈশিষ্ট্য সমৃদ্ধ এবং WebRTC-এর পরিসংখ্যান API-এর জন্য W3C স্পেসিফিকেশন আইডেন্টিফায়ারে সর্বজনীনভাবে নথিভুক্ত সু-সংজ্ঞায়িত মেট্রিক্স রয়েছে। স্পেসিফিকেশন এই নির্দেশিকায় তালিকাভুক্ত প্রতিটি মেট্রিকের বিবরণ এবং আরও অনেক কিছু অন্তর্ভুক্ত করে।
ক্রোম 117 থেকে লিগ্যাসি getStats()
API স্থিতিশীল রিলিজ চ্যানেলে একটি ব্যতিক্রম নিক্ষেপ করবে (ব্যতিক্রম নিক্ষেপটি ধীরে ধীরে রোল আউট করা হবে)। স্ট্যান্ডার্ড API এ আপনার স্থানান্তর সহজ করতে এই নির্দেশিকা অনুসরণ করুন।
উত্তরাধিকার বনাম স্ট্যান্ডার্ড পরিসংখ্যান প্রকার
স্ট্যান্ডার্ড পরিসংখ্যান প্রকারের সম্পূর্ণ তালিকা স্পেসিফিকেশনে RTCSstatsType enum দেখে পাওয়া যাবে। এর মধ্যে রয়েছে কোন পরিসংখ্যান অভিধান সংজ্ঞা প্রতিটি প্রকারের জন্য সংগৃহীত মেট্রিক্স বর্ণনা করে।
সমস্ত পরিসংখ্যান অবজেক্টের একটি আইডি বৈশিষ্ট্য রয়েছে যা একাধিক getStats()
কল জুড়ে অন্তর্নিহিত বস্তুটিকে অনন্যভাবে সনাক্ত করে। প্রতিবার পদ্ধতিটি কল করার সময় একই বস্তুর একই আইডি থাকবে। এটি মেট্রিক্স পরিবর্তনের হার গণনা করার জন্য দরকারী (পরবর্তী বিভাগে একটি উদাহরণ আছে)। আইডিগুলিও রেফারেন্সের সম্পর্ক তৈরি করে। উদাহরণস্বরূপ outbound-rtp
পরিসংখ্যান অবজেক্ট outbound-rtp.mediaSourceId
অ্যাট্রিবিউটের মাধ্যমে সংশ্লিষ্ট media-source
পরিসংখ্যান অবজেক্টকে উল্লেখ করে। আপনি যদি সমস্ত ...Id
সম্পর্ক আঁকেন তবে আপনি একটি গ্রাফ পাবেন।
লিগ্যাসি এপিআই-এর নিম্নলিখিত পরিসংখ্যানের ধরন রয়েছে, যা নিম্নরূপ মানক প্রকারের সাথে সম্পর্কিত:
উত্তরাধিকার প্রকার | স্ট্যান্ডার্ড টাইপ |
---|---|
ssrc | সম্পর্কিত MediaStreamTrack সম্পর্কে একটি RTP স্ট্রীম এবং মেট্রিক্সের প্রতিনিধিত্ব করে।এর জন্য স্ট্যান্ডার্ড প্রকারগুলি হল inbound-rtp (আরটিপি স্ট্রিমগুলি গ্রহণ করার জন্য এবং এর সাথে সম্পর্কিত রিমোট MediaStreamTrack ), outbound-rtp (আরটিপি স্ট্রীম পাঠানোর জন্য) এবং media-source (প্রেরিত আরটিপি স্ট্রিমের সাথে যুক্ত স্থানীয় MediaStreamTrack মেট্রিক্সের জন্য)। আরটিপি স্ট্রিম মেট্রিক্সে আরটিপি স্ট্রীম দ্বারা ব্যবহৃত এনকোডার বা ডিকোডার সম্পর্কেও তথ্য থাকে। |
VideoBwe | ব্যান্ডউইথ অনুমান মেট্রিক্স, লক্ষ্য বিটরেট, এনকোডার বিটরেট এবং প্রকৃত বিটরেট। এই ধরনের মেট্রিক্স হল RTP মেট্রিক্স ( outbound-rtp এবং inbound-rtp ) এবং আইসিই প্রার্থী পেয়ার মেট্রিক্স ( candidate-pair ) এর অংশ। |
googComponent | পরিবহন প্রতিনিধিত্ব করে (আইসিই এবং ডিটিএলএস)। স্ট্যান্ডার্ড সংস্করণ transport . |
localcandidate and remotecandidate | একজন ICE প্রার্থীর প্রতিনিধিত্ব করে। স্ট্যান্ডার্ড সংস্করণ হল local-candidate এবং remote-candidate । |
googCandidatePair | একটি ICE প্রার্থী জুটির প্রতিনিধিত্ব করে, যা একটি স্থানীয় এবং একটি দূরবর্তী প্রার্থীর জোড়া। আদর্শ সংস্করণ candidate-pair হয়। |
googCertificate | DTLS পরিবহন দ্বারা ব্যবহৃত একটি শংসাপত্রের প্রতিনিধিত্ব করে। স্ট্যান্ডার্ড সংস্করণ হল certificate । |
googLibjingleSession | RTCPeerConnection প্রতিনিধিত্ব করে। যদিও এর বিষয়বস্তু স্ট্যান্ডার্ডের কোনো কিছুর সাথে মানচিত্র করে না, স্ট্যান্ডার্ডে RTCPeerConnection : peer-connection সাথে যুক্ত একটি প্রকার রয়েছে। |
উত্তরাধিকার API থেকে অনুপস্থিত | এই পরিসংখ্যানের ধরনগুলি স্ট্যান্ডার্ড API-এ যোগ করা হয়েছে যেগুলির কোনও অনুরূপ উত্তরাধিকার প্রকার নেই:
|
স্ট্যান্ডার্ড মেট্রিক্স ম্যাপিং থেকে উত্তরাধিকার
এই ম্যাপিংটি ডেভেলপারদের কোন লিগ্যাসি মেট্রিক কোন স্ট্যান্ডার্ড মেট্রিকের সাথে সামঞ্জস্যপূর্ণ তা খুঁজে বের করতে সাহায্য করার লক্ষ্য, কিন্তু মনে রাখবেন যে সংশ্লিষ্ট মেট্রিক বিভিন্ন ইউনিট ব্যবহার করতে পারে বা তাত্ক্ষণিক মানের পরিবর্তে মোট কাউন্টার হিসাবে প্রকাশ করা যেতে পারে। মেট্রিক সংজ্ঞার জন্য স্পেসিফিকেশন পড়ুন।
স্ট্যান্ডার্ড API হারের পরিবর্তে মোট কাউন্টারগুলি প্রকাশ করা পছন্দ করে। এর মানে হল লিগ্যাসি API-এর মতো সংশ্লিষ্ট হার (উদাহরণস্বরূপ, বিটরেট) পেতে, অ্যাপটিকে অবশ্যই দুটি getStats()
কলের মধ্যে ডেল্টা নিয়ে গড় হার গণনা করতে হবে। যেমন:
// 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;
নিজেকে এইভাবে হার এবং গড় গণনা করা একটি কষ্টকর অতিরিক্ত পদক্ষেপ বলে মনে হতে পারে তবে এটি আপনাকে যে কোনও পছন্দসই সময়ের ব্যবধানে গড় পেতে অনুমতি দেয়। স্ট্যান্ডার্ড API-কে কম ঘন ঘন কল করলে আপনার অন্যথায় লিগ্যাসি API-এর সাথে কিছু কর্মক্ষমতা সুবিধা থাকতে পারে।
উত্তরাধিকার মেট্রিকgoogCertificate | স্ট্যান্ডার্ড চিঠিপত্রcertificate |
---|---|
.googFingerprint | .fingerprint |
.googFingerprintAlgorithm | .fingerprintAlgorithm |
.googDerBase64 | .base64Certificate |
উত্তরাধিকার মেট্রিকgoogComponent | স্ট্যান্ডার্ড চিঠিপত্রtransport |
---|---|
.localCertificateId | .localCertificateId |
.remoteCertificateId | .remoteCertificateId |
.selectedCandidatePairId | .selectedCandidatePairId |
.dtlsCipher | .dtlsCipher |
.srtpCipher | .srtpCipher |
উত্তরাধিকার মেট্রিকlocalcandidate | স্ট্যান্ডার্ড চিঠিপত্রlocal-candidate বা candidate-pair |
---|---|
.stunKeepaliveRequestsSent | candidate-pair.requestsSent (উল্টো লুকআপ candidate-pair candidate-pair.localCandidateId মাধ্যমে) |
.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 |
উত্তরাধিকার মেট্রিকremotecandidate | স্ট্যান্ডার্ড চিঠিপত্রremote-candidate |
---|---|
উপরে localcandidate হিসাবে একই. | উপরে local-candidate হিসাবে একই. |
উত্তরাধিকার মেট্রিকgoogCandidatePair | স্ট্যান্ডার্ড চিঠিপত্রcandidate-pair |
---|---|
.responsesSent | candidate-pair.responsesSent |
.requestsReceived | candidate-pair.requestsReceived |
.googRemoteCandidateType | remote-candidate.candidateType (এর মাধ্যমে remote-candidate সন্ধান করুনcandidate-pair.remoteCandidateId ) |
.googReadable | googReadable হল একটি বুলিয়ান যা প্রতিফলিত করে যে আমরা সম্প্রতি candidate-pair.requestsReceived বা candidate-pair.responsesReceived বৃদ্ধি করেছি কিনা। |
.googLocalAddress | local-candidate.address (এর মাধ্যমে local-candidate সন্ধান করুনcandidate-pair.localCandidateId ) |
.consentRequestsSent | candidate-pair.consentRequestsSent |
.googTransportType | local-candidate.protocol এবং remote-candidate.protocol এর মতোই। |
.googChannelId | candidate-pair.transportId |
.googLocalCandidateType | local-candidate.candidateType |
.googWritable | googWritable হল একটি বুলিয়ান যা প্রতিফলিত করে আমরা সম্প্রতি candidate-pair.responsesReceived বৃদ্ধি করেছি কি না |
.googRemoteAddress | remote-candidate.address |
.googRtt | candidate-pair.currentRoundTripTime |
.googActiveConnection | সক্রিয় সংযোগটি বর্তমানে পরিবহণ দ্বারা নির্বাচিত প্রার্থী জোড়াকে বোঝায়, যেমন 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 |
উত্তরাধিকার মেট্রিকssrc | স্ট্যান্ডার্ড চিঠিপত্রinbound-rtp , outbound-rtp , media-source |
---|---|
.audioInputLevel | media-source.audioLevel লিগ্যাসি মেট্রিকটি পরিসরে [0..32768] কিন্তু স্ট্যান্ডার্ড মেট্রিকটি পরিসরে [0..1]। |
.audioOutputLevel | inbound-rtp.audioLevel লিগ্যাসি মেট্রিকটি পরিসরে [0..32768] কিন্তু স্ট্যান্ডার্ড মেট্রিকটি পরিসরে [0..1]। |
.packetsLost | inbound-rtp.packetsLost |
.googTrackId | স্থানীয় MediaStreamTrack এর জন্য media-source.trackIdentifier এবং দূরবর্তী MediaStreamTrack এর জন্য inbound-rtp.trackIdentifier |
.googRtt | remote-inbound-rtp.roundTripTime (দেখুন outbound-rtp.remoteId ) |
.googEchoCancellationReturnLossEnhancement | inbound-rtp.echoReturnLossEnhancement |
.googCodecName | কোডেক নাম হল "টাইপ/সাবটাইপ" মাইম টাইপের সাবটাইপ, codec.mimeType (দেখুন inbound-rtp.codecId এবং outbound-rtp.codecId ) |
.transportId | inbound-rtp.transportId এবং outbound-rtp.transportId |
.mediaType | inbound-rtp.kind এবং outbound-rtp.kind বা media-source.kind |
.googEchoCancellationReturnLoss | inbound-rtp.echoReturnLoss |
.totalAudioEnergy | inbound-rtp.totalAudioEnergy এবং media-source.totalAudioEnergy |
ssrc.totalSamplesDuration | inbound-rtp.totalSamplesDuration এবং media-source.totalSamplesDuration |
.ssrc | inbound-rtp.ssrc এবং outbound-rtp.ssrc |
.googJitterReceived | inbound-rtp.jitter |
.packetsSent | outbound-rtp.packetsSent |
.bytesSent | outbound-rtp.bytesSent |
.googContentType | inbound-rtp.contentType এবং outbound-rtp.contentType |
.googFrameWidthInput | media-source.width |
.googFrameHeightInput | media-source.height |
.googFrameRateInput | media-source.framesPerSecond |
.googFrameWidthSent | outbound-rtp.frameWidth |
.googFrameHeightSent | outbound-rtp.frameHeight |
.googFrameRateSent | যদিও Send FPS হল outbound-rtp.framesSent এর পরিবর্তনের হার, এটি আসলে outbound-rtp.framesPerSecond হিসাবে প্রয়োগ করা হয় যা FPS এনকোডিং করে। |
.googFrameWidthReceived | inbound-rtp.frameWidth |
.googFrameHeightReceived | inbound-rtp.frameHeight |
.googFrameRateDecoded | inbound-rtp.framesDecoded এর পরিবর্তনের হার ডিকোডেড |
.googFrameRateOutput | inbound-rtp.framesDecoded এর পরিবর্তনের হার ডিকোডেড - inbound-rtp.framesDropped |
.hugeFramesSent | outbound-rtp.hugeFramesSent |
.qpSum | |
.framesEncoded | outbound-rtp.framesEncoded |
.googAvgEncodeMs | |
.codecImplementationName | |
.googCpuLimitedResolution | সত্য যদি outbound-rtp.qualityLimitationReason == "cpu" |
.googBandwidthLimitedResolution | সত্য যদি outbound-rtp.qualityLimitationReason == "bandwidth" |
.googAdaptationChanges | লিগ্যাসি মেট্রিক qualityLimitationReason কারণে কতবার রেজোলিউশন বা ফ্রেম রেট পরিবর্তিত হয়েছে তা গণনা করে। এটি অন্যান্য মেট্রিক্স থেকে অনুমান করা যেতে পারে (যেমন পাঠান রেজোলিউশন বা ফ্রেম রেট সোর্স রেজোলিউশন বা ফ্রেম রেট থেকে আলাদা), কিন্তু আমরা যে সময়কাল সীমিত করেছি, outbound-rtp.qualityLimitationDurations , কত ঘন ঘন রেজোলিউশন বা ফ্রেম রেট তার চেয়ে বেশি কার্যকর হতে পারে পরিবর্তিত পুনরায় কনফিগার করা হয়েছে. |
.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 | ত্রুটি সংশোধন ধারণকারী প্যাকেটের সাম্প্রতিক অনুপাত: inbound-rtp.fecPacketsReceived - inbound-rtp.fecPacketsDiscarded |
.packetsReceived | inbound-rtp.packetsReceived |
.googJitterBufferMs | inbound-rtp.jitterBufferDelay / inbound-rtp.jitterBufferEmittedCount |
.googTargetDelayMs (ভিডিও) | inbound-rtp.jitterBufferTargetDelay / inbound-rtp.jitterBufferEmittedCount |
.googPreferredJitterBufferMs (অডিও) | inbound-rtp.jitterBufferTargetDelay / inbound-rtp.jitterBufferEmittedCount |
.googExpandRate | গোপন নমুনার সাম্প্রতিক অনুপাত: inbound-rtp.concealedSamples / inbound-rtp.totalSamplesReceived |
.googSpeechExpandRate | স্ট্রীমটি নীরব না থাকাকালীন গোপন নমুনার সাম্প্রতিক অনুপাত: এর ( inbound-rtp.concealedSamples - inbound-rtp.silentConcealedSamples ) / inbound-rtp.concealedSamples |
.googAccelerateRate | প্লেআউটের গতি ত্বরান্বিত করার জন্য বাতিল করা নমুনার সাম্প্রতিক অনুপাত: inbound-rtp.removedSamplesForAcceleration / inbound-rtp.totalSamplesReceived |
.googPreemptiveExpandRate | প্লেআউটের গতি কমানোর জন্য সংশ্লেষিত করা নমুনার সাম্প্রতিক অনুপাত: 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 | শুধুমাত্র অবশিষ্ট goog-মেট্রিক। inbound-rtp.googTimingFrameInfo |
.framesDecoded | inbound-rtp.framesDecoded |
উত্তরাধিকার মেট্রিকVideoBwe | স্ট্যান্ডার্ড চিঠিপত্রoutbound-rtp এবং candidate-pair |
---|---|
.googTargetEncBitrate | একটি তাত্ক্ষণিক মান হিসাবে outbound-rtp.targetBitrate বা outbound-rtp.totalEncodedBytesTarget / outbound-rtp.framesEncoded গড় হিসাবে এনকোড করা |
.googActualEncBitrate | এনকোডার দ্বারা উত্পাদিত বাইট হল পেলোড বাইট, রিট্রান্সমিশন বাদ দিয়ে: outbound-rtp.bytesSent outbound-rtp.retransmittedBytesSent এর পরিবর্তনের হার |
.googBucketDelay | outbound-rtp.totalPacketSendDelay / outbound-rtp.packetsSent |
.googTransmitBitrate | প্রতি-RTP স্ট্রিম বিটরেটের জন্য outbound-rtp.headerBytesSent + outbound-rtp.bytesSent , প্রতি-ICE প্রার্থীর বিটরেটের জন্য candidate-pair.bytesSent বা প্রতি-পরিবহন বিটরেটের জন্য transport.bytesSent এর পরিবর্তনের হার |
.googRetransmitBitrate | outbound-rtp.retransmittedBytesSent এর পরিবর্তনের পরিসর |
.googAvailableSendBandwidth | candidate-pair.availableOutgoingBitrate |
.googAvailableReceiveBandwidth | candidate-pair.availableIncomingBitrate |
স্ট্যান্ডার্ড API হল simulcast-সচেতন
আপনি যদি সিমুলকাস্ট ব্যবহার করেন তবে আপনি লক্ষ্য করেছেন যে লিগ্যাসি API শুধুমাত্র একটি একক SSRC রিপোর্ট করে এমনকি আপনি যখন সিমুলকাস্ট ব্যবহার করছেন (উদাহরণস্বরূপ) তিনটি আলাদা SSRC-তে তিনটি RTP স্ট্রীম পাঠান।
স্ট্যান্ডার্ড API এই সীমাবদ্ধতা ভাগ করে না এবং তিনটি outbound-rtp
পরিসংখ্যান বস্তু ফেরত দেবে, প্রতিটি SSRC-এর জন্য একটি। এর মানে হল যে আপনি প্রতিটি RTP স্ট্রীম আলাদাভাবে বিশ্লেষণ করতে পারেন, কিন্তু এর মানে হল যে সমস্ত RTP সেন্ড স্ট্রীমগুলির মোট বিটরেট পেতে আপনাকে সেগুলিকে একত্রিত করতে হবে।
অন্যদিকে SVC স্ট্রীম বা RTP স্ট্রীমগুলি একাধিক স্থানিক স্তর সহ scalabilityMode
API এর মাধ্যমে কনফিগার করা হয়েছে এখনও একটি একক outbound-rtp
হিসাবে দেখায় কারণ এগুলি একটি একক SSRC-তে পাঠানো হয়৷
আপনার যদি মাইগ্রেশনের জন্য আরও সময় লাগে
যখন লিগ্যাসি API Chrome 117 এ সরানো হয়, তখন এটি ব্যবহার করলে একটি ব্যতিক্রম তৈরি হবে। আপনি যদি সময়মতো আপনার কোড স্থানান্তর করতে না পারেন, তাহলে RTCPeerConnection কলব্যাক-ভিত্তিক getStats() API-এর অরিজিন ট্রায়াল নিবন্ধিত ওয়েবসাইটগুলিকে মাইগ্রেট করার জন্য আরও সময় দেয়৷ একটি অরিজিন ট্রায়াল টোকেন সহ, লিগ্যাসি getStats() API Chrome 121 পর্যন্ত ব্যবহার করা চালিয়ে যেতে পারে।