使用手电筒获取相机Feed

时间:2015-06-05 02:09:40

标签: android unity3d concurrency camera flashlight

我实际上是在尝试使用Unity3d开发Android应用程序(我别无选择:p)。 我的问题是,如何检索Android相机Feed并打开手电筒。

我有以下代码打开闪光灯(它适用于"原生访问"):

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

我有以下代码来获取相机(它与&#34;单位访问&#34;一起使用):

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行,获取摄像头的代码可以正常工作。我认为这是关于并发......

我有两个选择:找到一种方法来打开闪光灯使用&#34;统一访问&#34; (谷歌滚动4小时后我没有答案)或使用&#34; java访问&#34;获得相机输入(相同的4小时谷歌滚动)。

感谢您的回答!

1 个答案:

答案 0 :(得分:1)

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

您可以使用Camera Capture Kit(https://www.assetstore.unity3d.com/en/#!/content/56673)之类的东西来实现您想要的效果,因为它具有打开Torch /闪光灯作为WebCamTexture扩展的方法。

打开火炬就像是

webCamTexture.SetTorchEnabled( true );

(Camera Capture Kit扩展了WebCamTexture,具有iOS / Android功能。)

这是Java代码(来自AndroidPlugin.zip)的一个示例,如果您想自己添加像SetTorchEnabled(true)这样的东西,可以使用它来定位和返回Unity Camera referance。

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");
}