视频设备管理
功能介绍
本节介绍如何使用 SDK 管理本地及房间内成员的视频设备,包括:
- 枚举指定用户的摄像头列表(含浏览器物理摄像头,以及业务添加的虚拟摄像头等)
- 获取设备信息(摄像头 ID、名称、是否禁用等)
- 设置与查询默认摄像头
- 监听摄像头列表及默认摄像头变化
除系统摄像头外,还可通过 stream 摄像头(MediaStream)、canvas 摄像头、桌面摄像头 等扩展视频源,添加后同样可通过本节接口查询 videoID 并设为默认设备。
须在成功进入房间后,方可调用本节视频设备相关接口(含本端与远端成员的设备枚举、默认摄像头设置、禁用/启用等)。
1. 设备枚举与信息
通过 CRVideo_GetAllVideoInfo 可获取指定用户(本端或远端)的摄像头列表,用于在 UI 中展示或切换。
var UID = myUID;
var videoList = CRVideo_GetAllVideoInfo(UID);
for (var i = 0; i < videoList.length; i++) {
var info = videoList[i];
// info.videoID:摄像头 ID
// info.videoName:摄像头名称
// info.userID:用户 ID
// info.disabled:是否已禁用(仅针对本端自己的摄像头)
}
若用户仅有单个摄像头,可不单独设置默认设备;多摄像头时建议配合 默认视频设备 切换。
相关类型与 API 请参考:
2. 默认视频设备
SDK 会为成员维护默认摄像头。多摄像头场景下,可通过 CRVideo_SetDefaultVideo 指定本端开摄像头时使用的设备;仅有一个摄像头时可不设置。
var UID = myUID;
var videoList = CRVideo_GetAllVideoInfo(UID);
// 获取当前默认摄像头 ID
var defVideoID = CRVideo_GetDefaultVideo(UID);
// 将指定摄像头设为默认
if (videoList.length > 0) {
CRVideo_SetDefaultVideo(UID, videoList[0].videoID);
}
设置新的默认摄像头后,房间内用户将收到 CRVideo_DefVideoChanged 通知。若需同时推送多路摄像头,可启用多摄像头能力,详见 同时推送多路视频流。
相关 API 请参考:
- CRVideo_GetDefaultVideo
- CRVideo_SetDefaultVideo
- CRVideo_SetEnableMutiVideo
- CRVideo_GetEnableMutiVideo
- CRVideo_DefVideoChanged
3. 设备变化通知
当系统摄像头插拔、或添加/移除桌面摄像头、stream 摄像头、canvas 摄像头等导致列表变化时,SDK 通过 CRVideo_VideoDevChanged 通知应用,可在回调中重新调用 CRVideo_GetAllVideoInfo 刷新 UI。
若移除的是默认摄像头,SDK 会自动选择新的默认设备,并通过 CRVideo_DefVideoChanged 通知。上述变化会同步到房间内,所有参会者均可收到对应 UID 的回调。
CRVideo_VideoDevChanged.callback = function(UID){
var videoList = CRVideo_GetAllVideoInfo(UID);
// TODO: 刷新设备列表
}
CRVideo_DefVideoChanged.callback = function(UID, videoID){
// 默认摄像头已变更
}
相关回调请参考:
4. 禁用与启用摄像头
本端可对指定 videoID 的摄像头执行软禁用,使其不出现在可用列表逻辑中(CRVideo_VideoInfoObj.disabled 为 true)。
var videoID = 1;
CRVideo_DisableCamera(videoID, true); // 禁用
CRVideo_DisableCamera(videoID, false); // 解除禁用
var disabled = CRVideo_IsCameraDisabled(videoID);
批量操作可使用 CRVideo_DisableCameras。
相关 API 请参考:
打开摄像头失败时,可参考 CRVideo_OpenVideoFailed 处理授权、占用等问题。
5. stream 与 canvas 摄像头
- stream 摄像头:调用 CRVideo_AddStreamCam 将
MediaStream添加为一路视频设备。添加后通过 CRVideo_GetAllVideoInfo 获取videoID。若需更换媒体流且保持videoID不变,应使用 CRVideo_UpdateStreamCam,而非移除后重新添加。移除时调用 CRVideo_RemoveStreamVideo。桌面摄像头的添加流程见 桌面摄像头。
// 示例:添加 stream 摄像头(videoStream 为 MediaStream 对象)
var videoID = CRVideo_AddStreamCam(videoStream, "stream摄像头1");
// 更新 stream(保持 videoID 不变)
CRVideo_UpdateStreamCam(videoID, newVideoStream);
// 移除
CRVideo_RemoveStreamVideo(videoID);
- canvas 摄像头:调用 CRVideo_AddCanvasVCam 将
canvas元素添加为一路视频设备,同样通过 CRVideo_GetAllVideoInfo 获取videoID。移除时调用 CRVideo_RemoveCanvasVCam。
var videoID = CRVideo_AddCanvasVCam(canvasElement, "canvas摄像头1");
CRVideo_RemoveCanvasVCam(videoID);