Le type d'appareil "Caméra" est implémenté à l'aide de deux traits :
PushAvStreamTransportTrait
, qui gère le transport des flux audio et vidéo à l'aide de protocoles basés sur le push, et
WebRtcLiveViewTrait
, qui permet de contrôler les diffusions en direct et la fonctionnalité Talkback.
Le type d'appareil Doorbell, pour les implémentations dotées de fonctionnalités de caméra, utilise également ces traits.
Type d'appareil des API Home | Traits | Application exemple Swift | Cas d'utilisation |
---|---|---|---|
Appareil photo
Appareil qui prend des photos ou enregistre des vidéos. Les caméras peuvent proposer des diffusions en direct accessibles, une fonctionnalité d'interphone ou des événements de détection. |
Traits requis google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Appareil photo | |
Sonnette
Appareil actionné par un bouton situé à l'extérieur d'une porte, qui émet un signal sonore et/ou visuel pour attirer l'attention d'une personne se trouvant de l'autre côté de la porte. Les sonnettes peuvent proposer des diffusions en direct accessibles, une fonction micro ou des événements de détection. |
Traits requis google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Sonnette |
Lancer une diffusion en direct
Pour lancer une diffusion en direct, envoyez la chaîne SDP (Session Description Protocol) à la méthode WebRtcLiveViewTrait
du trait startLiveView(offerSdp:)
, qui renvoie trois valeurs :
- SDP de la session.
- Durée de la session en secondes.
- ID de la session, qui peut être utilisé pour la prolonger ou la terminer.
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
}
}
Prolonger une diffusion en direct
Les diffusions en direct ont une durée prédéfinie au terme de laquelle elles expirent. Pour prolonger la durée d'un flux actif, envoyez une demande de prolongation à l'aide de la méthode 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
}
}
Activer et désactiver la fonctionnalité d'enregistrement
Pour activer la fonctionnalité d'enregistrement de la caméra, transmettez TransportStatusEnum.Active
à la méthode setTransportStatus(transportStatus:optionalArgsProvider:)
du trait PushAvStreamTransportTrait
. Pour désactiver la fonctionnalité d'enregistrement, transmettez-la TransportStatusEnum.Inactive
.
Dans l'exemple suivant, nous encapsulons ces appels dans un seul appel qui utilise un Boolean
pour activer ou désactiver la fonctionnalité d'enregistrement :
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)")
}
}
}
Vérifier si la fonctionnalité d'enregistrement est activée
Pour savoir si la fonctionnalité d'enregistrement d'une caméra est activée, vérifiez si des connexions sont actives. L'exemple suivant définit deux fonctions pour ce faire :
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
}
Démarrer et arrêter TalkBack
Pour démarrer TalkBack, appelez la méthode startTalkback(mediaSessionId:optionalArgsProvider:)
du trait WebRtcLiveViewTrait
.
Pour arrêter, utilisez 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)")
}
}