1

こんにちは私の仕事は、アンドロイドでデコードされたフレームのセットを表示することです。私のネイティブコードには、デコードされたフレームのアドレスを保持する character(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クラスでは、メイン関数をネイティブとして宣言し、そのメイン関数のヘッダーを生成しました:

JNIEXPORT jint JNICALL Java_com_example_decoder_Decoder_mainFunction(JNIEnv *env, jclass jobj, jint argc, jstring argv1, jstring argv2);

ただし、私の mainFunction は、パラメーターとしてポインターを持つ関数「fwriter(some pointer, some pointer)」を呼び出します。同じ環境変数を取得するにはどうすればよいですか。Javaクラスで「fwriter」関数をネイティブとして宣言する必要があることは知っていますが、ポインターを何として表現しますか??

例:私のc関数は:

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

私のJavaクラスで、この関数をネイティブとして宣言するにはどうすればよいですか?? 助けてください。Java/Android で YUV を表示する他の方法も評価されます。ありがとうございました。

4

2 に答える 2

1

RenderScript 組み込みを使用して、YUV イメージをビットマップに変換できます。

これらのオブジェクトを 1 回準備できます。

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

JPEG のエンコーディングとデコーディングは、ほとんどの携帯電話でハードウェア アクセラレーションされる可能性がありますが、自分で作成した単純な RGB->YUV 変換 for ループは、はるかに高速 (ネイティブ ライブラリを使用しない 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 に答える