অ্যান্ড্রয়েডের জন্য ক্যামেরা ডিভাইস গাইড

ক্যামেরা ডিভাইসের ধরন দুটি বৈশিষ্ট্য ব্যবহার করে প্রয়োগ করা হয়েছে: PushAvStreamTransport , যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveView , যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে। ডোরবেল ডিভাইসের ধরন, ক্যামেরার ক্ষমতা আছে এমন বাস্তবায়নের জন্যও এই বৈশিষ্ট্যগুলি ব্যবহার করে।

হোম এপিআই ডিভাইসের ধরন বৈশিষ্ট্য কোটলিন নমুনা অ্যাপ কেস ব্যবহার করুন

ক্যামেরা

Google Camera Device

home.matter.6006.types.0158

একটি ডিভাইস যা স্থির ছবি বা ভিডিও ক্যাপচার করে। ক্যামেরাগুলি অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক, বা সনাক্তকরণ ইভেন্টগুলি ফিচার করতে পারে।

প্রয়োজনীয় বৈশিষ্ট্য
google PushAvStreamTransport
google WebRtcLiveView

ক্যামেরা

ডোরবেল

Google Doorbell Device

home.matter.6006.types.0113

দরজার বাইরে একটি বোতাম দ্বারা সঞ্চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা ভিজ্যুয়াল সিগন্যাল তৈরি করে, যেটি দরজার অন্য পাশে থাকা একজন ব্যক্তির দৃষ্টি আকর্ষণ করতে ব্যবহৃত হয়। ডোরবেলে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক বা সনাক্তকরণ ইভেন্টগুলি বৈশিষ্ট্যযুক্ত হতে পারে।

প্রয়োজনীয় বৈশিষ্ট্য
google PushAvStreamTransport
google WebRtcLiveView

ডোরবেল

একটি লাইভস্ট্রিম শুরু করুন

একটি লাইভস্ট্রিম শুরু করতে, WebRtcLiveView বৈশিষ্ট্যের startLiveView() পদ্ধতিতে সেশন বর্ণনা প্রোটোকল (SDP) স্ট্রিং পাঠান, যা তিনটি মান ধারণকারী একটি 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
}

রেকর্ডিং ক্ষমতা সক্ষম এবং অক্ষম করুন

ক্যামেরার রেকর্ডিং ক্ষমতা সক্ষম করতে, PushAvStreamTransport বৈশিষ্ট্যের setTransportStatus() পদ্ধতিতে TransportStatusEnum.Active পাস করুন। রেকর্ডিং ক্ষমতা নিষ্ক্রিয় করতে, এটি 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
}

চেক করার আরেকটি উপায় হল একটি predicate সহ 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
    }
}

শুরু করুন এবং টকব্যাক বন্ধ করুন

টকব্যাক শুরু করতে, WebRtcLiveView বৈশিষ্ট্যের startTalkback() পদ্ধতিতে কল করুন। থামাতে, 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)
  }
}