2017-04-26 36 views
1

AndroidはYUVからRGBへのbuildin変換機能を備えていますが、以下のコードはNV21 YUV入力には問題ありませんが、NV12入力を使用するとクラッシュします。android - YUV NV12 to RenderScriptでのRGB変換

public Bitmap YUV_toRGB(byte[] yuvByteArray,int W,int H) { 
    RenderScript rs = RenderScript.create(this); 
    ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs)); 

    Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(yuvByteArray.length); 
    Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT); 

    Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H); 
    Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT); 

    in.copyFrom(yuvByteArray); 

    yuvToRgbIntrinsic.setInput(in); 
    yuvToRgbIntrinsic.forEach(out); 
    Bitmap bmp = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888); 
    out.copyTo(bmp); 

    yuvToRgbIntrinsic.destroy(); 
    rs.destroy(); 
    return bmp; 
} 

NV12をRGBに変換するコードを変更するにはどうすればよいですか?どのような入力フォーマットがサポートされているのか、どのように設定するのかは書かれていません。 ScriptIntrinsicYuvToRGB

+0

のようなサウンドは、api .setYuvFormat(ImageFormat.YUV_420_888)を持っていますが、NV21とYV12のみがサポートされているとクラッシュします。ですから、NV12のスクリプトをRGBに書く必要があると思います。この場合、buildin関数は機能しません。 – lucky1928

+0

おそらく関連している:http://stackoverflow.com/questions/28620790/converting-specialized-nv12-video-frames-to-rgb –

答えて

0

アンドロイドドキュメントが明記:

を入力割り当てがU8要素タイプとしてNV21形式で供給されます。出力がRGBAの場合、アルファチャンネルは255に設定されます。

異なるYUVフォーマットが必要な場合は、変換するために独自のRSカーネルを作成する必要があります。

関連する問題