Руководство по использованию камеры на Android

Тип устройства «Камера» реализован с использованием двух трейтов: PushAvStreamTransport , который обрабатывает передачу аудио- и видеопотоков с помощью push-протоколов, и WebRtcLiveView , который обеспечивает возможность управления прямыми трансляциями и обратной связью. Тип устройства «Дверной звонок» (Doorbell) для реализаций с поддержкой камеры также использует эти трейты.

API для дома Тип устройства Черты Пример приложения Kotlin Вариант использования

Камера

Google Camera Device

home.matter.6006.types.0158

Устройство для записи неподвижных изображений или видео. Камеры могут поддерживать прямую трансляцию, двустороннюю связь или фиксировать события.

Требуемые черты
Google PushAvStreamTransport
Google WebRtcLiveView

Камера

Дверной звонок

Google Doorbell Device

home.matter.6006.types.0113

Устройство, активируемое кнопкой снаружи двери и подающее звуковой и/или визуальный сигнал, используемое для привлечения внимания человека, находящегося по ту сторону двери. Дверные звонки могут поддерживать прямую трансляцию, двустороннюю связь или распознавать события.

Требуемые черты
Google PushAvStreamTransport
Google WebRtcLiveView

Дверной звонок

Начать прямую трансляцию

Чтобы начать прямую трансляцию, отправьте строку протокола описания сеанса (SDP) методу startLiveView() трейта WebRtcLiveView , который возвращает WebRtcLiveViewTrait.StartLiveViewCommand.Response , содержащий три значения:

  • СДП для сессии.
  • Длительность сеанса в секундах.
  • Идентификатор сеанса, который может использоваться для продления или завершения сеанса.
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)

Продлить прямую трансляцию

Прямые трансляции имеют предустановленную продолжительность, по истечении которой они истекают. Чтобы увеличить продолжительность активной трансляции, выполните запрос на продление с помощью метода 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
}

Включить и отключить возможность записи

Чтобы включить возможность записи камеры, передайте TransportStatusEnum.Active методу setTransportStatus() типа PushAvStreamTransport . Чтобы отключить возможность записи, передайте TransportStatusEnum.Inactive . В следующем примере мы объединяем эти вызовы в один вызов, который использует Boolean для включения/выключения возможности записи:

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

Проверьте, включена ли возможность записи.

Чтобы определить, включена ли функция записи камеры, проверьте наличие активных подключений. В следующем примере определены две функции для этого:

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

Другой способ проверки — использование функции findTransport() с предикатом:

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

Запуск и остановка двусторонней связи

Чтобы начать обратную связь, вызовите метод startTalkback() трейта WebRtcLiveView . Чтобы остановить, используйте 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)
  }
}