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()];
楼主问题解决了吗? 现在也在学camera2 我是将预览在通过opengl或vulkan在gpu解码为rgb, 一开始我以为YUV420_888是,Y、U、V三个分量在palne里独立存储的,
并以为结构是这样的:
plane[0] :YYYYYYYYYYYY。。。。 size = w x h
plane[1] :UUUU。。。。 size = w x h / 4
plane[2 ] :VVVV。。。 size = w x h / 4
把结果打印出来却是:
plane[0] :YYYYYYYYYYYYY。。。 size = w x h
plane[1] :UVUVUVUVUVU。。。 size = w x h / 2
plane[2] :VUVUVUVUVUV。。。 size = w x h / 2
并且plane[1] 和 plane[2] 错位相等。 也就是 plane2[ i + 1 ] == plane1[ i ] 。
所以如果将plane[0] 和plane[1] 接在一起就可以构成 NV12预览格式。将plane[0]和plane[2] 结合到一起就可以得到Camera1 API的NV21预览格式。 这两种方法我都尝试了,显示 没发现有什么问题。
Camera2的 YUV420_888是YUV420的抽象格式, 它可能是YUV420p ,也可能是YUV420sp等, 这个可以通过 plane 的 getRowStride() 和 getPixelStride() 进行判断 。
我没有使用过decodeYUV420SPargb8888() ,不确定参数的具体意思, 所以请确保你传入了正确的参数。