0

UnityでJava Androidアクティビティを使用しています。android では、カメラを使用してプレビューを取得します。このデータを を使用してユニティに送信したいのですが、UnitySendMessageここでは文字列のみが許可されています。したがって、 を文字列に変換byte[]し、それをデコードして に戻します。Base64C#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 で動作しないため、これを行っています。そして、これはもっと楽しいです;)

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 を unity アクティビティに追加します。

作成時:

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 に答える