0

我使用统一的java android活动。在 android 中,我使用相机获取预览,现在我想使用 将这些数据发送到统一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;

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

4

2 回答 2

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);
}
于 2012-09-27T12:02:43.997 回答
0

我已经提出了另一种解决方案。我现在使用 SurfaceView 作为相机。我将此 SurfaceView 添加到统一活动中。

创建时:

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();
}
于 2012-09-28T12:41:01.820 回答