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