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

Unity中如何访问安卓双后置摄像头并同时获取帧计算视差图?

嘿,我来帮你梳理下在Unity安卓平台上获取双后置摄像头帧、计算视差图的可行方案,针对你遇到的问题一步步拆解:

核心问题分析

你用WebCamTexture.devices只拿到前后各一个摄像头,是因为Unity的WebCamTexture在默认逻辑里,会把手机的双后置RGB摄像头(比如主摄+广角)合并成一个"后置摄像头"逻辑设备,不会单独枚举物理摄像头;而depthCameraName是针对TOF这类深度摄像头的,你的双后置都是RGB摄像头,所以这个字段为空是正常的。

可行实现方案

既然不想用依赖SLAM的Depth API,我们可以直接操作安卓原生的摄像头能力,或者借助Unity的AR Foundation(仅用其摄像头枚举/捕获能力,不启用SLAM功能)。

方案1:安卓原生Camera2 API + Unity交互

这是最直接的方式,通过调用安卓原生的Camera2 API枚举所有物理摄像头,再捕获帧数据传递到Unity:

步骤1:编写安卓原生辅助类

在Unity项目的Assets/Plugins/Android目录下创建Java类(记得替换包名):

package com.yourcompany.camerahelper;

import android.content.Context;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import java.util.ArrayList;
import java.util.List;

public class DualCameraHelper {
    // 获取所有后置物理摄像头ID
    public static List<String> getBackCameraIds(Context context) {
        List<String> backCameras = new ArrayList<>();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
            try {
                String[] cameraIds = manager.getCameraIdList();
                for (String id : cameraIds) {
                    CameraCharacteristics characteristics = manager.getCameraCharacteristics(id);
                    Integer lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
                    if (lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
                        backCameras.add(id);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return backCameras;
    }
}

步骤2:Unity端调用原生代码并捕获帧

在Unity中编写C#脚本,调用原生类获取摄像头ID,再通过ImageReader(安卓原生)捕获帧数据,转换后传递到Unity的Texture:

using UnityEngine;
using System.Collections.Generic;

public class DualCameraCapture : MonoBehaviour
{
    void Start()
    {
        if (Application.platform != RuntimePlatform.Android) return;

        // 获取安卓上下文
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        
        // 调用原生方法获取后置摄像头ID列表
        AndroidJavaClass cameraHelper = new AndroidJavaClass("com.yourcompany.camerahelper.DualCameraHelper");
        List<string> backCameraIds = cameraHelper.CallStatic<List<string>>("getBackCameraIds", currentActivity);
        
        Debug.Log($"找到后置物理摄像头数量:{backCameraIds.Count}");
        foreach (string id in backCameraIds)
        {
            Debug.Log($"摄像头ID:{id}");
        }

        // 后续可以基于摄像头ID,用安卓ImageReader捕获YUV帧,转换为RGB后传递给Unity的Texture2D/RenderTexture
        // 这部分需要处理数据格式转换,比如将YUV_420_888转为RGB格式
    }
}

注意事项

  • 记得在AndroidManifest.xml中添加摄像头权限:<uses-permission android:name="android.permission.CAMERA" />
  • 安卓版本需在5.0(API 21)及以上,因为Camera2 API从该版本开始支持

方案2:用AR Foundation枚举摄像头(不启用SLAM)

AR Foundation虽然常和ARCore绑定,但它的摄像头管理模块可以单独用来枚举物理摄像头,且不需要启用SLAM功能:

  1. 导入Unity的AR Foundation和ARCore XR Plugin包(仅用摄像头能力,不需要开启AR Session)
  2. 使用CameraManager类枚举所有摄像头,筛选后置物理摄像头:
using UnityEngine;
using UnityEngine.XR.ARFoundation;

public class ARCameraEnumerator : MonoBehaviour
{
    void Start()
    {
        var cameraManager = FindObjectOfType<ARCameraManager>();
        if (cameraManager == null) return;

        foreach (var camera in cameraManager.GetAllCameras())
        {
            if (camera.lensFacing == CameraLensFacing.Back)
            {
                Debug.Log($"后置摄像头:{camera.name},ID:{camera.cameraId}");
                // 可以为每个摄像头配置捕获参数,获取帧数据
                cameraManager.SetCurrentCamera(camera.cameraId);
                // 监听帧回调获取图像数据
                cameraManager.frameReceived += OnCameraFrameReceived;
            }
        }
    }

    void OnCameraFrameReceived(ARCameraFrameEventArgs args)
    {
        // 在这里获取摄像头帧数据,转换后用于视差计算
        var texture = args.texture;
        // ... 处理纹理数据
    }
}

这个方案的优势是不用写原生代码,Unity层面就能完成枚举和捕获,只要确保不初始化AR Session,就不会触发SLAM相关的逻辑。

最后总结

WebCamTexture对多物理摄像头的支持确实有限,所以必须借助安卓原生能力或者AR Foundation的底层摄像头模块。两种方案都能避开Depth API,直接获取双后置RGB摄像头的原始帧,满足你计算视差图的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:22:40