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 Kotlin | Kasus Penggunaan |
---|---|---|---|
Kamera
Perangkat yang mengambil gambar diam atau merekam video. Kamera dapat menampilkan livestream yang dapat diakses, komunikasi dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransport google WebRtcLiveView |
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 live stream yang dapat diakses, talkback dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransport google WebRtcLiveView |
Bel Pintu |
Memulai livestream
Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode startLiveView()
dari 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
Live stream memiliki durasi preset setelah itu live stream 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 merekam, 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 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 startTalkback()
trait WebRtcLiveView
. 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) } }