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的内置枚举识别不到你的超广角摄像头,那就要用自定义视频采集方案,这里给你梳理关键步骤,避免之前的问题:
- 开启自定义视频源模式:初始化Agora引擎时,调用
SetExternalVideoSource(true, false, VIDEO_SOURCE_TYPE.VIDEO_SOURCE_CAMERA),告诉引擎我们要使用外部视频源 - Android端获取摄像头数据:你需要通过Unity的Android交互能力(比如
AndroidJavaClass调用原生代码,或者写Android插件),获取到超广角摄像头的预览帧数据(通常是NV21格式) - 推送帧数据给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
相关产品推荐
相关产品推荐

