【问题标题】:Get camera Feed with flashlight使用手电筒获取相机 Feed
【发布时间】:2015-06-05 02:09:40
【问题描述】:

我实际上是在尝试使用 Unity3d 开发一个 Android 应用程序(我别无选择:p)。 我的问题是,我怎样才能检索 Android 相机提要并打开手电筒。

我有以下代码来打开闪光灯(它适用于“本机访问”):

AndroidJavaObject cameraParameters = this.camera.Call<AndroidJavaObject>("getParameters");
cameraParameters.Call("setFlashMode", "torch");
this.camera.Call("setParameters", cameraParameters);
this.camera.Call("startPreview");

我有以下代码来获取摄像头供稿(它适用于“统一访问”):

var deviceName = WebCamTexture.devices[0].name;
webcamTexture = new WebCamTexture(deviceName, 1280, 720, 30);
webcamTexture.Play();
data = new Color32[webcamTexture.width * webcamTexture.height];
webcamTexture.GetPixels32 (data);
Debug.Log (data[383650].ToString());

但是如果我用前4行打开手电筒,后面6行就不行了。如果我删除前 4 行,则获取相机馈送的代码将起作用。我认为这是关于并发的......

我有两个选择:找到一种方法来使用“统一访问”(谷歌滚动 4 小时后我没有答案)或使用“java 访问”来获取相机源(相同 4谷歌滚动小时)。

感谢您的回答!

【问题讨论】:

  • 您找到解决方案了吗?我开始认为这甚至是不可能的,除非编写一个 java android 的东西作为统一插件,在没有 webcamtexture 的情况下本地完成所有这些

标签: android unity3d concurrency camera flashlight


【解决方案1】:

如果您需要访问 WebCamTexture 的摄像头 Feed 以及为同一“捕获会话”打开 Torch - 您必须获取 android 摄像头的实例并将其打开。

您可以使用 Camera Capture Kit (https://www.assetstore.unity3d.com/en/#!/content/56673) 之类的工具来实现您想要的功能,因为它提供了一种打开手电筒/闪光灯的方法,作为 WebCamTexture 的扩展。

打开手电筒就像

webCamTexture.SetTorchEnabled( true );

(Camera Capture Kit 为 WebCamTexture 扩展了 iOS/Android 的此类功能。)

这是一个 Java 代码示例(来自 AndroidPlugin.zip),如果您想自己添加 SetTorchEnabled(true) 之类的内容,则包含该代码以定位和返回 Unity Camera 引用。

Class clsPlayer = Class.forName("com.unity3d.player.UnityPlayer");
        Field fCurrentActivity = clsPlayer.getDeclaredField("currentActivity");
        fCurrentActivity.setAccessible(true);
        com.unity3d.player.UnityPlayerActivity currentActivity = (com.unity3d.player.UnityPlayerActivity)fCurrentActivity.get(null);
        ret.playerActivity = currentActivity;

        Field fPlayer = currentActivity.getClass().getDeclaredField("mUnityPlayer");
        fPlayer.setAccessible(true);
        com.unity3d.player.UnityPlayer player = (com.unity3d.player.UnityPlayer)fPlayer.get(currentActivity);
        ret.player = player;

        Field f = player.getClass().getDeclaredField("y");
        f.setAccessible(true);
        java.util.ArrayList cameraArrays = (java.util.ArrayList)f.get( player );
        int sz = cameraArrays.size();

此代码必须包含在 Unity 的 Android 插件中,或在基于 C# 的插件中重写为“Unity Java c# 插件代码”。

这是启用 Torch 的代码。

static public void UnityCamera_SetTorchEnabledImpl( boolean value ) {
    ResolveObjectsResult ret = UnityCaptureResolveObjects();
    Camera.Parameters params = ret.camera.getParameters();

    boolean torchSupported = false;
    if( params.getSupportedFlashModes()!=null && params.getSupportedFlashModes().contains(android.hardware.Camera.Parameters.FLASH_MODE_TORCH) ) {
        if(verbose)Log.d("Unity","CameraCaptureKit: FLASH_MODE_TORCH supported.");
        torchSupported = true;
    }

    // Torh..
    if( torchSupported == true ) {
        if( value == true ) {
            if(verbose)Log.d("Unity","CameraCaptureKit: turning torch on");
            params.setFlashMode( android.hardware.Camera.Parameters.FLASH_MODE_TORCH );
            ret.camera.setParameters(params);
        } else {
            if(verbose)Log.d("Unity","CameraCaptureKit: turning torch off");
            params.setFlashMode( android.hardware.Camera.Parameters.FLASH_MODE_OFF );
            ret.camera.setParameters(params);
        }
    } else {
        Log.d("Unity", "CameraCaptureKit: Torch not supported");
        //Log.d("Unity", "CameraCaptureKit: Applying Camera parameters");
    }

    //Log.d("Unity", "CameraCaptureKit: Applying Camera parameters");
}

【讨论】:

  • 很遗憾相机捕捉套件不再存在于 assest 商店中。找不到替代品....
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多