Typ urządzenia Kamera jest implementowany za pomocą 2 cech:PushAvStreamTransportTrait
, która obsługuje przesyłanie strumieni audio i wideo za pomocą protokołów opartych na wysyłaniu, oraz WebRtcLiveViewTrait
, 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 Swift | 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 PushAvStreamTransportTrait google WebRtcLiveViewTrait |
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 PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Dzwonek |
Rozpoczynanie transmisji na żywo
Aby rozpocząć transmisję na żywo, wyślij ciąg protokołu SDP (Session Description Protocol) do metody startLiveView(offerSdp:)
cechy WebRtcLiveViewTrait
, która zwraca 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.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
Logger.info("Sending StartLiveView command...")
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
Logger.info("Received StartLiveView response: \(response)")
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
Logger.error("Failed to send StartLiveView command: \(error)")
throw error
}
}
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 extendLiveView(mediaSessionId:optionalArgsProvider:)
:
public func extendLiveView(mediaSessionId: String) async throws {
do {
Logger.info("Extending live view...")
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
Logger.info("Extended live view for \(extendedDuration.liveSessionDurationSeconds) seconds.")
} catch {
Logger.error("Failed to extend live view: \(error)")
throw error
}
}
Włączanie i wyłączanie możliwości nagrywania
Aby włączyć funkcję nagrywania kamery, przekaż wartość
TransportStatusEnum.Active
do metody
PushAvStreamTransportTrait
cechy
setTransportStatus(transportStatus:optionalArgsProvider:)
. 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:
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
Logger.error("PushAvStreamTransportTrait not found.")
return
}
Task {
do {
Logger.debug("Toggling onOff to \(isOn ? "ON" : "OFF")...")
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
Logger.error("Failed to initialize WebRtcPlayer: \(error)")
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
Logger.error("Failed to toggle onOff: \(error)")
}
}
}
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ą:
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
Logger.error("PushAvStreamTransportTrait not found.")
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
Włączanie i wyłączanie TalkBack
Aby uruchomić TalkBack, wywołaj metodę startTalkback(mediaSessionId:optionalArgsProvider:)
cechy
WebRtcLiveViewTrait
.
Aby zatrzymać, kliknij stopTalkback(mediaSessionId:)
.
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
Logger.info("Toggling twoWayTalk to \(isOn ? "ON" : "OFF")...")
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}