私のアプリケーションでは、サーバーから受け取ったビデオ フレームを Android アプリケーションに表示する必要があります。
サーバーはビデオ データを毎秒 50 フレームで送信し、WebM でエンコードします。つまり、libvpx を使用して画像をエンコードおよびデコードします。
libvpx からデコードして YUV データを取得した後、画像レイアウト上に表示できます。
現在の実装は次のようなものです。
JNI / Native C++ コードでは、YUV データを RGB データに変換しています Android フレームワークでは、
public Bitmap createImgae(byte[] bits, int width, int height, int scan) {
Bitmap bitmap=null;
System.out.println("video: creating bitmap");
//try{
bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bits));
//}catch(OutOfMemoryError ex){
//}
System.out.println("video: bitmap created");
return bitmap;
}
ビットマップ イメージを作成するには、
次のコードを使用してimageViewの上に画像を表示するには、
img = createImgae(imgRaw, imgInfo[0], imgInfo[1], 1);
if(img!=null && !img.isRecycled()){
iv.setImageBitmap(img);
//img.recycle();
img=null;
System.out.println("video: image displayed");
}
私の質問は、この関数全体で約 40 ミリ秒かかっています。最適化する方法
はありますか? 1 - YUV データを imageView に表示する方法はありますか?
2 - RGB データからイメージ (ビットマップ イメージ) を作成する他の方法はありますか?
3 -- 私は常に画像を作成していると思いますが、ビットマップを一度だけ作成し、受け取ったときに常に新しいバッファを作成/提供する必要があると思います。
あなたの意見を共有してください。