将Android cameraPreview数据发送给Unity

时间:2012-09-27 11:36:55

标签: c# java android camera unity3d

我使用统一的java android活动。在android中我使用Camera来获取预览,现在我想使用UnitySendMessage将这些数据发送到统一,但这里只允许使用字符串。因此,我将byte[]转换为Base64字符串,并在C#中将其解码回byte[]

我不知道我做错了什么,但我只得到一个红色问号的图像。 (想想这意味着纹理没有加载?)

这是我的java代码:

    _camera = Camera.open();
    _camera.setPreviewTexture(new SurfaceTexture(1));

    _camera.setPreviewCallback(new PreviewCallback() {

        public void onPreviewFrame(byte[] data, Camera cam)
        {
            String strData = Base64.encodeToString(data, Base64.DEFAULT);
            UnityPlayer.UnitySendMessage("VideoFeed", "PostFeedData", strData);
        }
    });

    Camera.Parameters parameters = _camera.getParameters();
    parameters.setPreviewFormat(ImageFormat.JPEG);
    parameters.setPreviewSize(480, 320);

    _camera.setParameters(parameters);
    _camera.startPreview();

这是我的函数接收方法:

    byte[] byteData = Convert.FromBase64String(data);
    Texture2D tex = new Texture2D(480,320);
    tex.LoadImage(byteData);
    renderer.material.mainTexture = tex;

我这样做是因为来自Unity的WebCamTexture在我的Android上不起作用。 这更有趣;)

2 个答案:

答案 0 :(得分:0)

首先,请确保您的相机支持:parameters.setPreviewFormat(ImageFormat.JPEG);

相机可以发送NV21格式数据,并检查tex.LoadImage(byteDate)是否知道解释您的数据(几乎可以肯定它不知道NV21,可能它甚至不知道JPEG编码数据好吧,确实如此)。

检查支持的格式:

Parameters p = camera.getParameters();
List<Integer> formats = p.getSupportedPreviewFormats();
for(Integer format: formats){
   String strFormat = "" + format;
   switch(format.intValue()){
    case ImageFormat.JPEG: strFormat = "JPEG"; break;
    case ImageFormat.NV21: strFormat = "NV21"; break;
    case ImageFormat.RGB_565: strFormat = "RGB_565"; break;
   }
    Log.v(TAG, "preview format supported: "  + strFormat);
}

答案 1 :(得分:0)

我做了另一个解决方案。我现在使用SurfaceView作为相机。我将这个SurfaceView添加到统一活动中。

OnCreate中:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    ResetData();
    _camPreview = new CameraPreview();

    TextureView texView = new TextureView(this);
    _camPreview.Init(texView);

    UnityPlayer.currentActivity.addContentView(texView, new FrameLayout.LayoutParams(400, 400));
}

当我启动相机时:

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    //Get camera
    _camera = Camera.open();
    _camera.setDisplayOrientation(90);

    _TextureView.setLayoutParams(new FrameLayout.LayoutParams(400, 400, Gravity.CENTER));
    _TextureView.setTranslationY(-100);

    //Set dummy texture
    try {
        _camera.setPreviewTexture(surface);
    }
    catch (IOException e)
    {
        Log.e("Unity", "Error surface");
    }

    //Get parameters
    Camera.Parameters parameters = _camera.getParameters();

    //Set JPEG
    parameters.setPreviewFormat(ImageFormat.JPEG);

    //Set image size
    parameters.setPreviewSize(480, 320);

    //Set new parameters
    _camera.setParameters(parameters);
    _camera.startPreview();
}