Panduan perangkat kamera untuk iOS

Jenis perangkat Kamera diimplementasikan menggunakan dua trait: PushAvStreamTransportTrait, yang menangani transportasi streaming audio dan video menggunakan protokol berbasis push, dan WebRtcLiveViewTrait, yang memberikan kemampuan untuk mengontrol live stream dan talkback. Jenis perangkat Bel Pintu, untuk penerapan yang memiliki kemampuan kamera, juga menggunakan trait ini.

Jenis Perangkat Home API Sifat Aplikasi Contoh Swift Kasus Penggunaan

Kamera

GoogleCameraDeviceType

home.matter.6006.types.0158

Perangkat yang mengambil gambar diam atau merekam video. Kamera dapat menampilkan livestream yang dapat diakses, komunikasi dua arah, atau peristiwa deteksi.

Ciri Wajib
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Kamera

Bel pintu

GoogleDoorbellDeviceType

home.matter.6006.types.0113

Perangkat yang diaktifkan oleh tombol di luar pintu yang menghasilkan sinyal suara dan/atau visual, yang digunakan untuk meminta perhatian orang yang berada di sisi lain pintu. Bel pintu mungkin memiliki fitur live stream yang dapat diakses, talkback dua arah, atau peristiwa deteksi.

Ciri Wajib
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

Bel Pintu

Memulai livestream

Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode startLiveView(offerSdp:) trait WebRtcLiveViewTrait, yang menampilkan tiga nilai:

  • SDP untuk sesi.
  • Durasi sesi dalam detik.
  • ID sesi, yang dapat digunakan untuk memperpanjang atau menghentikan sesi.
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
  }
}

Memperpanjang livestream

Live stream memiliki durasi preset setelah itu live stream akan berakhir. Untuk memperpanjang durasi streaming aktif, kirim permintaan perpanjangan menggunakan metode 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
  }
}

Mengaktifkan dan menonaktifkan kemampuan perekaman

Untuk mengaktifkan kemampuan perekaman kamera, teruskan TransportStatusEnum.Active ke metode setTransportStatus(transportStatus:optionalArgsProvider:) trait PushAvStreamTransportTrait. Untuk menonaktifkan kemampuan merekam, teruskan TransportStatusEnum.Inactive. Dalam contoh berikut, kita menggabungkan panggilan ini dalam satu panggilan yang menggunakan Boolean untuk mengaktifkan/menonaktifkan kemampuan perekaman:

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

Periksa apakah kemampuan perekaman diaktifkan

Untuk menentukan apakah kemampuan perekaman kamera diaktifkan, periksa apakah ada koneksi yang aktif. Contoh berikut menentukan dua fungsi untuk melakukannya:

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
}

Memulai dan menghentikan TalkBack

Untuk memulai talkback, panggil metode startTalkback(mediaSessionId:optionalArgsProvider:) dari WebRtcLiveViewTrait trait. Untuk berhenti, gunakan 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)")
  }
}