Kamera cihaz türü iki özellik kullanılarak uygulanır:
PushAvStreamTransport
,
anlık iletmeye dayalı protokoller kullanılarak ses ve video akışı aktarımını işler ve
WebRtcLiveView
,
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 | Kotlin Ö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 PushAvStreamTransport google WebRtcLiveView |
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 PushAvStreamTransport google WebRtcLiveView |
Kapı zili |
Canlı yayın başlatma
Canlı yayın başlatmak için Oturum Açıklama Protokolü (SDP) dizesini WebRtcLiveView
özelliğinin startLiveView()
yöntemine gönderin. Bu yöntem, üç değer içeren bir WebRtcLiveViewTrait.StartLiveViewCommand.Response
döndürür:
- Oturumun SDP'si.
- Saniye cinsinden oturum süresi.
- Oturumu uzatmak veya sonlandırmak için kullanılabilecek oturum kimliği.
suspend fun getWebRtcLiveViewTrait(cameraDevice, cameraDeviceType) { return cameraDevice.type(cameraDeviceType).trait(WebRtcLiveView).first { it?.metadata?.sourceConnectivity?.connectivityState == ConnectivityState.ONLINE } } // Start the live view suspend fun startCameraStream(trait: WebRtcLiveView,offerSdp: String) { val response = trait.startLiveView(offerSdp) // Response contains three fields (see below) return response } ... // This is used to manage the WebRTC connection val peerConnection: RTCPeerConnection = ... ... val startResponse = startCameraStream(sdp) val answerSdp = startResponse?.answerSdp val sessionDuration = startResponse?.liveSessionDurationSeconds val mediaSessionId = startResponse?.mediaSessionId peerConnection.setRemoteDescription(SessionDescription.Type.ANSWER, answerSdp)
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 WebRtcLiveView.extendLiveView()
yöntemini kullanarak uzatma isteğinde bulunun:
// Assuming camera stream has just been started suspend fun scheduleExtension(trait: WebRtcLiveView, mediaSessionId: String, liveSessionDurationSeconds: UShort ) { delay(liveSessionDurationSeconds - BUFFER_SECONDS * 1000) val response = trait.extendLiveView(mediaSessionId) // returns how long the session will be live for return response.liveSessionDurationSeconds }
Kayıt özelliğini etkinleştirme ve devre dışı bırakma
Kameranın kayıt özelliğini etkinleştirmek için TransportStatusEnum.Active
öğesini PushAvStreamTransport
özelliğinin setTransportStatus()
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:
// Start or stop recording for all connections. suspend fun setCameraRecording(isOn: Boolean) { val pushAvStreamTransport = getPushAvStreamTransport if(isOn) { pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Active) } else { pushAvStreamTransport.setTransportStatus(TransportStatusEnum.Inactive) } }
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:
// Get the on/off state suspend fun onOffState(cameraDevice: HomeDevice, cameraDeviceType) { // Query the device for pushAvStreamTransport val pushAvTrait = getPushAvStreamTransport() return pushAvTrait.recordModeActive() } // Check to see if the camera's recording capability is enabled fun PushAvStreamTransport.recordModeActive(): Boolean { return currentConnections?.any { it.transportStatus == TransportStatusEnum.Active } ?: false }
Kontrol etmenin bir diğer yolu da findTransport()
işlevini bir yüklemle kullanmaktır:
// Fetch the current connections suspend fun queryRecordModeState(cameraDevice: HomeDevice, cameraDeviceType) { val pushAvStreamTransport = getPushAvStreamTransport() return pushAvStreamTransport.findTransport().let { it.transportConfigurations.any { it.transportStatus == TransportStatusEnum.Active } }
TalkBack'i başlatma ve durdurma
TalkBack'i başlatmak için
WebRtcLiveView
özelliğinin startTalkback()
yöntemini çağırın. Durdurmak için stopTalkback()
simgesini kullanın.
// Make sure camera stream is on suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) { if(isOn) { trait.startTalkback(mediaSessionId) } else { trait.stopTalkback(mediaSessionId) } }