我的应用程序需要在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数据创建Image(Bitmap图像)?
3--我相信我总是在创建图像,但我应该只创建位图一次,并始终进行/提供新的缓冲区,每当我们收到时。
请分享您的意见。
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bits));
这段代码是将 YUV 转换为 RGB 吗?还是你是在本地进行转换? - weston