Kamera cihaz türü iki özellik kullanılarak uygulanır:
PushAvStreamTransportTrait
,
anlık iletmeye dayalı protokoller kullanılarak ses ve video akışı aktarımını işler ve
WebRtcLiveViewTrait
,
canlı yayınları ve talkback'i kontrol etme olanağı sağlar.
Kamera özelliklerine sahip uygulamalarda, kapı zili cihaz türü de bu özellikleri kullanır.
Home API'leri Cihaz Türü | Özellikler | Swift Örnek Uygulaması | Kullanım Örneği |
---|---|---|---|
Kamera
Sabit görüntü veya video çeken bir cihaz. Kameralarda erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri bulunabilir. |
Zorunlu Özellikler google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kamera | |
Kapı zili
Kapının dışındaki bir düğmeyle etkinleştirilen, kapının diğer tarafında bulunan bir kişinin dikkatini çekmek için kullanılan sesli ve/veya görsel sinyal veren cihaz. Kapı zillerinde erişilebilir canlı yayınlar, iki yönlü konuşma veya algılama etkinlikleri yer alabilir. |
Zorunlu Özellikler google PushAvStreamTransportTrait google WebRtcLiveViewTrait |
Kapı zili |
Canlı yayın başlatma
Canlı yayın başlatmak için Oturum Açıklama Protokolü (SDP) dizesini WebRtcLiveViewTrait
özelliğinin startLiveView(offerSdp:)
yöntemine gönderin. Bu yöntem üç değer döndürür:
- Oturumun SDP'si.
- Oturum süresi (saniye cinsinden).
- Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
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
}
}
Canlı yayını uzatma
Canlı yayınların önceden belirlenmiş bir süresi vardır ve bu süre sonunda sona erer. Etkin bir akışın süresini uzatmak için extendLiveView(mediaSessionId:optionalArgsProvider:)
yöntemini kullanarak uzatma isteğinde bulunun:
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
}
}
Kayıt özelliğini etkinleştirme ve devre dışı bırakma
Kameranın kayıt özelliğini etkinleştirmek için TransportStatusEnum.Active
öğesini PushAvStreamTransportTrait
özelliğinin setTransportStatus(transportStatus:optionalArgsProvider:)
yöntemine iletin. Kayıt özelliğini devre dışı bırakmak için TransportStatusEnum.Inactive
simgesini geçin.
Aşağıdaki örnekte, bu aramaları, kayıt özelliğini etkinleştirmek veya devre dışı bırakmak için Boolean
kullanan tek bir aramada sarmalıyoruz:
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)")
}
}
}
Kayıt özelliğinin etkin olup olmadığını kontrol etme
Bir kameranın kayıt özelliğinin etkin olup olmadığını belirlemek için herhangi bir bağlantının etkin olup olmadığını kontrol edin. Aşağıdaki örnekte bu işlemi gerçekleştirmek için iki işlev tanımlanmaktadır:
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'i başlatma ve durdurma
TalkBack'i başlatmak için
WebRtcLiveViewTrait
özelliğinin startTalkback(mediaSessionId:optionalArgsProvider:)
yöntemini çağırın.
Durdurmak için stopTalkback(mediaSessionId:)
simgesini kullanın.
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)")
}
}