Typ urządzenia Kamera jest implementowany za pomocą 2 cech:PushAvStreamTransport
, która obsługuje przesyłanie strumieni audio i wideo za pomocą protokołów opartych na wysyłaniu, oraz WebRtcLiveView
, która umożliwia sterowanie transmisjami na żywo i funkcją talkback.
Typ urządzenia Dzwonek do drzwi, w przypadku implementacji z funkcjami kamery, również korzysta z tych cech.
Typ urządzenia interfejsów Home API | Cechy | Przykładowa aplikacja w Kotlinie | Przypadek użycia |
---|---|---|---|
Aparat
Urządzenie, które robi zdjęcia lub nagrywa filmy. Kamery mogą mieć funkcje takie jak dostępne transmisje na żywo, rozmowa dwukierunkowa czy wykrywanie zdarzeń. |
Wymagane cechy google PushAvStreamTransport google WebRtcLiveView |
Aparat | |
Dzwonek
Urządzenie uruchamiane przyciskiem na zewnątrz drzwi, które emituje sygnał dźwiękowy lub wizualny, używane do zwrócenia uwagi osoby znajdującej się po drugiej stronie drzwi. Dzwonki do drzwi mogą mieć funkcje transmisji na żywo z ułatwieniami dostępu, dwukierunkowego odtwarzania dźwięku lub wykrywania zdarzeń. |
Wymagane cechy google PushAvStreamTransport google WebRtcLiveView |
Dzwonek |
Rozpoczynanie transmisji na żywo
Aby rozpocząć transmisję na żywo, wyślij ciąg znaków protokołu SDP (Session Description Protocol) do metody startLiveView()
cechy WebRtcLiveView
, która zwraca obiekt WebRtcLiveViewTrait.StartLiveViewCommand.Response
zawierający 3 wartości:
- SDP sesji.
- Czas trwania sesji w sekundach.
- Identyfikator sesji, który może być używany do przedłużania lub kończenia sesji.
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)
Przedłużanie transmisji na żywo
Transmisje na żywo mają z góry określony czas trwania, po którym wygasają. Aby wydłużyć czas trwania aktywnego strumienia, wyślij żądanie przedłużenia za pomocą metody 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 }
Włączanie i wyłączanie możliwości nagrywania
Aby włączyć funkcję nagrywania kamery, przekaż wartość
TransportStatusEnum.Active
do metody
PushAvStreamTransport
cechy
setTransportStatus()
. Aby wyłączyć możliwość nagrywania, przekaż wartość
TransportStatusEnum.Inactive
.
W poniższym przykładzie umieszczamy te wywołania w jednym wywołaniu, które używa Boolean
, aby przełączać funkcję nagrywania:
// 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) } }
Sprawdzanie, czy funkcja nagrywania jest włączona
Aby sprawdzić, czy funkcja nagrywania kamery jest włączona, sprawdź, czy są aktywne jakiekolwiek połączenia. Poniższy przykład definiuje 2 funkcje, które to umożliwiają:
// 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 }
Innym sposobem sprawdzenia jest użycie funkcji findTransport()
z predykatem:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
Włączanie i wyłączanie TalkBack
Aby rozpocząć rozmowę, wywołaj metodę startTalkback()
cechy WebRtcLiveView
talkback. Aby zatrzymać, użyj 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) } }