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

Unity中使用Agora.io切换Android设备的第二前置超广角摄像头问题

Unity中使用Agora.io切换Android设备的第二前置超广角摄像头问题

嗨,我来帮你搞定这个问题!针对Unity里用Agora切换到Android设备的非默认前置超广角摄像头,我给你整理了两种可行的方案,你可以一步步尝试:

方案一:优先尝试Agora内置的摄像头切换接口

这是最简单的方式,不用折腾自定义采集,先试试能不能直接通过Agora的API枚举并切换:

  • 首先在Agora引擎初始化完成后,调用GetVideoDeviceCount()获取设备上所有可用的视频设备数量
  • 循环遍历每个设备,用GetVideoDeviceInfo(index)拿到设备的名称和ID,你可以把这些信息打印到Unity的控制台里,找带“Ultra Wide”(或者类似“Wide Angle”)且标注“Front”的设备
  • 找到目标设备ID后,调用SetVideoDevice(deviceId)完成切换,这个操作在加入频道前后都可以执行,但要确保摄像头没有被其他进程占用

给你一段参考代码:

// 假设agoraEngine是你初始化好的Agora引擎实例
int deviceCount = agoraEngine.GetVideoDeviceCount();
for (int i = 0; i < deviceCount; i++)
{
    string deviceName = "";
    string deviceId = "";
    agoraEngine.GetVideoDeviceInfo(i, ref deviceName, ref deviceId);
    Debug.Log($"摄像头{i}: 名称={deviceName}, ID={deviceId}");
    
    // 根据设备名称筛选超广角前置,不同厂商命名可能有差异,按需调整判断逻辑
    if (deviceName.Contains("Ultra Wide") && deviceName.Contains("Front"))
    {
        int switchResult = agoraEngine.SetVideoDevice(deviceId);
        if (switchResult == 0)
        {
            Debug.Log("成功切换到超广角前置摄像头!");
        }
        else
        {
            Debug.LogError($"切换失败,错误码:{switchResult}");
        }
        break;
    }
}

方案二:如果内置接口无效,用自定义视频采集(解决你之前踩的坑)

如果Agora的内置枚举识别不到你的超广角摄像头,那就要用自定义视频采集方案,这里给你梳理关键步骤,避免之前的问题:

  1. 开启自定义视频源模式:初始化Agora引擎时,调用SetExternalVideoSource(true, false, VIDEO_SOURCE_TYPE.VIDEO_SOURCE_CAMERA),告诉引擎我们要使用外部视频源
  2. Android端获取摄像头数据:你需要通过Unity的Android交互能力(比如AndroidJavaClass调用原生代码,或者写Android插件),获取到超广角摄像头的预览帧数据(通常是NV21格式)
  3. 推送帧数据给Agora:把原生层拿到的视频帧,转换成Agora要求的格式,调用PushExternalVideoFrame()推送给引擎

核心代码示例(Unity端):

// 初始化引擎时开启自定义视频源
agoraEngine.SetExternalVideoSource(true, false, VIDEO_SOURCE_TYPE.VIDEO_SOURCE_CAMERA);

// 假设你已经从Android原生层拿到了NV21格式的视频数据byte[] videoData,以及宽高width、height
ExternalVideoFrame frame = new ExternalVideoFrame();
frame.type = VIDEO_BUFFER_TYPE.VIDEO_BUFFER_RAW_DATA;
frame.format = VIDEO_PIXEL_FORMAT.VIDEO_PIXEL_NV21;
frame.buffer = videoData;
frame.stride = width;
frame.height = height;
// 时间戳用UTC时间转毫秒,确保帧顺序正确
frame.timestamp = (long)(System.DateTime.UtcNow - new System.DateTime(1970, 1, 1)).TotalMilliseconds;

int pushResult = agoraEngine.PushExternalVideoFrame(frame);
if (pushResult != 0)
{
    Debug.LogError($"推送视频帧失败,错误码:{pushResult}");
}

注意事项:

  • 务必确保Unity项目已经申请了CAMERA权限,并且在运行时向用户请求了权限,否则无法访问摄像头
  • 不同品牌的Android设备,摄像头名称可能不一样,比如有的叫“Wide Angle Camera”,你可以多打印几个设备名称来确认
  • 自定义采集时,要保证视频帧的分辨率、帧率和Agora设置的编码参数一致,否则容易出现花屏、卡顿问题

备注:内容来源于stack exchange,提问作者BooleanLogic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 08:48:03