摄像头设备类型通过以下两种特征实现:PushAvStreamTransport
,用于使用基于推送的协议处理音频和视频流传输;WebRtcLiveView
,用于提供控制直播和对讲的功能。
对于具有摄像头功能的实现,门铃设备类型也使用这些特征。
Home API 设备类型 | 特征 | Kotlin 示例应用 | 使用场景 |
---|---|---|---|
相机
可拍摄静态图像或视频的设备。摄像头可能具有以下功能:无障碍直播、双向对讲或检测事件。 |
必需的特征 google PushAvStreamTransport google WebRtcLiveView |
相机 | |
门铃
一种通过门外的按钮启动的设备,可发出声音和/或视觉信号,用于引起门另一侧的人的注意。门铃可能具有无障碍直播、双向对讲或检测事件等功能。 |
必需的特征 google PushAvStreamTransport google WebRtcLiveView |
门铃 |
开始直播
如需开始直播,请将会话描述协议 (SDP) 字符串发送到 WebRtcLiveView
特征的 startLiveView()
方法,该方法会返回一个 WebRtcLiveViewTrait.StartLiveViewCommand.Response
,其中包含三个值:
- 会话的 SDP。
- 会话时长(以秒为单位)。
- 会话 ID,可用于延长或终止会话。
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)
延长直播
直播具有预设时长,超过该时长后直播会过期。如需延长有效直播的时长,请使用 WebRtcLiveView.extendLiveView()
方法发出延期请求:
// 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 }
启用和停用录制功能
如需启用相机的录制功能,请将 TransportStatusEnum.Active
传递给 PushAvStreamTransport
特征的 setTransportStatus()
方法。如需停用录制功能,请传递 TransportStatusEnum.Inactive
。
在以下示例中,我们将这些调用封装在一个使用 Boolean
切换录制功能的调用中:
// 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) } }
检查录制功能是否已启用
如需确定摄像头的录制功能是否已启用,请检查是否有任何连接处于活动状态。以下示例定义了两个函数来实现此目的:
// 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 }
另一种检查方法是使用带有谓词的 findTransport()
函数:
// 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
如需启动 TalkBack,请调用 WebRtcLiveView
特征的 startTalkback()
方法。如需停止,请使用 stopTalkback()
。
// Make sure camera stream is on suspend fun setTalkback(isOn: Boolean, trait: WebRtcLiveView, mediaSessionId: String) { if(isOn) { trait.startTalkback(mediaSessionId) } else { trait.stopTalkback(mediaSessionId) } }