1

嗨,我的任务是在 android 中显示一组解码帧。在我的本机代码中,我有一个字符(char)指针,它保存解码帧的地址。我想在我的设备上显示这个框架,所以我得到了一个提示: 在 Android 中显示 YUV 图像, 因此在我的活动类中我编写了以下函数:

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”函数声明为原生但我将指针表示为什么?

例如:我的 c 函数是:

void fwriter(int *ptr, char *ptr)
{
  ....
}

在我的 java 类中,我如何将此函数声明为本地函数?请帮忙。在 java/Android 中显示 YUV 的任何其他方法也将受到赞赏。谢谢你。

4

2 回答 2

1

虽然 JPEG 编码和解码在大多数手机上可能是硬件加速的,但我希望您自己编写的一个简单的 RGB->YUV 转换 for-loop 会更快(即使在不使用本机库的 Java 中也足够快)并且更简单。

是公式。如果您使用 OpenGLES 进行显示,请考虑使用片段着色器进行即时转换。

最后,这是您可以在 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;
于 2013-02-05T07:27:25.250 回答
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);
于 2015-05-21T10:33:46.553 回答