音视频通话

视频设备管理

功能介绍

本节介绍如何使用 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 请参考:

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.disabledtrue)。

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 摄像头(videoStream 为 MediaStream 对象)
var videoID = CRVideo_AddStreamCam(videoStream, "stream摄像头1");

// 更新 stream(保持 videoID 不变)
CRVideo_UpdateStreamCam(videoID, newVideoStream);

// 移除
CRVideo_RemoveStreamVideo(videoID);
var videoID = CRVideo_AddCanvasVCam(canvasElement, "canvas摄像头1");
CRVideo_RemoveCanvasVCam(videoID);