Guide des caméras pour Android

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

GoogleCameraDevice

home.matter.6006.types.0158

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

GoogleDoorbellDevice

home.matter.6006.types.0113

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)
  }
}