סוג המכשיר 'מצלמה' מיושם באמצעות שתי תכונות:
PushAvStreamTransport,
שמטפלת בהעברת זרמי אודיו ווידאו באמצעות פרוטוקולים מבוססי-דחיפה, ו-
WebRtcLiveView,
שמספקת את היכולת לשלוט בשידורים חיים ובדיבור חוזר.
סוג המכשיר Doorbell (פעמון לדלת), ביישומים שיש להם יכולות מצלמה, משתמש גם בתכונות האלה.
| Home APIs Device Type | תכונות | אפליקציה לדוגמה של Swift | תרחיש לדוגמה |
|---|---|---|---|
מצלמה
מכשיר שמצלם תמונות סטילס או סרטונים. המצלמות עשויות לכלול שידורים חיים נגישים, שיחה משני צידי הדלת או אירועי זיהוי. |
מאפיינים נדרשים google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
מצלמה | |
פעמון דלת
מכשיר שמפעילים באמצעות לחצן מחוץ לדלת, שמפיק אות קולי או חזותי, ומשמש לבקשת תשומת הלב של אדם שנמצא בצד השני של הדלת. יכול להיות שפעמוני הדלת יכללו שידורים חיים נגישים, תקשורת דו-כיוונית או אירועי זיהוי. |
מאפיינים נדרשים google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Doorbell |
התחלת שידור חי
כדי להתחיל שידור חי, שולחים את המחרוזת Session Description Protocol (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
כדי להפעיל את 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) } }