WebRTC: লিগ্যাসি getStats() মাইগ্রেশন গাইড

হেনরিক বোস্ট্রোম
Henrik Boström

লিগ্যাসি 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-এ যোগ করা হয়েছে যেগুলির কোনও অনুরূপ উত্তরাধিকার প্রকার নেই:
  • codec : একটি কোডেক যা বর্তমানে একটি RTP স্ট্রিম দ্বারা ব্যবহৃত হচ্ছে, হয় এনকোডিং বা ডিকোডিংয়ের জন্য। এটি কোডেকগুলির একটি উপসেট যা SDP-তে আলোচনা করা হয়েছে৷
  • remote-inbound-rtp : একটি দূরবর্তী এন্ডপয়েন্টের অন্তর্মুখী RTP স্ট্রীম একটি আউটবাউন্ড RTP স্ট্রীমের সাথে সম্পর্কিত যা এই এন্ডপয়েন্টটি পাঠাচ্ছে ( outbound-rtp )। এটি দূরবর্তী প্রান্তে পরিমাপ করা হয় এবং একটি RTCP রিসিভার রিপোর্ট (RR) বা RTCP এক্সটেন্ডেড রিপোর্টে (XR) রিপোর্ট করা হয়।
  • remote-outbound-rtp : একটি রিমোট এন্ডপয়েন্টের আউটবাউন্ড আরটিপি স্ট্রীম একটি ইনবাউন্ড আরটিপি স্ট্রিমের সাথে সম্পর্কিত যা এই এন্ডপয়েন্টটি গ্রহণ করছে ( inbound-rtp )। এটি দূরবর্তী প্রান্তে পরিমাপ করা হয় এবং একটি RTCP প্রেরক প্রতিবেদনে (SR) রিপোর্ট করা হয়।
  • media-playout : একটি ইনবাউন্ড আরটিপি স্ট্রিম ( inbound-rtp ) এর সাথে যুক্ত রিমোট MediaStreamTrack প্লেআউট সম্পর্কে মেট্রিক্স।
  • data-channel : একটি RTCDataChannel প্রতিনিধিত্ব করে।

স্ট্যান্ডার্ড মেট্রিক্স ম্যাপিং থেকে উত্তরাধিকার

এই ম্যাপিংটি ডেভেলপারদের কোন লিগ্যাসি মেট্রিক কোন স্ট্যান্ডার্ড মেট্রিকের সাথে সামঞ্জস্যপূর্ণ তা খুঁজে বের করতে সাহায্য করার লক্ষ্য, কিন্তু মনে রাখবেন যে সংশ্লিষ্ট মেট্রিক বিভিন্ন ইউনিট ব্যবহার করতে পারে বা তাত্ক্ষণিক মানের পরিবর্তে মোট কাউন্টার হিসাবে প্রকাশ করা যেতে পারে। মেট্রিক সংজ্ঞার জন্য স্পেসিফিকেশন পড়ুন।
স্ট্যান্ডার্ড 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

inbound-rtp.qpSum এবং outbound-rtp.qpSum

.framesEncoded outbound-rtp.framesEncoded
.googAvgEncodeMs

outbound-rtp.totalEncodeTime / outbound-rtp.framesEncoded

.codecImplementationName

inbound-rtp.decoderImplementation এবং outbound-rtp.encoderImplementation

.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 পর্যন্ত ব্যবহার করা চালিয়ে যেতে পারে।