You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Cordova SDK实现视频通话中前后摄像头切换的方法

基于ConnectyCube Cordova SDK实现摄像头切换及获取后置摄像头流

获取所有可用摄像头设备

ConnectyCube.videochat.getMediaDevices()仅返回当前活跃的媒体设备,若要获取全部摄像头(包括未在使用的后置摄像头),直接调用WebRTC原生API枚举设备即可:

async function getAllVideoDevices() {
  const devices = await navigator.mediaDevices.enumerateDevices();
  return devices.filter(device => device.kind === 'videoinput');
}

该函数会返回所有视频输入设备列表,每个设备对象包含deviceId(唯一标识)和label(设备名称,可用于区分前后摄像头)。

实现摄像头切换逻辑

切换摄像头需要先停止当前本地流,再用目标摄像头的deviceId重新创建媒体流,并更新到ConnectyCube通话会话中:

// 1. 获取所有摄像头
const cameras = await getAllVideoDevices();
// 2. 筛选后置摄像头(兼容不同设备的label命名)
const backCamera = cameras.find(cam => 
  cam.label.includes('后置') || 
  cam.label.includes('Back') || 
  cam.label.includes('back')
);

if (backCamera) {
  // 停止当前本地流,释放资源
  const currentLocalStream = ConnectyCube.videochat.getCurrentStream();
  if (currentLocalStream) {
    currentLocalStream.getTracks().forEach(track => track.stop());
  }

  // 3. 用后置摄像头创建新的媒体流
  const mediaConstraints = {
    video: { deviceId: { exact: backCamera.deviceId } },
    audio: true // 保留音频轨道
  };

  const newLocalStream = await navigator.mediaDevices.getUserMedia(mediaConstraints);
  
  // 4. 更新ConnectyCube本地流
  ConnectyCube.videochat.setLocalMediaStream(newLocalStream);
  
  // 5. 通知会话内其他用户更新你的视频轨道
  ConnectyCube.videochat.send({
    type: ConnectyCube.videochat.SIGNAL_TYPE.REPLACE_TRACK,
    sessionId: activeSessionId, // 替换为你的通话会话ID
    userId: currentUserId, // 替换为当前用户ID
    stream: newLocalStream
  });
}

关键注意事项

  • 确保Cordova项目已安装必要插件:cordova-plugin-webrtc(或对应WebRTC支持插件)、cordova-plugin-android-permissions(Android权限管理),并在config.xml中配置摄像头、麦克风权限。
  • 不同平台的摄像头label命名存在差异:iOS通常显示"Back Camera",Android可能显示"后置摄像头",判断时需覆盖多种可能的关键词。
  • 切换流后必须停止旧轨道,否则会导致设备资源占用异常。

内容的提问来源于stack exchange,提问作者Kimberley C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:26:03