Il tipo di dispositivo Fotocamera viene implementato utilizzando due tratti:
PushAvStreamTransportTrait,
che gestisce il trasporto di stream audio e video utilizzando protocolli basati su push e
WebRtcLiveViewTrait,
che offre la possibilità di controllare i live streaming e la funzionalità TalkBack.
Prima di utilizzare qualsiasi funzionalità o tentare di aggiornare gli attributi, controlla sempre il supporto di attributi e comandi per un dispositivo. Per ulteriori informazioni, consulta Controllare i dispositivi su iOS.
| Tipo di dispositivo delle API Home | Tratti | App di esempio Swift | Caso d'uso |
|---|---|---|---|
Fotocamera
Un dispositivo che acquisisce immagini fisse o video. Le videocamere possono includere live streaming accessibili, comunicazione bidirezionale o eventi di rilevamento. |
Tratti richiesti google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Fotocamera |
Avviare un live streaming
Per avviare un live streaming, invia la stringa SDP (Session Description Protocol) al metodo WebRtcLiveViewTrait dell'attributo startLiveView(offerSdp:), che restituisce tre valori:
- L'SDP per la sessione.
- La durata della sessione in secondi.
- L'ID sessione, che può essere utilizzato per estendere o terminare la sessione.
public func sendOffer(offerSdp: String) async throws
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval)
{
do {
// Sending StartLiveView command
let response = try await liveViewTrait.startLiveView(
offerSdp: offerSdp
)
// Received StartLiveView response
return (
answerSdp: response.answerSdp,
mediaSessionId: response.mediaSessionId,
liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
)
} catch {
// Failed to send StartLiveView command
throw error
}
}
Estendere un live streaming
I live streaming hanno una durata preimpostata dopo la quale scadono. Per estendere la
durata di uno stream attivo, invia una richiesta di estensione utilizzando il
metodo
extendLiveView(mediaSessionId:optionalArgsProvider:):
public func extendLiveView(mediaSessionId: String) async throws {
do {
// Extending live view
let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
} catch {
// Failed to extend live view
throw error
}
}
Avviare e interrompere TalkBack
Per avviare TalkBack, chiama il
metodo startTalkback(mediaSessionId:optionalArgsProvider:)
del tratto WebRtcLiveViewTrait.
Per interrompere, utilizza stopTalkback(mediaSessionId:).
public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
do {
if isOn {
try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
} else {
try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
}
} catch {
throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
}
}
Attivare e disattivare la funzionalità di registrazione
Per attivare la funzionalità di registrazione della videocamera, passa
TransportStatusEnum.Active
al metodo
PushAvStreamTransportTrait
dell'attributo
setTransportStatus(transportStatus:optionalArgsProvider:). Per disattivare la funzionalità di registrazione, passala
TransportStatusEnum.Inactive.
Nel seguente esempio, racchiudiamo queste chiamate in una singola chiamata che utilizza un
Boolean per attivare/disattivare la funzionalità di registrazione:
public func toggleIsRecording(isOn: Bool) {
self.uiState = .loading
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return
}
Task {
do {
try await pushAvStreamTransportTrait.setTransportStatus(
transportStatus: isOn ? .active : .inactive)
if isOn {
do {
self.player = try self.createWebRtcPlayer()
} catch {
// Failed to initialize WebRtcPlayer
self.uiState = .disconnected
return
}
await self.player?.initialize()
self.uiState = .live
} else {
self.player = nil
self.uiState = .off
}
} catch {
// Failed to toggle onOff
}
}
}
L'attivazione o la disattivazione della funzionalità di registrazione della videocamera equivale ad accendere o spegnere il video della videocamera. Quando il video di una videocamera è attivo, la videocamera registra (ai fini degli eventi e dei clip correlati).
Quando la funzionalità di registrazione è disattivata (il video della videocamera è spento):
- La videocamera può comunque essere visualizzata come online in base all'
connectivityStatedel tipo di dispositivo. - Non è possibile accedere al live streaming e la videocamera non rileva eventi sul cloud.
Controllare se la funzionalità di registrazione è attiva
Per determinare se la funzionalità di registrazione di una videocamera è attiva, controlla se sono attive connessioni. L'esempio seguente definisce due funzioni per farlo:
public func isDeviceRecording() -> Bool {
guard let pushAvStreamTransportTrait else {
// PushAvStreamTransportTrait not found.
return false
}
guard
let hasActiveConnection =
pushAvStreamTransportTrait
.attributes
.currentConnections?
.contains(where: { $0.transportStatus == .active })
else {
return false
}
return hasActiveConnection
}
Impostazioni audio
Diverse impostazioni audio della videocamera possono essere controllate tramite le API Home.
Attivare o disattivare il microfono
Per attivare o disattivare il microfono del dispositivo, aggiorna l'attributo
microphoneMuted
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setMicrophoneMuted integrata:
// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setMicrophoneMuted(!on)
}
} catch {
// Error
}
}
Attivare o disattivare la registrazione audio
Per attivare o disattivare la registrazione audio per il dispositivo, aggiorna l'attributo
recordingMicrophoneMuted
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setRecordingMicrophoneMuted integrata:
// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
do {
_ = try await self.cameraAvStreamManagementTrait?.update {
$0.setRecordingMicrophoneMuted(!on)
}
} catch {
// Error
}
}
Regolare il volume dello speaker
Per regolare il volume dello speaker del dispositivo, aggiorna l'attributo
speakerVolumeLevel
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setSpeakerVolumeLevel integrata:
// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setSpeakerVolumeLevel(value)
}
} catch {
// Error
}
}
Altre impostazioni
Diverse altre impostazioni della videocamera possono essere controllate tramite le API Home.
Modificare l'orientamento dell'immagine
L'orientamento dell'immagine (video) della videocamera può essere ruotato. Il video può essere ruotato solo di 180 gradi.
Per modificare l'orientamento dell'immagine della videocamera, aggiorna l'attributo
imageRotation
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setImageRotation integrata:
// Change the camera's image orientation
// Value must be 0 or 180
func setImageRotation(to value: UInt16) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setImageRotation(value)
}
} catch {
// Error
}
}
Attivare o disattivare la visione notturna
Per attivare o disattivare la visione notturna per la videocamera, utilizza TriStateAutoEnum
per aggiornare l'attributo
nightVision
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setNightVision integrata:
// Turn night vision on or off
func setNightVision(
to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setNightVision(value)
}
} catch {
// Error
}
}
Modificare la luminosità del LED di stato
Per modificare la luminosità del LED di stato, utilizza
ThreeLevelAutoEnum
per aggiornare l'attributo
statusLightBrightness
del tratto CameraAvStreamManagementTrait utilizzando la funzione
setStatusLightBrightness integrata:
// Set the LED brightness
func setStatusLightBrightness(
to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
do {
_ = try await cameraAvStreamManagementTrait.update {
$0.setStatusLightBrightness(value)
}
} catch {
// Error
}
}
Modificare il viewport della videocamera
Il riquadro della videocamera è uguale alla funzionalità Zoom e ritaglio descritta nell'articolo del Centro assistenza Aumentare lo zoom e migliorare i video della videocamera Nest.
La finestra viene definita in un ViewportStruct che contiene quattro valori, che
vengono utilizzati come coordinate della finestra. Le coordinate sono definite come segue:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
La determinazione dei valori per ViewportStruct dipende dall'interfaccia utente di un'app e
dall'implementazione della fotocamera. A un livello molto base, per impostare la visualizzazione del video della videocamera, aggiorna l'attributo viewport del tratto CameraAvStreamManagementTrait con un ViewportStruct, utilizzando la funzione setViewport integrata.
func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {
let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
x1: x1,
y1: y1,
x2: x2,
y2: y2
)
Task {
do {
try await cameraAvStreamManagementTrait.update {
$0.setViewport(viewport)
}
} catch {
// Error
}
}
}
Genera una TransportOptionsStruct
Alcune impostazioni richiedono modifiche alle proprietà in un TransportOptionsStruct,
che viene poi passato alle opzioni di trasporto di una connessione di streaming. Per
Swift, questa struttura deve essere generata prima di aggiornare qualsiasi proprietà.
Utilizza questa funzione helper per generare lo struct da utilizzare con le seguenti modifiche alle impostazioni:
func getTransportOptions(
transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
wakeUpSensitivity: UInt8?,
maxEventLength: UInt32?
) async throws
-> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{
var newMotionTimeControl:
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
if let maxEventLength {
guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
throw HomeError.failedPrecondition(
// Error - cannot update max event length without motion time control
}
newMotionTimeControl =
Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
initialDuration: motionTimeControl.initialDuration,
augmentationDuration: motionTimeControl.augmentationDuration,
maxDuration: maxEventLength,
blindDuration: motionTimeControl.blindDuration
)
}
return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
streamUsage: .recording,
videoStreamID: nil,
audioStreamID: nil,
tlsEndpointID: transportOptions.tlsEndpointID,
url: transportOptions.url,
triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
triggerType: .motion,
motionZones: nil,
motionSensitivity: wakeUpSensitivity,
motionTimeControl: newMotionTimeControl,
maxPreRollLen: nil
),
ingestMethod: .cmafIngest,
containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
containerType: .cmaf,
cmafContainerOptions: nil
),
expiryTime: nil
)
}
private func getRecordingConnection() async throws
-> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
guard let pushAvStreamTransportTrait else {
// Error - PushAvStreamTransport trait not available
return nil
}
let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations
for connection in connections {
guard let transportOptions = connection.transportOptions,
transportOptions.streamUsage == .recording
else {
continue
}
return connection
}
return nil
}
Regolare la sensibilità alla riattivazione del dispositivo
La sensibilità di riattivazione del dispositivo viene utilizzata per risparmiare batteria diminuendo il raggio in cui il dispositivo può rilevare l'attività e aumentando il tempo di riattivazione dopo aver rilevato l'attività.
Nelle API Home, questa impostazione può essere configurata utilizzando la proprietà motionSensitivity di
triggerOptions in transportOptions del dispositivo. Queste opzioni sono definite
nell'attributo PushAvStreamTransportTrait per ogni dispositivo.
La sensibilità al risveglio può essere impostata solo sui seguenti valori:
- 1 = Basso
- 5 = Medio
- 10 = Alto
La procedura di aggiornamento consiste nel trovare la configurazione di trasporto per i flussi di registrazione attivi utilizzando il comando findTransport, quindi modificare la configurazione con il nuovo valore di sensibilità utilizzando il comando modifyPushTransport.
Il comando modifyPushTransport richiede il passaggio dell'intero TransportOptionsStruct, quindi devi prima copiare i valori esistenti dalla configurazione attuale. Per farlo, consulta Generare un TransportOptionsStruct per una funzione helper.
func setWakeUpSensitivity(to value: UInt8) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionSensitivity != nil else {
// Error - Motion sensitivity not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: value,
maxEventLength: nil
)
)
} catch {
// Error
}
}
Regolare la durata massima degli eventi
La durata massima degli eventi è il periodo di tempo per cui la videocamera registrerà un clip per un evento. Tramite le API Home, questa impostazione può essere configurata, per dispositivo, con le stesse durate che si ottengono tramite Google Home app (GHA), a intervalli di secondi:
- 10 secondi
- 15 secondi
- 30 secondi
- 60 secondi (1 minuto)
- 120 secondi (2 minuti)
- 180 secondi (3 minuti)
Nelle API Home, questa impostazione può essere configurata utilizzando la proprietà motionTimeControl di
triggerOptions in transportOptions del dispositivo. Queste opzioni sono definite
nell'attributo PushAvStreamTransportTrait per ogni dispositivo.
La procedura di aggiornamento consiste nel trovare la configurazione di trasporto per i flussi di registrazione attivi utilizzando il comando findTransport, quindi modificare la configurazione con il nuovo valore della durata dell'evento utilizzando il comando modifyPushTransport.
Il comando modifyPushTransport richiede il passaggio dell'intero TransportOptionsStruct, quindi devi prima copiare i valori esistenti dalla configurazione attuale. Per farlo, consulta Generare un TransportOptionsStruct per una funzione helper.
func setMaxEventLength(to value: UInt32) async {
do {
let connection = try await getRecordingConnection()
guard let connection,
let transportOptions = connection.transportOptions
else {
// Error - Transport options not available
return
}
guard transportOptions.triggerOptions.motionTimeControl != nil else {
// Error - Motion time control not available to be updated for this device
return
}
try await pushAvStreamTransportTrait.modifyPushTransport(
connectionID: connection.connectionID,
transportOptions: self.getTransportOptions(
transportOptions: transportOptions,
wakeUpSensitivity: nil,
maxEventLength: value
)
)
} catch {
// Error
}
}