カメラ デバイスタイプは、2 つのトレイトを使用して実装されます。PushAvStreamTransportTrait
は、プッシュベースのプロトコルを使用して音声と動画のストリーム転送を処理します。WebRtcLiveViewTrait
は、ライブ ストリーミングとトークバックを制御する機能を提供します。カメラ機能を備えた実装の場合、ドアホン デバイスタイプもこれらのトレイトを使用します。
Google Home の API のデバイスタイプ | トレイト | Swift サンプルアプリ | ユースケース |
---|---|---|---|
カメラ
静止画像や動画をキャプチャするデバイス。カメラには、アクセス可能なライブ配信、双方向のトークバック、検出アクティビティなどの機能が搭載されている場合があります。 |
必須のトレイト google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
カメラ | |
ドアホン
ドアの外にあるボタンを押すと、音や光の信号を発して、ドアの向こう側にいる人の注意を引くためのデバイス。ドアホンには、アクセシビリティ対応のライブ配信、双方向のトークバック、検出イベントなどの機能が搭載されている場合があります。 |
必須のトレイト google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
ドアホン |
ライブ配信を開始する
ライブ配信を開始するには、セッション記述プロトコル(SDP)文字列を WebRtcLiveViewTrait
トレイトの startLiveView(offerSdp:)
メソッドに送信します。このメソッドは次の 3 つの値を返します。
- セッションの SDP。
- セッションの長さ(秒数)。
- セッションの延長または終了に使用できるセッション ID。
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
を渡します。次の例では、これらの呼び出しを 1 つの呼び出しでラップし、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)")
}
}
}
録画機能が有効になっているかどうかを確認する
カメラの録画機能が有効になっているかどうかを確認するには、接続がアクティブかどうかを確認します。次の例では、これを行う 2 つの関数を定義しています。
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 を開始するには、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)")
}
}