iOS এর জন্য ক্যামেরা ডিভাইস গাইড

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

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

ক্যামেরা

Google Camera DeviceType

home.matter.6006.types.0158

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

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

ক্যামেরা

ডোরবেল

Google Doorbell DeviceType

home.matter.6006.types.0113

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

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

ডোরবেল

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

একটি লাইভস্ট্রিম শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startLiveView(offerSdp:) পদ্ধতিতে সেশন বর্ণনা প্রোটোকল (SDP) স্ট্রিং পাঠান, যা তিনটি মান প্রদান করে:

  • অধিবেশনের জন্য SDP.
  • সেকেন্ডে সেশনের সময়কাল।
  • সেশন আইডি, যা সেশন প্রসারিত বা শেষ করতে ব্যবহার করা যেতে পারে।
public func sendOffer(offerSdp: String) async throws 
-> (answerSdp: String, mediaSessionId: String, liveViewDuration: TimeInterval) 
{
  do {
    Logger.info("Sending StartLiveView command...")
    let response = try await liveViewTrait.startLiveView(
      offerSdp: offerSdp
    )
    Logger.info("Received StartLiveView response: \(response)")
    return (
      answerSdp: response.answerSdp,
      mediaSessionId: response.mediaSessionId,
      liveViewDuration: TimeInterval(response.liveSessionDurationSeconds)
    )
  } catch {
    Logger.error("Failed to send StartLiveView command: \(error)")
    throw error
  }
}

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

লাইভস্ট্রিমগুলির একটি পূর্বনির্ধারিত সময়কাল থাকে যার পরে সেগুলি মেয়াদ শেষ হয়ে যায়। একটি সক্রিয় স্ট্রিমের সময়কাল বাড়ানোর জন্য, extendLiveView(mediaSessionId:optionalArgsProvider:) পদ্ধতি ব্যবহার করে একটি এক্সটেনশন অনুরোধ জারি করুন:

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    Logger.info("Extending live view...")
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
    Logger.info("Extended live view for \(extendedDuration.liveSessionDurationSeconds) seconds.")
  } catch {
    Logger.error("Failed to extend live view: \(error)")
    throw error
  }
}

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

ক্যামেরার রেকর্ডিং ক্ষমতা সক্ষম করতে, PushAvStreamTransportTrait বৈশিষ্ট্যের setTransportStatus(transportStatus:optionalArgsProvider:) পদ্ধতিতে TransportStatusEnum.Active পাস করুন। রেকর্ডিং ক্ষমতা নিষ্ক্রিয় করতে, এটি TransportStatusEnum.Inactive পাস করুন। নিম্নলিখিত উদাহরণে, আমরা এই কলগুলিকে একটি একক কলে মোড়ানো যা রেকর্ডিং ক্ষমতা টগল করতে Boolean ব্যবহার করে:

public func toggleIsRecording(isOn: Bool) {
  self.uiState = .loading

  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return
  }
  Task {
    do {
      Logger.debug("Toggling onOff to \(isOn ? "ON" : "OFF")...")
      try await pushAvStreamTransportTrait.setTransportStatus(
        transportStatus: isOn ? .active : .inactive)
      if isOn {
        do {
          self.player = try self.createWebRtcPlayer()
        } catch {
          Logger.error("Failed to initialize WebRtcPlayer: \(error)")
          self.uiState = .disconnected
          return
        }
        await self.player?.initialize()
        self.uiState = .live
      } else {
        self.player = nil
        self.uiState = .off
      }
    } catch {
      Logger.error("Failed to toggle onOff: \(error)")
    }
  }
}

রেকর্ডিং সক্ষমতা সক্ষম কিনা তা দেখতে পরীক্ষা করুন৷

একটি ক্যামেরার রেকর্ডিং সক্ষমতা সক্ষম কিনা তা নির্ধারণ করতে, কোনো সংযোগ সক্রিয় আছে কিনা তা পরীক্ষা করুন৷ নিম্নলিখিত উদাহরণটি এটি করার জন্য দুটি ফাংশন সংজ্ঞায়িত করে:

public func isDeviceRecording() -> Bool {
  guard let pushAvStreamTransportTrait else {
    Logger.error("PushAvStreamTransportTrait not found.")
    return false
  }
  guard
    let hasActiveConnection =
      pushAvStreamTransportTrait
      .attributes
      .currentConnections?
      .contains(where: { $0.transportStatus == .active })
  else {
    return false
  }
  return hasActiveConnection
}

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

টকব্যাক শুরু করতে, WebRtcLiveViewTrait বৈশিষ্ট্যের startTalkback(mediaSessionId:optionalArgsProvider:) পদ্ধতিতে কল করুন। থামাতে, stopTalkback(mediaSessionId:) ব্যবহার করুন।

public func toggleTwoWayTalk(isOn: Bool, mediaSessionId: String) async throws {
  do {
    Logger.info("Toggling twoWayTalk to \(isOn ? "ON" : "OFF")...")
    if isOn {
      try await liveViewTrait.startTalkback(mediaSessionId: mediaSessionId)
    } else {
      try await liveViewTrait.stopTalkback(mediaSessionId: mediaSessionId)
    }
  } catch {
    throw HomeError.commandFailed("Failed to toggle twoWayTalk: \(error)")
  }
}