Der Gerätetyp „Kamera“ wird mit zwei Attributen implementiert:
PushAvStreamTransport,
das den Transport von Audio- und Videostreams über Push-basierte Protokolle übernimmt, und
WebRtcLiveView,
das die Steuerung von Livestreams und Gegensprechen ermöglicht.
Der Gerätetyp „Türklingel“ verwendet diese Merkmale auch für Implementierungen mit Kamerafunktionen.
| Gerätetyp für Home-APIs | Attribute | Swift-Beispiel-App | Anwendungsfall |
|---|---|---|---|
Kamera
Ein Gerät, mit dem Standbilder oder Videos aufgenommen werden. Kameras können zugängliche Livestreams, Zweiwege-Audio oder Erkennungsereignisse bieten. |
Erforderliche Merkmale google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kamera | |
Türklingel
Ein Gerät, das durch einen Knopf außerhalb einer Tür betätigt wird und ein akustisches und//oder visuelles Signal erzeugt, um die Aufmerksamkeit einer Person zu erregen, die sich auf der anderen Seite der Tür befindet. Türklingeln können barrierefreie Livestreams, Zweiwege-Audio oder Erkennungsereignisse bieten. |
Erforderliche Merkmale google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Türklingel |
Livestream starten
Um einen Livestream zu starten, senden Sie die Session Description Protocol (SDP)-Zeichenkette an die Methode startLiveView() des WebRtcLiveView-Traits, die ein WebRtcLiveViewTrait.StartLiveViewCommand.Response mit drei Werten zurückgibt:
- Das SDP für die Sitzung.
- Die Sitzungsdauer in Sekunden.
- Die Sitzungs-ID, die zum Verlängern oder Beenden der Sitzung verwendet werden kann.
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)
Livestream verlängern
Livestreams haben eine voreingestellte Dauer, nach der sie ablaufen. Wenn Sie die Dauer eines aktiven Streams verlängern möchten, senden Sie eine Verlängerungsanfrage mit der Methode 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 }
Aufzeichnungsfunktion aktivieren und deaktivieren
Um die Aufnahmefunktion der Kamera zu aktivieren, übergeben Sie TransportStatusEnum.Active an die Methode setTransportStatus() des Traits PushAvStreamTransport. Wenn Sie die Aufnahmefunktion deaktivieren möchten, übergeben Sie sie TransportStatusEnum.Inactive.
Im folgenden Beispiel werden diese Aufrufe in einem einzelnen Aufruf zusammengefasst, in dem die Aufzeichnungsfunktion mit einem Boolean umgeschaltet wird:
// 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) } }
Prüfen Sie, ob die Aufnahmefunktion aktiviert ist.
Wenn Sie prüfen möchten, ob die Aufnahmefunktion einer Kamera aktiviert ist, sehen Sie nach, ob Verbindungen aktiv sind. Im folgenden Beispiel werden zwei Funktionen definiert, um dies zu tun:
// 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 }
Eine weitere Möglichkeit zur Überprüfung besteht in der Verwendung der Funktion findTransport() mit einem Prädikat:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
TalkBack starten und beenden
Rufen Sie die Methode startTalkback() des Traits WebRtcLiveView auf, um Talkback zu starten. Zum Anhalten verwenden Sie 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) } }