Le type d'appareil "Caméra" est implémenté à l'aide de deux traits :
PushAvStreamTransport
, qui gère le transport des flux audio et vidéo à l'aide de protocoles basés sur le push, et
WebRtcLiveView
, qui permet de contrôler les diffusions en direct et la fonctionnalité Talkback.
Le type d'appareil Doorbell, pour les implémentations dotées de fonctionnalités de caméra, utilise également ces traits.
Type d'appareil des API Home | Traits | Exemple d'application Kotlin | Cas d'utilisation |
---|---|---|---|
Appareil photo
Appareil qui prend des photos ou enregistre des vidéos. Les caméras peuvent proposer des diffusions en direct accessibles, une fonctionnalité d'interphone ou des événements de détection. |
Traits requis google PushAvStreamTransport google WebRtcLiveView |
Appareil photo | |
Sonnette
Appareil actionné par un bouton situé à l'extérieur d'une porte, qui émet un signal sonore et/ou visuel pour attirer l'attention d'une personne se trouvant de l'autre côté de la porte. Les sonnettes peuvent proposer des diffusions en direct accessibles, une fonction micro ou des événements de détection. |
Traits requis google PushAvStreamTransport google WebRtcLiveView |
Sonnette |
Lancer une diffusion en direct
Pour lancer une diffusion en direct, envoyez la chaîne SDP (Session Description Protocol) à la méthode startLiveView()
du trait WebRtcLiveView
, qui renvoie un WebRtcLiveViewTrait.StartLiveViewCommand.Response
contenant trois valeurs :
- SDP de la session.
- Durée de la session en secondes.
- ID de la session, qui peut être utilisé pour la prolonger ou la terminer.
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)
Prolonger une diffusion en direct
Les diffusions en direct ont une durée prédéfinie au terme de laquelle elles expirent. Pour prolonger la durée d'un flux actif, envoyez une demande de prolongation à l'aide de la méthode 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 }
Activer et désactiver la fonctionnalité d'enregistrement
Pour activer la fonctionnalité d'enregistrement de la caméra, transmettez TransportStatusEnum.Active
à la méthode setTransportStatus()
du trait PushAvStreamTransport
. Pour désactiver la fonctionnalité d'enregistrement, transmettez-la TransportStatusEnum.Inactive
.
Dans l'exemple suivant, nous encapsulons ces appels dans un seul appel qui utilise un Boolean
pour activer ou désactiver la fonctionnalité d'enregistrement :
// 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) } }
Vérifier si la fonctionnalité d'enregistrement est activée
Pour savoir si la fonctionnalité d'enregistrement d'une caméra est activée, vérifiez si des connexions sont actives. L'exemple suivant définit deux fonctions pour ce faire :
// 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 }
Vous pouvez également utiliser la fonction findTransport()
avec un prédicat :
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Démarrer et arrêter TalkBack
Pour démarrer TalkBack, appelez la méthode startTalkback()
du trait WebRtcLiveView
. Pour arrêter, utilisez 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) } }