Jenis perangkat Kamera diimplementasikan menggunakan dua trait:
PushAvStreamTransportTrait,
yang menangani transportasi streaming audio dan video menggunakan protokol berbasis push, dan
WebRtcLiveViewTrait,
yang memberikan kemampuan untuk mengontrol live stream dan talkback.
Jenis perangkat Bel Pintu, untuk penerapan yang memiliki kemampuan kamera, juga menggunakan trait ini.
| Jenis Perangkat Home API | Sifat | Aplikasi Contoh Swift | Kasus Penggunaan |
|---|---|---|---|
Kamera
Perangkat yang mengambil gambar diam atau merekam video. Kamera dapat menampilkan livestream yang mudah diakses, komunikasi dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kamera | |
Bel pintu
Perangkat yang diaktifkan oleh tombol di luar pintu yang menghasilkan sinyal suara dan/atau visual, yang digunakan untuk meminta perhatian orang yang berada di sisi lain pintu. Bel pintu mungkin memiliki fitur livestream yang dapat diakses, talkback dua arah, atau peristiwa deteksi. |
Ciri Wajib google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Bel pintu |
Memulai livestream
Untuk memulai livestream, kirim string Session Description Protocol (SDP) ke metode
startLiveView(offerSdp:)
trait
WebRtcLiveViewTrait, yang menampilkan tiga nilai:
- SDP untuk sesi.
- Durasi sesi dalam detik.
- ID sesi, yang dapat digunakan untuk memperpanjang atau menghentikan sesi.
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
}
}
Memperpanjang livestream
Livestream memiliki durasi preset setelah itu akan berakhir. Untuk memperpanjang durasi streaming aktif, kirim permintaan perpanjangan menggunakan metode
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
}
}
Mengaktifkan dan menonaktifkan kemampuan perekaman
Untuk mengaktifkan kemampuan perekaman kamera, teruskan
TransportStatusEnum.Active
ke metode
setTransportStatus(transportStatus:optionalArgsProvider:)
trait
PushAvStreamTransportTrait. Untuk menonaktifkan kemampuan perekaman, teruskan
TransportStatusEnum.Inactive.
Dalam contoh berikut, kita menggabungkan panggilan ini dalam satu panggilan yang menggunakan
Boolean untuk mengaktifkan/menonaktifkan kemampuan perekaman:
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)")
}
}
}
Periksa apakah kemampuan perekaman diaktifkan
Untuk menentukan apakah kemampuan perekaman kamera diaktifkan, periksa apakah ada koneksi yang aktif. Contoh berikut menentukan dua fungsi untuk melakukannya:
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
}
Memulai dan menghentikan TalkBack
Untuk memulai talkback, panggil metode startTalkback(mediaSessionId:optionalArgsProvider:) trait
WebRtcLiveViewTrait.
Untuk berhenti, gunakan 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)")
}
}