我的任务是在android中显示一组已解码的帧。在我的本机代码中,我有一个字符(char)指针,它保存解码帧的地址。我想在我的设备上显示这个框架,所以我得到了一个提示: Displaying YUV Image in Android 因此,在我的活动课中,我写了以下函数:
public void displayFrame(byte[] data, int fwidth,int fheight){
ImageView frameImgView=(ImageView) findViewById(R.id.imageView2);
ByteArrayOutputStream out=new ByteArrayOutputStream();
YuvImage yuvimg=new YuvImage(data, ImageFormat.NV21, fwidth, fheight, null);
yuvimg.compressToJpeg(new Rect(0, 0, fwidth, fheight), 100, out);
byte[] imageBytes = out.toByteArray();
Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
frameImgView.setImageBitmap(image);
return;
}
因此,从我的本机代码,我需要在java中调用此函数。从链接: http://www.altdevblogaday.com/2011/12/09/running-native-code-on-android-part-1/ 我知道如何从本机c调用java函数。 但是要调用java函数,我们需要一个环境变量来做到这一点。我的java类我已经将main函数声明为native,并为该main函数生成了一个标题:
JNIEXPORT jint JNICALL Java_com_example_decoder_Decoder_mainFunction(JNIEnv *env, jclass jobj, jint argc, jstring argv1, jstring argv2);
然而我的mainFunction调用一个函数“fwriter(某个指针,一些指针)”,它有一个指针作为参数。我如何获得相同的环境变量。我知道在java类中我需要将“fwriter”函数声明为native,但是我将什么表示为指针?
例如:我的c函数是:
void fwriter(int *ptr, char *ptr)
{
....
}
在我的java类中,如何将此函数声明为native? 请帮忙。 任何其他在java / Android中显示YUV的方法也将受到赞赏。 谢谢。
答案 0 :(得分:1)
虽然JPEG编码和解码可能在大多数手机上都是硬件加速的,但我希望你自己写的一个简单的RGB-> YUV转换为很多更快(甚至在Java中也足够快)不使用本地库而且更简单。
Here是公式。如果您使用OpenGLES进行显示,请考虑使用fragment shader即时进行转换。
最后,这是您可以在CPU上使用的仅整数代码:
Ytmp = 4768 * (Y - 16);
R = (Ytmp + 6537 * (V - 128)) >> 12;
G = (Ytmp - 3330 * (V - 128) - 1602 * (U - 128)) >> 12;
B = (Ytmp + 8266 * (U - 128)) >> 12;
答案 1 :(得分:1)
您可以使用RenderScript内在函数将YUV图像转换为位图。
您可以准备一次这些对象:
RenderScript rs = RenderScript.create(getContext());
ScriptIntrinsicYuvToRGB yuvToRgb = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(fwidth).setY(fheight);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
Bitmap image = Bitmap.createBitmap(fwidth, fheight, Bitmap.Config.ARGB_8888);
并为您执行转化的每一帧:
in.copyFrom(data);
yuvToRgb.setInput(in);
yuvToRgb.forEach(out);
out.copyTo(image);