El tipo de dispositivo Cámara se implementa con dos rasgos: PushAvStreamTransport
, que controla el transporte de transmisiones de audio y video con protocolos basados en la transmisión, y WebRtcLiveView
, que proporciona la capacidad de controlar transmisiones en vivo y la función de intercomunicador.
El tipo de dispositivo Doorbell, para aquellas implementaciones que tienen capacidades de cámara, también usa estos rasgos.
Tipo de dispositivo de las APIs de Home | Rasgos | App de ejemplo de Kotlin | Caso de uso |
---|---|---|---|
Cámara
Dispositivo que captura imágenes fijas o videos. Las cámaras pueden incluir transmisiones en vivo accesibles, intercomunicador bidireccional o eventos de detección. |
Required Traits google PushAvStreamTransport google WebRtcLiveView |
Cámara | |
Timbre
Dispositivo que se acciona con un botón fuera de una puerta y que emite una señal audible o visual para solicitar la atención de una persona que se encuentra al otro lado de la puerta. Los timbres pueden incluir transmisiones en vivo accesibles, respuesta bidireccional o eventos de detección. |
Required Traits google PushAvStreamTransport google WebRtcLiveView |
Timbre |
Cómo iniciar una transmisión en vivo
Para iniciar una transmisión en vivo, envía la cadena del Protocolo de descripción de sesión (SDP) al método startLiveView()
del rasgo WebRtcLiveView
, que devuelve un objeto WebRtcLiveViewTrait.StartLiveViewCommand.Response
que contiene tres valores:
- Es el SDP de la sesión.
- Es la duración de la sesión en segundos.
- Es el ID de sesión, que se puede usar para extender o finalizar la sesión.
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)
Cómo extender una transmisión en vivo
Las transmisiones en vivo tienen una duración predeterminada después de la cual vencen. Para extender la duración de una transmisión activa, emite una solicitud de extensión con el método 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 }
Cómo habilitar e inhabilitar la capacidad de grabación
Para habilitar la capacidad de grabación de la cámara, pasa TransportStatusEnum.Active
al método setTransportStatus()
del rasgo PushAvStreamTransport
. Para inhabilitar la capacidad de grabación, pasa TransportStatusEnum.Inactive
.
En el siguiente ejemplo, incluimos estas llamadas en una sola llamada que usa un Boolean
para activar o desactivar la capacidad de grabación:
// 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) } }
Comprueba si la capacidad de grabación está habilitada
Para determinar si la capacidad de grabación de una cámara está habilitada, verifica si hay conexiones activas. En el siguiente ejemplo, se definen dos funciones para realizar esta acción:
// 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 }
Otra forma de verificarlo es usar la función findTransport()
con un predicado:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Cómo iniciar y detener TalkBack
Para iniciar TalkBack, llama al método startTalkback()
del rasgo WebRtcLiveView
. Para detenerlo, usa 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) } }