在我的应用程序中,我们需要显示从服务器接收到的视频帧到我们的 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 -- 我相信我总是在创建图像,但我想我应该只创建一次位图,并且总是在我们收到时做/提供新的缓冲区。
请分享你的观点。