Guida al dispositivo videocamera per iOS

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 le live streaming e la funzionalità TalkBack. Anche il tipo di dispositivo Campanello, per le implementazioni che dispongono di funzionalità della videocamera, utilizza questi tratti.

Tipo di dispositivo delle API Home Tratti App di esempio Swift Caso d'uso

Fotocamera

GoogleCameraDeviceType

home.matter.6006.types.0158

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

Campanello

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Un dispositivo azionato da un pulsante all'esterno di una porta che emette un segnale acustico e/o visivo, utilizzato per richiedere l'attenzione di una persona che si trova da qualche parte dall'altro lato della porta. I campanelli possono includere live streaming accessibili, comunicazione bidirezionale o eventi di rilevamento.

Tratti richiesti
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Campanello

Avviare un live streaming

Per avviare un live streaming, invia la stringa Session Description Protocol (SDP) 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 {
    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
  }
}

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 {
    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
  }
}

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, passa 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 {
    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)")
    }
  }
}

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 {
    Logger.error("PushAvStreamTransportTrait not found.")
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

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 {
    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)")
  }
}