Kamera cihaz türü iki özellik kullanılarak uygulanır:
PushAvStreamTransport,
bu özellik, push tabanlı protokoller kullanarak ses ve video akışı aktarımını yönetir ve
WebRtcLiveView,
bu özellik, canlı yayınları ve talkback'i kontrol etme olanağı sağlar.
Herhangi bir özelliği kullanmadan veya özellikleri güncellemeye çalışmadan önce cihazın özellik ve komut desteğini mutlaka kontrol edin. Daha fazla bilgi için Androidcihazlarını kontrol etme başlıklı makaleye bakın.
| 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 |
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: HomeDevice) { return cameraDevice.type(GoogleCameraDevice).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 süresi önceden belirlenir 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 }
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) } }
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) } }
Kameranın kayıt özelliğini etkinleştirmek veya devre dışı bırakmak, kamera videosunu açmak veya kapatmakla aynıdır. Kameranın videosu açıkken kayıt yapılır (etkinlikler ve ilgili klipler için).
Kayıt özelliği devre dışı bırakıldığında (kamera videosu kapalıyken):
- Kamera,
connectivityStatecihaz türüne göre çevrimiçi olarak görünmeye devam edebilir. - Canlı yayına erişilemiyor ve kamera herhangi bir bulut etkinliği algılamıyor.
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 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 } }
Ses ayarları
Çeşitli kamera ses ayarları, Home API'leri aracılığıyla kontrol edilebilir.
Mikrofonu açma veya kapatma
Cihazın mikrofonunu açmak veya kapatmak için yerleşik setMicrophoneMuted Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin microphoneMuted özelliğini güncelleyin:
// Turn the device's microphone on or off suspend fun turnOffMicrophone(disableMicrophone: Boolean, trait: CameraAvStreamManagement) { trait.update { setMicrophoneMuted(disableMicrophone) } }
Ses kaydını etkinleştirme veya devre dışı bırakma
Cihazda ses kaydını etkinleştirmek veya devre dışı bırakmak için yerleşik setRecordingMicrophoneMuted Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin recordingMicrophoneMuted özelliğini güncelleyin:
// Turn audio recording on or off for the device suspend fun turnOffAudioRecording(disableAudioRecording: Boolean, trait: CameraAvStreamManagement) { trait.update { setRecordingMicrophoneMuted(disableAudioRecording) } }
Hoparlörün ses düzeyini ayarlama
Cihazın hoparlör sesini ayarlamak için yerleşik setSpeakerVolumeLevel Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin speakerVolumeLevel özelliğini güncelleyin:
// Adjust the camera speaker volume suspend fun adjustSpeakerVolume(volume: Int, trait: CameraAvStreamManagement) { trait.update { setSpeakerVolumeLevel(volume.toUbyte()) } }
Diğer ayarlar
Diğer çeşitli kamera ayarları Home API'leri aracılığıyla kontrol edilebilir.
Resim yönünü değiştirme
Kamera görüntüsünün (video) yönü döndürülebilir. Video yalnızca 180 derece döndürülebilir.
Kameranın görüntü yönünü değiştirmek için yerleşik setImageRotation Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin imageRotation özelliğini güncelleyin:
// Change the camera's image orientation val isRotated = false cameraAvStreamManagement.update { setImageRotation(if (isRotated) 180.toUShort() else 0.toUShort()) }
Gece görüşünü açma veya kapatma
Kamerada gece görüşünü açmak veya kapatmak için yerleşik TriStateAutoEnum
nightVision
Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin setNightVision özelliğini güncelleyin:
// Turn night vision on cameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.On) } // Turn night vision off CameraAvStreamManagement.update { setNightVision(CameraAvStreamManagementTrait.TriStateAutoEnum.Off) }
Durum LED'inin parlaklığını değiştirme
Durum LED'inin parlaklığını değiştirmek için yerleşik setStatusLightBrightness Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin statusLightBrightness özelliğini güncellemek üzere ThreeLevelAutoEnum kullanın:
// Set the LED brightness to high cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.High) } // Set the LED brightness to low cameraAvStreamManagement.update { setStatusLightBrightness(CameraAvStreamManagementTrait.ThreeLevelAutoEnum.Low) }
Kamera görüntü alanını değiştirme
Kamera görüntü alanı, Nest kamera videosunu yakınlaştırma ve iyileştirme başlıklı destek makalesinde açıklanan yakınlaştırma ve kırpma özelliğiyle aynıdır.
Görünüm alanı, dört değer içeren bir ViewportStruct içinde tanımlanır. Bu değerler, görünüm alanının koordinatları olarak kullanılır. Koordinatlar şu şekilde tanımlanır:
(x1,y1) -- (x2,y1) | | (x1,y2) -- (x2,y2)
ViewportStruct değerlerinin belirlenmesi, uygulamanın kullanıcı arayüzüne ve kamera uygulamasına bağlıdır. En temel düzeyde, kamera videosunun görünüm alanını ayarlamak için yerleşik setViewport Kotlin işlevini kullanarak CameraAvStreamManagement özelliğinin viewport özelliğini ViewportStruct ile güncelleyin:
cameraAvStreamManagement .update { setViewport( CameraAvStreamManagementTrait.ViewportStruct( x1 = horizontalRange.rangeStart.roundToInt().toUShort(), x2 = horizontalRange.rangeEnd.roundToInt().toUShort(), y1 = verticalRange.rangeStart.roundToInt().toUShort(), y2 = verticalRange.rangeEnd.roundToInt().toUShort(), ) ) }
Cihazın uyanma hassasiyetini ayarlama
Cihazın uyanma hassasiyeti, cihazın etkinliği algılayabileceği aralığı azaltarak ve bu etkinliği algıladıktan sonra uyanma süresini artırarak pil tasarrufu yapmak için kullanılır.
Home API'lerinde bu, cihazın transportOptions içindeki triggerOptions öğesinin motionSensitivity özelliği kullanılarak ayarlanabilir. Bu seçenekler her cihaz için PushAvStreamTransport özelliğinde tanımlanır.
Uyandırma hassasiyeti yalnızca aşağıdaki değerlere ayarlanabilir:
- 1 = Düşük
- 5 = Orta
- 10 = Yüksek
Güncelleme işlemi, findTransport komutunu kullanarak etkin kayıt akışlarının araç yapılandırmasını bulup modifyPushTransport komutunu kullanarak yapılandırmayı yeni hassasiyet değeriyle değiştirmektir:
// Create a struct with the new wake-up sensitivity val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionSensitivity = OptionalValue.present(wakeUpSensitivity.toUByte()) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }
Maksimum etkinlik süresini ayarlama
Maksimum etkinlik süresi, kameranın bir etkinlik için klip kaydedeceği süredir. Bu, Home API'leri aracılığıyla cihaz başına Google Home app (GHA) üzerinden olduğu gibi saniyelik aralıklarla yapılandırılabilir:
- 10 saniye
- 15 saniye
- 30 saniye
- 60 saniye (1 dakika)
- 120 saniye (2 dakika)
- 180 saniye (3 dakika)
Home API'lerinde bu, cihazın transportOptions içindeki triggerOptions öğesinin motionTimeControl özelliği kullanılarak ayarlanabilir. Bu seçenekler her cihaz için PushAvStreamTransport özelliğinde tanımlanır.
Güncelleme işlemi için findTransport komutunu kullanarak etkin kayıt akışlarının aktarım yapılandırmasını bulun, ardından modifyPushTransport komutunu kullanarak yapılandırmayı yeni etkinlik uzunluğu değeriyle değiştirin:
// Create a struct with the new max event length // where maxDuration is the length in seconds val toUpdate = TransportOptionsStruct( triggerOptions = TransportTriggerOptionsStruct( motionTimeControl = OptionalValue.present( TransportMotionTriggerTimeControlStruct(maxDuration = it.toUInt()) ) ) ) // Get the configurations for active connections val connections = pushAvStreamTransport.findTransport().transportConfigurations // Update all recording streams with the new transport options. for (connection in connections) { if (connection.transportOptions.getOrNull()?.streamUsage == StreamUsageEnum.Recording) { trait.modifyPushTransport( connectionId = connection.connectionId, transportOptions = toUpdate, ) } }