我使用统一的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上不起作用。 这更有趣;)
答案 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();
}