Guida ai dispositivi di ripresa per Android

Il tipo di dispositivo Fotocamera viene implementato utilizzando due tratti: PushAvStreamTransport, che gestisce il trasporto di stream audio e video utilizzando protocolli basati su push e WebRtcLiveView, che offre la possibilità di controllare le live streaming e la funzionalità TalkBack. Anche il tipo di dispositivo Campanello, per le implementazioni che dispongono di funzionalità della videocamera, utilizza questi tratti.

Tipo di dispositivo delle API Home Tratti App di esempio Kotlin Caso d'uso

Fotocamera

GoogleCameraDevice

home.matter.6006.types.0158

Un dispositivo che acquisisce immagini fisse o video. Le videocamere possono includere live streaming accessibili, comunicazione bidirezionale o eventi di rilevamento.

Tratti obbligatori
     google PushAvStreamTransport
     google WebRtcLiveView

Fotocamera

Campanello

GoogleDoorbellDevice

home.matter.6006.types.0113

Un dispositivo azionato da un pulsante all'esterno di una porta che emette un segnale acustico e/o visivo, utilizzato per richiedere l'attenzione di una persona che si trova da qualche parte dall'altro lato della porta. I campanelli possono includere live streaming accessibili, comunicazione bidirezionale o eventi di rilevamento.

Tratti obbligatori
     google PushAvStreamTransport
     google WebRtcLiveView

Campanello

Avviare un live streaming

Per avviare un live streaming, invia la stringa Session Description Protocol (SDP) al metodo WebRtcLiveView dell'attributo startLiveView(), che restituisce un WebRtcLiveViewTrait.StartLiveViewCommand.Response contenente tre valori:

  • L'SDP per la sessione.
  • La durata della sessione in secondi.
  • L'ID sessione, che può essere utilizzato per estendere o terminare la sessione.
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)

Estendere un live streaming

I live streaming hanno una durata preimpostata dopo la quale scadono. Per estendere la durata di uno stream attivo, invia una richiesta di estensione utilizzando il metodo 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
}

Attivare e disattivare la funzionalità di registrazione

Per attivare la funzionalità di registrazione della videocamera, passa TransportStatusEnum.Active al metodo PushAvStreamTransport dell'attributo setTransportStatus(). Per disattivare la funzionalità di registrazione, passa TransportStatusEnum.Inactive. Nel seguente esempio, racchiudiamo queste chiamate in una singola chiamata che utilizza un Boolean per attivare/disattivare la funzionalità di registrazione:

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

Controllare se la funzionalità di registrazione è attiva

Per determinare se la funzionalità di registrazione di una videocamera è attiva, controlla se sono attive connessioni. L'esempio seguente definisce due funzioni per farlo:

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

Un altro modo per verificare è utilizzare la funzione findTransport() con un predicato:

// Fetch the current connections
suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) {
  val pushAvStreamTransport = getPushAvStreamTransport()
  return pushAvStreamTransport.findTransport().let {
      it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active
    }
}

Avviare e interrompere TalkBack

Per avviare TalkBack, chiama il metodo WebRtcLiveView startTalkback() dell'attributo. Per interrompere, utilizza 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)
  }
}