android5.0使用camera2 api实现实时渲染,在显示预览部分出现的问题

lzq08ms lzq08ms 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
因为要做实时渲染功能的相机,因此第一步自然是获取预览图然后保证能实时处理
试过opencv的相机处理方式,通过给相机设置一个不显示的surface,然后将获取的yuv图像数据刷到自己的surfaceview上
这个例子在5.0下可以正常运行,然而在5.0上没有办法给相机设置一个空的surface,程序抛异常

所以转而改用camera2来解决问题
现在的方案是通过修改ImageReader的接受图像类型,在回调中处理图片数据,然后将图像刷到自己的surfaceview上
所有代码写完后,获取到得图像是绿色的一层,不知道为什么,相关代码如下,希望高手指教

或者有什么好的做实时渲染功能的方案也可以请教一下

//设置ImageReader监听接收的图像类型
largest = Collections.max(Arrays.asList(map
.getOutputSizes(ImageFormat.YUV_420_888)),
new CompareSizesByArea());

bitmap = Bitmap.createBitmap(largest.getWidth(),
largest.getHeight(), Config.ARGB_8888);
mImageReader = ImageReader.newInstance(largest.getWidth(),
largest.getHeight(), ImageFormat.YUV_420_888, /* maxImages */
2);
mImageReader.setOnImageAvailableListener(
mOnImageAvailableListener, mBackgroundHandler);


分别获取yuv图像的三个通道函数,将yuv420格式转换为argb8888格式颜色数据
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {

@Override
public void onImageAvailable(ImageReader reader) {
synchronized (mThread) {
Log.d(tag, "previewing");
Image img = reader.acquireLatestImage();
if (img == null)
return;
ByteBuffer[] buffer = new ByteBuffer[3];
for (int i = 0; i < 3; i++) {
buffer[i] = img.getPlanes()[i].getBuffer();
}
rgb = new int[img.getWidth() * img.getHeight()];

byte[] y_bytes = new byte[buffer[0].remaining()];
byte[] cb_bytes = new byte[buffer[1].remaining()];
byte[] cr_bytes = new byte[buffer[2].remaining()];

buffer[0].get(y_bytes, 0, buffer[0].remaining());
buffer[1].get(cb_bytes, 0, buffer[1].remaining());
buffer[2].get(cr_bytes, 0, buffer[2].remaining());

decodeYUV420SPargb8888(rgb, y_bytes, cb_bytes, cr_bytes,
largest.getWidth(), largest.getHeight());

img.close();

// 保存文件
try {
FileOutputStream fos = new FileOutputStream(
Environment.getExternalStorageDirectory()
+ "/test/yuv");
fos.write(y_bytes);
fos.write(cb_bytes);
fos.write(cr_bytes);
fos.close();
Log.d(tag, "save");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mThread.notify();
}

}

};


我通过将yuv获取到的三通道字节数据直接写入文件,用yuv查看文件查看后也是带有一层绿色的预览图像,基本可以判断转换函数没有问题
...全文

相关推荐

评论 18
收藏 已收藏
分享
返回顶部
lzq08ms
Android 80,490 成员 91,375 内容