Android--Camera.addCallbackBuffer/setPreviewCallbackWithBuffer模式使用总结
Android--Camera.addCallbackBuffer/setPreviewCallbackWithBuffer模式使用总结,有需要的朋友可以参考下。
最近,在Camera开发框架中遇到了这样的问题,为了提高Camera的效率,采用了Camera.addCallbackBuffer()/Camera.setPreviewCallbackWithBuffer的模式,对于Camera.setPreviewCallbackWithBuffer这个接口,官方文档是这么说的:
Installs a callback to be invoked for every preview frame, using buffers supplied withCamera.AddCallbackBuffer(Byte[]), in addition to displaying them on the screen. The callback will be repeatedly called for as long as preview is active and buffers are available. Any other preview callbacks are overridden.
The purpose of this method is to improve preview efficiency and frame rate by allowing preview frame memory reuse. You must call Camera.AddCallbackBuffer(Byte[]) at some point -- before or after calling this method -- or no callbacks will received.
在这里,我们不在深究具体意思,只把如何使用的方法说明一下,这个接口使用的时候需要注意一下几点:
1,这个接口调用前,我们需要提前分配一块buffer,并且这个接口调用一定要放在onPreviewFrame()回调中:
byte[] mPreBuffer = null;
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
if (data == null || mPreviewSize == null
|| data.length != mPreviewSize.width * mPreviewSize.height * 3 / 2) {
return;
}
int size = mPreviewSize.width * mPreviewSize.height * 3 / 2; if (mPreBuffer == null) { mPreBuffer = new byte[size]; } mCamera.addCallbackBuffer(mPreBuffer);
}
2,在调用Camera.startPreview()接口前,我们需要setPreviewCallbackWithBuffer,而setPreviewCallbackWithBuffer之前我们需要重新addCallbackBuffer,因为setPreviewCallbackWithBuffer 使用时需要指定一个字节数组作为缓冲区,用于预览图像数据 即addCallbackBuffer,然后你在onPerviewFrame中的data才会有值;
3,从上面看来,我们设置addCallbackBuffer的地方有两个,一个是在startPreview之前,一个是在onPreviewFrame中,这两个都需要调用,如果在onPreviewFrame中不调用,那么,就无法继续回调到onPreviewFrame中了。