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

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

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

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

ক্যামেরা

Google Camera DeviceType

home.matter.6006.types.0158

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

প্রয়োজনীয় বৈশিষ্ট্য
google PushAvStreamTransportTrait
গুগল ওয়েবআরটিসিলাইভভিউট্রেট

ক্যামেরা

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

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

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

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

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

public func extendLiveView(mediaSessionId: String) async throws {
  do {
    // Extending live view
    let extendedDuration = try await liveViewTrait.extendLiveView(mediaSessionId: mediaSessionId)
  } catch {
    // Failed to extend live view
    throw error
  }
}

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

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

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

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

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

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

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

ক্যামেরার রেকর্ডিং ক্ষমতা সক্রিয় বা নিষ্ক্রিয় করা ক্যামেরার ভিডিও চালু বা বন্ধ করার মতোই। যখন একটি ক্যামেরার ভিডিও চালু থাকে, তখন এটি রেকর্ডিং হয় (ইভেন্ট এবং সম্পর্কিত ক্লিপগুলির উদ্দেশ্যে)।

যখন রেকর্ডিং ক্ষমতা অক্ষম থাকে (ক্যামেরা ভিডিও বন্ধ থাকে):

  • ডিভাইসের ধরণের connectivityState অনুসারে ক্যামেরাটি এখনও অনলাইনে দেখাতে পারে।
  • লাইভস্ট্রিমটি অ্যাক্সেস করা যাচ্ছে না, এবং ক্যামেরা কোনও ক্লাউড ইভেন্ট সনাক্ত করতে পারে না।

রেকর্ডিং ক্ষমতা সক্রিয় আছে কিনা তা পরীক্ষা করে দেখুন।

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

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

অডিও সেটিংস

হোম এপিআই-এর মাধ্যমে বিভিন্ন ক্যামেরা অডিও সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

মাইক্রোফোন চালু বা বন্ধ করুন

ডিভাইসের মাইক্রোফোন চালু বা বন্ধ করতে, বিল্ট-ইন setMicrophoneMuted ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের microphoneMuted বৈশিষ্ট্যটি আপডেট করুন:

// Turn the device's microphone on or off
func setMicrophone(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

অডিও রেকর্ডিং চালু বা বন্ধ করুন

ডিভাইসের জন্য অডিও রেকর্ডিং চালু বা বন্ধ করতে, বিল্ট-ইন setRecordingMicrophoneMuted ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের recordingMicrophoneMuted বৈশিষ্ট্যটি আপডেট করুন:

// Turn audio recording on or off for the device
func setAudioRecording(on: Bool) async {
  do {
    _ = try await self.cameraAvStreamManagementTrait?.update {
      $0.setRecordingMicrophoneMuted(!on)
    }
  } catch {
    // Error
  }
}

স্পিকারের ভলিউম সামঞ্জস্য করুন

ডিভাইসের জন্য স্পিকার ভলিউম সামঞ্জস্য করতে, বিল্ট-ইন setSpeakerVolumeLevel ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের speakerVolumeLevel বৈশিষ্ট্যটি আপডেট করুন:

// Adjust the camera speaker volume
func setSpeakerVolume(to value: UInt8) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setSpeakerVolumeLevel(value)
    }
  } catch {
    // Error
  }
}

অন্যান্য সেটিংস

হোম এপিআই-এর মাধ্যমে অন্যান্য বিভিন্ন ক্যামেরা সেটিংস নিয়ন্ত্রণ করা যেতে পারে।

ছবির ওরিয়েন্টেশন পরিবর্তন করুন

ক্যামেরার ছবির (ভিডিও) ওরিয়েন্টেশন ঘোরানো যেতে পারে। ভিডিওটি কেবল ১৮০ ডিগ্রি ঘোরানো যেতে পারে।

ক্যামেরার ছবির ওরিয়েন্টেশন পরিবর্তন করতে, বিল্ট-ইন setImageRotation ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের imageRotation বৈশিষ্ট্যটি আপডেট করুন:

// Change the camera's image orientation
// Value must be 0 or 180
func setImageRotation(to value: UInt16) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setImageRotation(value)
    }
  } catch {
    // Error
  }
}

নাইট ভিশন চালু বা বন্ধ করুন

ক্যামেরার জন্য নাইট ভিশন চালু বা বন্ধ করতে, বিল্ট-ইন setNightVision ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের nightVision বৈশিষ্ট্য আপডেট করতে TriStateAutoEnum ব্যবহার করুন:

// Turn night vision on or off
func setNightVision(
  to value: Google.CameraAvStreamManagementTrait.TriStateAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setNightVision(value)
    }
  } catch {
    // Error
  }
}

স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করুন

স্ট্যাটাস LED এর উজ্জ্বলতা পরিবর্তন করতে, বিল্ট-ইন setStatusLightBrightness ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের statusLightBrightness বৈশিষ্ট্য আপডেট করতে ThreeLevelAutoEnum ব্যবহার করুন:

// Set the LED brightness
func setStatusLightBrightness(
  to value: Google.CameraAvStreamManagementTrait.ThreeLevelAutoEnum
) async {
  do {
    _ = try await cameraAvStreamManagementTrait.update {
      $0.setStatusLightBrightness(value)
    }
  } catch {
    // Error
  }
}

ক্যামেরার ভিউপোর্ট পরিবর্তন করুন

ক্যামেরা ভিউপোর্টটি জুম এবং ক্রপ বৈশিষ্ট্যের মতোই যা জুম এবং এনহ্যান্স নেস্ট ক্যামেরা ভিডিও সাপোর্ট নিবন্ধে বর্ণিত হয়েছে।

ভিউপোর্টটি একটি ViewportStruct এ সংজ্ঞায়িত করা হয় যার চারটি মান থাকে, যা ভিউপোর্টের স্থানাঙ্ক হিসেবে ব্যবহৃত হয়। স্থানাঙ্কগুলি নিম্নরূপ সংজ্ঞায়িত করা হয়:

(x1,y1) -- (x2,y1)
   |          |
(x1,y2) -- (x2,y2)

ViewportStruct এর মান নির্ধারণ করা অ্যাপের UI এবং ক্যামেরা বাস্তবায়নের উপর নির্ভর করে। খুব মৌলিক স্তরে, ক্যামেরা ভিডিওর ভিউপোর্ট সেট করতে, বিল্ট-ইন setViewport ফাংশন ব্যবহার করে CameraAvStreamManagementTrait বৈশিষ্ট্যের viewport বৈশিষ্ট্যটি ViewportStruct দিয়ে আপডেট করুন।

func setCrop(x1: UInt16, y1: UInt16, x2: UInt16, y2: UInt16) {

  let viewport = Google.CameraAvStreamManagementTrait.ViewportStruct(
    x1: x1,
    y1: y1,
    x2: x2,
    y2: y2
  )

  Task {
    do {
      try await cameraAvStreamManagementTrait.update {
        $0.setViewport(viewport)
      }
    } catch {
      // Error
    }
  }

}

একটি TransportOptionsStruct তৈরি করুন

কিছু সেটিংসের জন্য TransportOptionsStruct এর বৈশিষ্ট্যগুলিতে পরিবর্তন প্রয়োজন, যা তারপর একটি স্ট্রিমিং সংযোগের পরিবহন বিকল্পগুলিতে প্রেরণ করা হয়। Swift এর জন্য, কোনও বৈশিষ্ট্য আপডেট করার আগে এই কাঠামোটি তৈরি করা প্রয়োজন।

নিম্নলিখিত সেটিং পরিবর্তনগুলির সাথে ব্যবহারের জন্য স্ট্রাক্ট তৈরি করতে এই সহায়ক ফাংশনটি ব্যবহার করুন:

func getTransportOptions(
  transportOptions: Google.PushAvStreamTransportTrait.TransportOptionsStruct,
  wakeUpSensitivity: UInt8?,
  maxEventLength: UInt32?
) async throws
  -> Google.PushAvStreamTransportTrait.TransportOptionsStruct
{

  var newMotionTimeControl:
    Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct? = nil
  if let maxEventLength {
    guard let motionTimeControl = transportOptions.triggerOptions.motionTimeControl else {
      throw HomeError.failedPrecondition(
        // Error - cannot update max event length without motion time control
    }
    newMotionTimeControl =
      Google.PushAvStreamTransportTrait.TransportMotionTriggerTimeControlStruct(
        initialDuration: motionTimeControl.initialDuration,
        augmentationDuration: motionTimeControl.augmentationDuration,
        maxDuration: maxEventLength,
        blindDuration: motionTimeControl.blindDuration
      )
  }

  return Google.PushAvStreamTransportTrait.TransportOptionsStruct(
    streamUsage: .recording,
    videoStreamID: nil,
    audioStreamID: nil,
    tlsEndpointID: transportOptions.tlsEndpointID,
    url: transportOptions.url,
    triggerOptions: Google.PushAvStreamTransportTrait.TransportTriggerOptionsStruct(
      triggerType: .motion,
      motionZones: nil,
      motionSensitivity: wakeUpSensitivity,
      motionTimeControl: newMotionTimeControl,
      maxPreRollLen: nil
    ),
    ingestMethod: .cmafIngest,
    containerOptions: Google.PushAvStreamTransportTrait.ContainerOptionsStruct(
      containerType: .cmaf,
      cmafContainerOptions: nil
    ),
    expiryTime: nil
  )
}

private func getRecordingConnection() async throws
  -> Google.PushAvStreamTransportTrait.TransportConfigurationStruct?
{
  guard let pushAvStreamTransportTrait else {
    // Error - PushAvStreamTransport trait not available
    return nil
  }

  let connections = try await pushAvStreamTransportTrait.findTransport().transportConfigurations

  for connection in connections {
    guard let transportOptions = connection.transportOptions,
      transportOptions.streamUsage == .recording
    else {
      continue
    }

    return connection
  }

  return nil
}

ডিভাইসের জাগরণ সংবেদনশীলতা সামঞ্জস্য করুন

ডিভাইসটির জেগে ওঠার সংবেদনশীলতা ব্যাটারি সংরক্ষণের জন্য ব্যবহৃত হয়, ডিভাইসটি যে পরিসরের কার্যকলাপ অনুভব করতে পারে তা হ্রাস করে এবং সেই কার্যকলাপ সনাক্ত করার পরে ঘুম থেকে ওঠার সময় বাড়িয়ে।

হোম এপিআইগুলিতে, ডিভাইসের transportOptionstriggerOptions এর motionSensitivity বৈশিষ্ট্য ব্যবহার করে এটি সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransportTrait বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।

জাগরণ সংবেদনশীলতা শুধুমাত্র নিম্নলিখিত মানগুলিতে সেট করা যেতে পারে:

  • ১ = কম
  • ৫ = মাঝারি
  • ১০ = উচ্চ

আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন সংবেদনশীলতা মান দিয়ে কনফিগারেশনটি পরিবর্তন করা।

modifyPushTransport কমান্ডের জন্য সম্পূর্ণ TransportOptionsStruct পাস করা প্রয়োজন, তাই আপনাকে প্রথমে বর্তমান কনফিগারেশন থেকে বিদ্যমান মানগুলি অনুলিপি করতে হবে। এটি করার জন্য একটি সহায়ক ফাংশনের জন্য একটি TransportOptionsStruct তৈরি করুন দেখুন।

func setWakeUpSensitivity(to value: UInt8) async {
  do {
    let connection = try await getRecordingConnection()
    guard let connection,
      let transportOptions = connection.transportOptions
    else {
      // Error - Transport options not available
      return
    }

    guard transportOptions.triggerOptions.motionSensitivity != nil else {
      // Error - Motion sensitivity not available to be updated for this device
      return
    }

    try await pushAvStreamTransportTrait.modifyPushTransport(
      connectionID: connection.connectionID,
      transportOptions: self.getTransportOptions(
        transportOptions: transportOptions,
        wakeUpSensitivity: value,
        maxEventLength: nil
      )
    )

  } catch {
    // Error
  }
}

ইভেন্টের সর্বোচ্চ দৈর্ঘ্য সামঞ্জস্য করুন

সর্বাধিক ইভেন্ট দৈর্ঘ্য হল ক্যামেরাটি একটি ইভেন্টের জন্য একটি ক্লিপ রেকর্ড করার সময়কাল। হোম এপিআই-এর মাধ্যমে এটি প্রতি ডিভাইসে, Google Home app (GHA) এর মতো একই দৈর্ঘ্যে, কয়েক সেকেন্ডের ব্যবধানে কনফিগার করা যেতে পারে:

  • ১০ সেকেন্ড
  • ১৫ সেকেন্ড
  • ৩০ সেকেন্ড
  • ৬০ সেকেন্ড (১ মিনিট)
  • ১২০ সেকেন্ড (২ মিনিট)
  • ১৮০ সেকেন্ড (৩ মিনিট)

হোম এপিআইগুলিতে, ডিভাইসের transportOptionstriggerOptions এর motionTimeControl বৈশিষ্ট্য ব্যবহার করে এটি সেট করা যেতে পারে। এই বিকল্পগুলি প্রতিটি ডিভাইসের জন্য PushAvStreamTransportTrait বৈশিষ্ট্যের মধ্যে সংজ্ঞায়িত করা হয়।

আপডেট করার প্রক্রিয়া হল findTransport কমান্ড ব্যবহার করে সক্রিয় রেকর্ডিং স্ট্রিমগুলির জন্য পরিবহন কনফিগারেশন খুঁজে বের করা, তারপর modifyPushTransport কমান্ড ব্যবহার করে নতুন ইভেন্ট দৈর্ঘ্যের মান দিয়ে কনফিগারেশনটি পরিবর্তন করা।

modifyPushTransport কমান্ডের জন্য সম্পূর্ণ TransportOptionsStruct পাস করা প্রয়োজন, তাই আপনাকে প্রথমে বর্তমান কনফিগারেশন থেকে বিদ্যমান মানগুলি অনুলিপি করতে হবে। এটি করার জন্য একটি সহায়ক ফাংশনের জন্য একটি TransportOptionsStruct তৈরি করুন দেখুন।

func setMaxEventLength(to value: UInt32) async {
  do {
    let connection = try await getRecordingConnection()
    guard let connection,
      let transportOptions = connection.transportOptions
    else {
      // Error - Transport options not available
      return
    }

    guard transportOptions.triggerOptions.motionTimeControl != nil else {
      // Error - Motion time control not available to be updated for this device
      return
    }

    try await pushAvStreamTransportTrait.modifyPushTransport(
      connectionID: connection.connectionID,
      transportOptions: self.getTransportOptions(
        transportOptions: transportOptions,
        wakeUpSensitivity: nil,
        maxEventLength: value
      )
    )

  } catch {
    // Error
  }
}