【问题标题】:Send Android cameraPreview data to Unity将 Android cameraPreview 数据发送到 Unity
【发布时间】:2012-09-27 11:36:55
【问题描述】:

我使用统一的 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;

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

【问题讨论】:

  • 统一标签适用于 Microsoft Unity。请不要滥用它。

标签: c# java android camera unity3d


【解决方案1】:

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

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

检查支持的格式:

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

【讨论】:

  • 如何检查我的相机是否支持它?而且 LoadImage 不知道 NV21 只知道 JPEG 和 PNG。
  • 我的相机支持JPEG。
  • 对您在 PreviewCallback 中发送的字节和您接收的字节进行字节比较。
  • java 中的字节缓冲区与 c# 中的大小相同。但是我无法检查的内容,因为 java 使它成为一个大约 10 个字符的字符串,而 c# 只返回 System.byte[]。
  • 我想说的是比较你发送的就是你收到的:strData(Android) == data (C#)(作为字符串)和data (Android) == byteData (C#)。对于字节比较,您可以检查存储在数组中的实际数字(data[0] == byteData[0] 等...)。
【解决方案2】:

我已经提出了另一个解决方案。我现在使用 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多