正如Android文档所说:
对于 YV12 以外的格式,缓冲区的大小是通过将预览图像的宽度、高度和每像素字节数相乘来确定的。宽度和高度可以从 getPreviewSize() 中读取。getBitsPerPixel(int) / 8
可以使用 getPreviewFormat() 中的图像格式从计算每个像素的字节数。
但是大多数在线代码使用bitsperpixel
创建缓冲区而不是byteperpixel=bitsperpixel/8
.
如果我使用以下代码并使用图像的确切大小(以字节为单位),将导致错误:E/Camera-JNI(3656):回调缓冲区太小!预期为 1336320 字节,但得到了 890880 字节!这是为什么?为什么缓冲区需要是图像大小的 8 倍?
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPreviewSize(width,height);
mCamera.setParameters(parameters);
int previewFormat=parameters.getPreviewFormat();
int bitsperpixel=ImageFormat.getBitsPerPixel(previewFormat);
int byteperpixel=bitsperpixel/8;
Camera.Size camerasize=parameters.getPreviewSize();
int frame_bytesize=((camerasize.width*camerasize.height)*byteperpixel);
//create buffer
byte[]frameBuffer=new byte[frame_bytesize];
//buffer registry
mCamera.addCallbackBuffer(frameBuffer);