Panduan perangkat kamera untuk Android

Jenis perangkat Kamera diimplementasikan menggunakan dua trait: PushAvStreamTransport, yang menangani transportasi streaming audio dan video menggunakan protokol berbasis push, dan WebRtcLiveView, 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 mudah 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 livestream 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() trait WebRtcLiveView, yang menampilkan WebRtcLiveViewTrait.StartLiveViewCommand.Response yang berisi tiga nilai:

  • SDP untuk sesi.
  • Durasi sesi dalam detik.
  • ID sesi, yang dapat digunakan untuk memperpanjang atau menghentikan sesi.
suspend fun getWebRtcLiveViewTrait(cameraDevice, cameraDeviceType) {
 return cameraDevice.type(cameraDeviceType).trait(WebRtcLiveView).first {
    it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE
  }

}

// Start the live view
suspend fun startCameraStream(trait: WebRtcLiveView,offerSdp: String) {
  val response = trait.startLiveView(offerSdp)
  // Response contains three fields (see below)
  return response
}
  ...

// This is used to manage the WebRTC connection
val peerConnection: RTCPeerConnection = ...

   ...

val startResponse = startCameraStream(sdp)
val answerSdp = startResponse?.answerSdp
val sessionDuration = startResponse?.liveSessionDurationSeconds
val mediaSessionId = startResponse?.mediaSessionId

peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER,
                                    answerSdp)

Memperpanjang livestream

Livestream memiliki durasi preset setelah itu akan berakhir. Untuk memperpanjang durasi streaming aktif, kirim permintaan perpanjangan menggunakan metode WebRtcLiveView.extendLiveView():

// Assuming camera stream has just been started
suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) {
  delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000)
  val response = trait.extendLiveView(mediaSessionId)
  // returns how long the session will be live for
  return response.liveSessionDurationSeconds
}

Mengaktifkan dan menonaktifkan kemampuan perekaman

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

// Start or stop recording for all connections.
suspend fun setCameraRecording(isOn: Boolean) {
  val pushAvStreamTransport = getPushAvStreamTransport
  if(isOn) {
    pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Active)
  } else {
    pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Inactive)
  }
}

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:

// Get the on/off state
suspend fun onOffState(cameraDevice: HomeDevice, cameraDeviceType) {
  // Query the device for pushAvStreamTransport
  val pushAvTrait = getPushAvStreamTransport()
  return pushAvTrait.recordModeActive()
}

// Check to see if the camera's recording capability is enabled
fun PushAvStreamTransport.recordModeActive(): Boolean {
  return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false
}

Cara lain untuk memeriksa adalah dengan menggunakan fungsi findTransport() dengan predikat:

// Fetch the current connections
suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) {
  val pushAvStreamTransport = getPushAvStreamTransport()
  return pushAvStreamTransport.findTransport().let {
      it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active
    }
}

Memulai dan menghentikan TalkBack

Untuk memulai talkback, panggil metode WebRtcLiveView dari sifat startTalkback(). Untuk berhenti, gunakan stopTalkback().

// Make sure camera stream is on
suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) {
  if(isOn) {
    trait.startTalkback(mediaSessionId)
  } else {
    trait.stopTalkback(mediaSessionId)
  }
}