نوع دستگاه Camera با استفاده از دو ویژگی اجرا میشود: PushAvStreamTransportTrait
، که انتقال جریان صوتی و تصویری را با استفاده از پروتکلهای مبتنی بر فشار انجام میدهد، و WebRtcLiveViewTrait
، که توانایی کنترل پخش زنده و گفتگو را فراهم میکند. نوع دستگاه Doorbell برای آن دسته از پیاده سازی هایی که دارای قابلیت دوربین هستند نیز از این ویژگی ها استفاده می کند.
APIهای خانگی نوع دستگاه | صفات | برنامه نمونه سوئیفت | استفاده از مورد |
---|---|---|---|
دوربین دستگاهی که تصاویر ثابت یا فیلم می گیرد. دوربینها ممکن است پخش زنده قابل دسترسی، گفتگوی دوطرفه یا رویدادهای شناسایی را داشته باشند. | صفات مورد نیاز google PushAvStreamTransportTrait google WebRtcLiveViewTrait | دوربین | |
زنگ در دستگاهی که توسط دکمهای در خارج از در فعال میشود و سیگنال شنیداری و/یا بصری ایجاد میکند و برای درخواست توجه شخصی که جایی در طرف دیگر در است استفاده میشود. زنگ درها ممکن است دارای پخش زنده قابل دسترسی، گفتگوی دو طرفه یا رویدادهای شناسایی باشند. | صفات مورد نیاز google PushAvStreamTransportTrait google WebRtcLiveViewTrait | زنگ در |
پخش زنده را شروع کنید
برای شروع پخش زنده، رشته پروتکل شرح جلسه (SDP) را به متد startLiveView(offerSdp:)
صفت WebRtcLiveViewTrait
ارسال کنید که سه مقدار را برمی گرداند:
- 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
}
}
قابلیت ضبط را فعال و غیرفعال کنید
برای فعال کردن قابلیت ضبط دوربین، TransportStatusEnum.Active
را به روش setTransportStatus(transportStatus:optionalArgsProvider:)
ویژگی PushAvStreamTransportTrait
منتقل کنید. برای غیرفعال کردن قابلیت ضبط، آن را ارسال کنید 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
}
شروع و توقف گفتگو
برای شروع Talkback، متد startTalkback(mediaSessionId:optionalArgsProvider:)
ویژگی WebRtcLiveViewTrait
را فراخوانی کنید. برای توقف، از 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)")
}
}