دليل أجهزة الكاميرا على Android

يتم تنفيذ نوع الجهاز "الكاميرا" باستخدام سمتَين: PushAvStreamTransport، التي تتعامل مع نقل بث الصوت والفيديو باستخدام بروتوكولات مستندة إلى الإرسال، وWebRtcLiveView، التي تتيح إمكانية التحكّم في البث المباشر والتواصل ثنائي الاتجاه. يستخدم نوع الجهاز "جهاز جرس الباب"، في عمليات التنفيذ التي تتضمّن إمكانات الكاميرا، هذه السمات أيضًا.

نوع الجهاز في Home APIs السمات تطبيق Swift النموذجي حالة الاستخدام

الكاميرا

GoogleCameraDeviceType

home.matter.6006.types.0158

جهاز يلتقط صورًا ثابتة أو فيديوهات قد تتضمّن الكاميرات بثًا مباشرًا يسهل استخدامه أو ميزة "التحدّث والاستماع" أو أحداث رصد.

السمات المطلوبة
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

الكاميرا

جرس الباب

GoogleDoorbellDeviceType

home.matter.6006.types.0113

جهاز يتم تشغيله بواسطة زر خارج الباب ويصدر إشارة مسموعة و/أو مرئية، ويُستخدم لطلب انتباه شخص موجود على الجانب الآخر من الباب. قد تتضمّن أجراس الأبواب بثًا مباشرًا يسهل الوصول إليه أو ميزة التحدّث ثنائي الاتجاه أو أحداث الرصد.

السمات المطلوبة
     google PushAvStreamTransportTrait
     google WebRtcLiveViewTrait

جرس الباب

بدء بث مباشر

لبدء بث مباشر، أرسل سلسلة بروتوكول وصف الجلسة (SDP) إلى طريقة startLiveView() الخاصة بخاصية WebRtcLiveView، والتي تُرجع WebRtcLiveViewTrait.StartLiveViewCommand.Response تحتوي على ثلاث قيم:

  • تمثّل هذه السمة وصف الجلسة (SDP).
  • مدة الجلسة بالثواني
  • رقم تعريف الجلسة الذي يمكن استخدامه لتمديد الجلسة أو إنهاءها
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
    }
}

بدء TalkBack وإيقافه

لبدء المحادثة العكسية، اتصل بطريقة 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)
  }
}