ক্যামেরা ডিভাইসের ধরন দুটি বৈশিষ্ট্য ব্যবহার করে প্রয়োগ করা হয়: PushAvStreamTransportTrait
, যা পুশ-ভিত্তিক প্রোটোকল ব্যবহার করে অডিও এবং ভিডিও স্ট্রিম পরিবহন পরিচালনা করে এবং WebRtcLiveViewTrait
, যা লাইভস্ট্রিম এবং টকব্যাক নিয়ন্ত্রণ করার ক্ষমতা প্রদান করে। ডোরবেল ডিভাইসের ধরন, ক্যামেরার ক্ষমতা আছে এমন বাস্তবায়নের জন্যও এই বৈশিষ্ট্যগুলি ব্যবহার করে।
হোম এপিআই ডিভাইসের ধরন | বৈশিষ্ট্য | সুইফট স্যাম্পল অ্যাপ | কেস ব্যবহার করুন |
---|---|---|---|
ক্যামেরা একটি ডিভাইস যা স্থির ছবি বা ভিডিও ক্যাপচার করে। ক্যামেরাগুলি অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক বা সনাক্তকরণ ইভেন্টগুলি ফিচার করতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য google PushAvStreamTransportTrait google WebRtcLiveViewTrait | ক্যামেরা | |
ডোরবেল দরজার বাইরে একটি বোতাম দ্বারা সঞ্চালিত একটি ডিভাইস যা একটি শ্রবণযোগ্য এবং/অথবা ভিজ্যুয়াল সিগন্যাল তৈরি করে, যেটি দরজার অন্য পাশে থাকা একজন ব্যক্তির দৃষ্টি আকর্ষণ করতে ব্যবহৃত হয়। ডোরবেলে অ্যাক্সেসযোগ্য লাইভস্ট্রিম, দ্বিমুখী টকব্যাক বা সনাক্তকরণ ইভেন্টগুলি বৈশিষ্ট্যযুক্ত হতে পারে। | প্রয়োজনীয় বৈশিষ্ট্য 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)")
}
}