Тип устройства «Камера» реализован с использованием двух трейтов: PushAvStreamTransport
, который обрабатывает передачу аудио- и видеопотоков с помощью push-протоколов, и WebRtcLiveView
, который обеспечивает возможность управления прямыми трансляциями и обратной связью. Тип устройства «Дверной звонок» (Doorbell) для реализаций с поддержкой камеры также использует эти трейты.
API для дома Тип устройства | Черты | Пример приложения Kotlin | Вариант использования |
---|---|---|---|
Камера Устройство для записи неподвижных изображений или видео. Камеры могут поддерживать прямую трансляцию, двустороннюю связь или фиксировать события. | Требуемые черты Google PushAvStreamTransport Google WebRtcLiveView | Камера | |
Дверной звонок Устройство, активируемое кнопкой снаружи двери и подающее звуковой и/или визуальный сигнал, используемое для привлечения внимания человека, находящегося по ту сторону двери. Дверные звонки могут поддерживать прямую трансляцию, двустороннюю связь или распознавать события. | Требуемые черты Google PushAvStreamTransport Google WebRtcLiveView | Дверной звонок |
Начать прямую трансляцию
Чтобы начать прямую трансляцию, отправьте строку протокола описания сеанса (SDP) методу startLiveView()
трейта WebRtcLiveView
, который возвращает WebRtcLiveViewTrait.StartLiveViewCommand.Response
, содержащий три значения:
- СДП для сессии.
- Длительность сеанса в секундах.
- Идентификатор сеанса, который может использоваться для продления или завершения сеанса.
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)
Продлить прямую трансляцию
Прямые трансляции имеют предустановленную продолжительность, по истечении которой они истекают. Чтобы увеличить продолжительность активной трансляции, выполните запрос на продление с помощью метода 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 }
Включить и отключить возможность записи
Чтобы включить возможность записи камеры, передайте TransportStatusEnum.Active
методу setTransportStatus()
типа PushAvStreamTransport
. Чтобы отключить возможность записи, передайте TransportStatusEnum.Inactive
. В следующем примере мы объединяем эти вызовы в один вызов, который использует Boolean
для включения/выключения возможности записи:
// 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) } }
Проверьте, включена ли возможность записи.
Чтобы определить, включена ли функция записи камеры, проверьте наличие активных подключений. В следующем примере определены две функции для этого:
// 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 }
Другой способ проверки — использование функции findTransport()
с предикатом:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Запуск и остановка двусторонней связи
Чтобы начать обратную связь, вызовите метод startTalkback()
трейта WebRtcLiveView
. Чтобы остановить, используйте 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) } }