راهنمای دستگاه دوربین برای اندروید

نوع دستگاه دوربین با استفاده از دو ویژگی پیاده‌سازی می‌شود: PushAvStreamTransport ، که انتقال جریان صوتی و تصویری را با استفاده از پروتکل‌های مبتنی بر فشار انجام می‌دهد، و WebRtcLiveView ، که توانایی کنترل جریان‌های زنده و گفتگو را فراهم می‌کند. نوع دستگاه Doorbell برای آن دسته از پیاده سازی هایی که دارای قابلیت دوربین هستند نیز از این ویژگی ها استفاده می کند.

APIهای خانگی نوع دستگاه صفات برنامه نمونه کاتلین استفاده از مورد

دوربین

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 حاوی سه مقدار را برمی گرداند:

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

شروع و توقف گفتگو

برای شروع تاک بک، متد 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)
  }
}