Jenis perangkat Kamera diimplementasikan menggunakan dua trait:
PushAvStreamTransport,
yang menangani transportasi streaming audio dan video menggunakan protokol berbasis push, dan
WebRtcLiveView,
yang memberikan kemampuan untuk mengontrol live stream dan talkback.
Jenis perangkat Bel Pintu, untuk penerapan yang memiliki kemampuan kamera, juga menggunakan trait ini.
| Jenis Perangkat Home API | Sifat | Aplikasi Contoh Swift | Kasus Penggunaan |
|---|---|---|---|
Kamera
Perangkat yang mengambil gambar diam atau merekam video. Kamera dapat menampilkan livestream yang mudah diakses, komunikasi dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kamera | |
Bel pintu
Perangkat yang diaktifkan oleh tombol di luar pintu yang menghasilkan sinyal suara dan/atau visual, yang digunakan untuk meminta perhatian orang yang berada di sisi lain pintu. Bel pintu mungkin memiliki fitur livestream yang dapat diakses, talkback dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Bel pintu |
Memulai livestream
Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode startLiveView() trait
WebRtcLiveView, yang menampilkan
WebRtcLiveViewTrait.StartLiveViewCommand.Response
yang berisi tiga nilai:
- SDP untuk sesi.
- Durasi sesi dalam detik.
- ID sesi, yang dapat digunakan untuk memperpanjang atau menghentikan sesi.
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)
Memperpanjang livestream
Livestream memiliki durasi preset setelah itu akan berakhir. Untuk memperpanjang durasi streaming aktif, kirim permintaan perpanjangan menggunakan metode
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 }
Mengaktifkan dan menonaktifkan kemampuan perekaman
Untuk mengaktifkan kemampuan perekaman kamera, teruskan
TransportStatusEnum.Active
ke metode
setTransportStatus()
trait
PushAvStreamTransport. Untuk menonaktifkan kemampuan perekaman, teruskan
TransportStatusEnum.Inactive.
Dalam contoh berikut, kita menggabungkan panggilan ini dalam satu panggilan yang menggunakan
Boolean untuk mengaktifkan/menonaktifkan kemampuan perekaman:
// 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) } }
Periksa apakah kemampuan perekaman diaktifkan
Untuk menentukan apakah kemampuan perekaman kamera diaktifkan, periksa apakah ada koneksi yang aktif. Contoh berikut menentukan dua fungsi untuk melakukannya:
// 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 }
Cara lain untuk memeriksa adalah dengan menggunakan fungsi findTransport() dengan predikat:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Memulai dan menghentikan TalkBack
Untuk memulai talkback, panggil metode WebRtcLiveView dari sifat startTalkback(). Untuk berhenti, gunakan
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) } }