نوع دستگاه دوربین با استفاده از دو ویژگی پیادهسازی میشود: PushAvStreamTransport
، که انتقال جریان صوتی و تصویری را با استفاده از پروتکلهای مبتنی بر فشار انجام میدهد، و WebRtcLiveView
، که توانایی کنترل جریانهای زنده و گفتگو را فراهم میکند. نوع دستگاه Doorbell برای آن دسته از پیاده سازی هایی که دارای قابلیت دوربین هستند نیز از این ویژگی ها استفاده می کند.
APIهای خانگی نوع دستگاه | صفات | برنامه نمونه کاتلین | استفاده از مورد |
---|---|---|---|
دوربین دستگاهی که تصاویر ثابت یا فیلم می گیرد. دوربینها ممکن است پخش زنده قابل دسترسی، گفتگوی دوطرفه یا رویدادهای شناسایی را داشته باشند. | صفات مورد نیاز google PushAvStreamTransport google WebRtcLiveView | دوربین | |
زنگ در دستگاهی که توسط دکمهای در خارج از در فعال میشود و سیگنال شنیداری و/یا بصری ایجاد میکند و برای درخواست توجه شخصی که جایی در طرف دیگر در است استفاده میشود. زنگ درها ممکن است دارای پخش زنده قابل دسترسی، گفتگوی دو طرفه یا رویدادهای شناسایی باشند. | صفات مورد نیاز google PushAvStreamTransport google WebRtcLiveView | زنگ در |
پخش زنده را شروع کنید
برای شروع پخش زنده، رشته پروتکل شرح جلسه (SDP) را به متد startLiveView()
صفت WebRtcLiveView
ارسال کنید که یک 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 }
قابلیت ضبط را فعال و غیرفعال کنید
برای فعال کردن قابلیت ضبط دوربین، TransportStatusEnum.Active
را به متد setTransportStatus()
ویژگی PushAvStreamTransport
منتقل کنید. برای غیرفعال کردن قابلیت ضبط، آن را ارسال کنید 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 }
روش دیگر برای بررسی استفاده از تابع 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 } }
شروع و توقف گفتگو
برای شروع تاک بک، متد startTalkback()
صفت WebRtcLiveView
را فراخوانی کنید. برای توقف، از 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) } }