ক্যামেরা ডিভাইসের ধরন দুটি বৈশিষ্ট্য ব্যবহার করে প্রয়োগ করা হয়েছে: PushAvStreamTransport
, যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveView
, যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে। ডোরবেল ডিভাইসের ধরন, ক্যামেরার ক্ষমতা আছে এমন বাস্তবায়নের জন্যও এই বৈশিষ্ট্যগুলি ব্যবহার করে।
হোম এপিআই ডিভাইসের ধরন | বৈশিষ্ট্য | কোটলিন নমুনা অ্যাপ | কেস ব্যবহার করুন |
---|---|---|---|
ক্যামেরা একটি ডিভাইস যা স্থির ছবি বা ভিডিও ক্যাপচার করে। ক্যামেরাগুলি অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক, বা সনাক্তকরণ ইভেন্টগুলি ফিচার করতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য google PushAvStreamTransport google WebRtcLiveView | ক্যামেরা | |
ডোরবেল দরজার বাইরে একটি বোতাম দ্বারা সঞ্চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা ভিজ্যুয়াল সিগন্যাল তৈরি করে, যেটি দরজার অন্য পাশে থাকা একজন ব্যক্তির দৃষ্টি আকর্ষণ করতে ব্যবহৃত হয়। ডোরবেলে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক বা সনাক্তকরণ ইভেন্টগুলি বৈশিষ্ট্যযুক্ত হতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য google PushAvStreamTransport google WebRtcLiveView | ডোরবেল |
একটি লাইভস্ট্রিম শুরু করুন
একটি লাইভস্ট্রিম শুরু করতে, WebRtcLiveView
বৈশিষ্ট্যের startLiveView()
পদ্ধতিতে সেশন বর্ণনা প্রোটোকল (SDP) স্ট্রিং পাঠান, যা তিনটি মান ধারণকারী একটি WebRtcLiveViewTrait.StartLiveViewCommand.Response
প্রদান করে:
- অধিবেশনের জন্য SDP.
- সেকেন্ডে সেশনের সময়কাল।
- সেশন আইডি, যা সেশন প্রসারিত বা শেষ করতে ব্যবহার করা যেতে পারে।
suspend fun getWebRtcLiveViewTrait(cameraDevice, cameraDeviceType) { return cameraDevice.type(cameraDeviceType).trait(WebRtcLiveView).first { it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE } } // Start the live view suspend fun startCameraStream(trait: WebRtcLiveView,offerSdp: String) { val response = trait.startLiveView(offerSdp) // Response contains three fields (see below) return response } ... // This is used to manage the WebRTC connection val peerConnection: RTCPeerConnection = ... ... val startResponse = startCameraStream(sdp) val answerSdp = startResponse?.answerSdp val sessionDuration = startResponse?.liveSessionDurationSeconds val mediaSessionId = startResponse?.mediaSessionId peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER, answerSdp)
একটি লাইভস্ট্রিম প্রসারিত করুন
লাইভস্ট্রিমগুলির একটি পূর্বনির্ধারিত সময়কাল থাকে যার পরে সেগুলি মেয়াদ শেষ হয়ে যায়। একটি সক্রিয় স্ট্রিমের সময়কাল বাড়ানোর জন্য, WebRtcLiveView.extendLiveView()
পদ্ধতি ব্যবহার করে একটি এক্সটেনশন অনুরোধ জারি করুন:
// Assuming camera stream has just been started suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) { delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000) val response = trait.extendLiveView(mediaSessionId) // returns how long the session will be live for return response.liveSessionDurationSeconds }
রেকর্ডিং ক্ষমতা সক্ষম এবং অক্ষম করুন
ক্যামেরার রেকর্ডিং ক্ষমতা সক্ষম করতে, PushAvStreamTransport
বৈশিষ্ট্যের setTransportStatus()
পদ্ধতিতে TransportStatusEnum.Active
পাস করুন। রেকর্ডিং ক্ষমতা নিষ্ক্রিয় করতে, এটি TransportStatusEnum.Inactive
পাস করুন। নিম্নলিখিত উদাহরণে, আমরা এই কলগুলিকে একটি একক কলে মোড়ানো যা রেকর্ডিং ক্ষমতা টগল করতে Boolean
ব্যবহার করে:
// Start or stop recording for all connections. suspend fun setCameraRecording(isOn: Boolean) { val pushAvStreamTransport = getPushAvStreamTransport if(isOn) { pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Active) } else { pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Inactive) } }
রেকর্ডিং সক্ষমতা সক্ষম কিনা তা দেখতে পরীক্ষা করুন৷
একটি ক্যামেরার রেকর্ডিং সক্ষমতা সক্ষম কিনা তা নির্ধারণ করতে, কোনো সংযোগ সক্রিয় আছে কিনা তা পরীক্ষা করুন৷ নিম্নলিখিত উদাহরণটি এটি করার জন্য দুটি ফাংশন সংজ্ঞায়িত করে:
// Get the on/off state suspend fun onOffState(cameraDevice: HomeDevice, cameraDeviceType) { // Query the device for pushAvStreamTransport val pushAvTrait = getPushAvStreamTransport() return pushAvTrait.recordModeActive() } // Check to see if the camera's recording capability is enabled fun PushAvStreamTransport.recordModeActive(): Boolean { return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false }
চেক করার আরেকটি উপায় হল একটি predicate সহ findTransport()
ফাংশন ব্যবহার করা:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
শুরু করুন এবং টকব্যাক বন্ধ করুন
টকব্যাক শুরু করতে, WebRtcLiveView
বৈশিষ্ট্যের startTalkback()
পদ্ধতিতে কল করুন। থামাতে, stopTalkback()
ব্যবহার করুন।
// Make sure camera stream is on suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) { if(isOn) { trait.startTalkback(mediaSessionId) } else { trait.stopTalkback(mediaSessionId) } }