O tipo de dispositivo de câmera é implementado usando duas características:
PushAvStreamTransport
,
que processa o transporte de streams de áudio e vídeo usando protocolos baseados em push, e
WebRtcLiveView
,
que oferece a capacidade de controlar transmissões ao vivo e talkback.
O tipo de dispositivo campainha, para implementações com recursos de câmera, também usa essas características.
Tipo de dispositivo das APIs do Google Home | Características | App de exemplo em Kotlin | Caso de uso |
---|---|---|---|
Câmera
Um dispositivo que captura imagens estáticas ou vídeo. As câmeras podem ter transmissões ao vivo acessíveis, conversa bidirecional ou eventos de detecção. |
Características obrigatórias google PushAvStreamTransport google WebRtcLiveView |
Câmera | |
Campainha
Um dispositivo acionado por um botão do lado de fora de uma porta que emite um sinal audível e/ou visual, usado para chamar a atenção de uma pessoa que está do outro lado da porta. As campainhas podem ter transmissões ao vivo acessíveis, recurso de falar e ouvir ou eventos de detecção. |
Características obrigatórias google PushAvStreamTransport google WebRtcLiveView |
Campainha |
Iniciar uma transmissão ao vivo
Para iniciar uma transmissão ao vivo, envie a string do Session Description Protocol (SDP)
para o método
startLiveView()
do traço
WebRtcLiveView
, que retorna um
WebRtcLiveViewTrait.StartLiveViewCommand.Response
com três valores:
- O SDP da sessão.
- A duração da sessão em segundos.
- O ID da sessão, que pode ser usado para estender ou encerrar a sessão.
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)
Estender uma transmissão ao vivo
As transmissões ao vivo têm uma duração predefinida após a qual expiram. Para aumentar a duração de um stream ativo, envie uma solicitação de extensão usando o 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 }
Ativar e desativar a capacidade de gravação
Para ativar a capacidade de gravação da câmera, transmita
TransportStatusEnum.Active
ao método
PushAvStreamTransport
da característica
setTransportStatus()
. Para desativar a capacidade de gravação, transmita-a
TransportStatusEnum.Inactive
.
No exemplo a seguir, agrupamos essas chamadas em uma única chamada que usa um
Boolean
para ativar ou desativar a capacidade de gravação:
// 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) } }
Verificar se a capacidade de gravação está ativada
Para determinar se a capacidade de gravação de uma câmera está ativada, verifique se há conexões ativas. O exemplo a seguir define duas funções para fazer isso:
// 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 }
Outra maneira de verificar é usar a função findTransport()
com um 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 } }
Iniciar e interromper o TalkBack
Para iniciar o talkback, chame o método
startTalkback()
da característica
WebRtcLiveView
. Para parar, use
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) } }