סוג המכשיר 'מצלמה' מיושם באמצעות שתי תכונות:
PushAvStreamTransportTrait
,
שמטפלת בהעברת סטרימינג של אודיו ווידאו באמצעות פרוטוקולים מבוססי-push, ו-
WebRtcLiveViewTrait
,
שמספקת את היכולת לשלוט בשידורים חיים ובדיבור חוזר.
סוג המכשיר Doorbell (פעמון לדלת), ביישומים שיש להם יכולות מצלמה, משתמש גם בתכונות האלה.
Home APIs Device Type | תכונות | אפליקציה לדוגמה של Swift | תרחיש לדוגמה |
---|---|---|---|
מצלמה
מכשיר שמצלם תמונות סטילס או סרטונים. יכול להיות שהמצלמות יכללו שידורים חיים נגישים, שיחה משני צידי הדלת או אירועי זיהוי. |
מאפיינים נדרשים google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
מצלמה | |
פעמון דלת
מכשיר שמפעילים באמצעות לחצן מחוץ לדלת, שמפיק אות קולי או חזותי, ומשמש לבקשת תשומת הלב של אדם שנמצא בצד השני של הדלת. יכול להיות שפעמוני הדלת יכללו שידורים חיים נגישים, תקשורת דו-כיוונית או אירועי זיהוי. |
מאפיינים נדרשים google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Doorbell |
התחלת שידור חי
כדי להתחיל שידור חי, שולחים את המחרוזת של Session Description Protocol (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
כדי להפעיל את 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)")
}
}