您的位置:首页 > 其它

onPreviewFrame报GC问题解决方法

2017-04-24 10:38 471 查看


CameraPreView遇到的一些问题

1、onPreviewFrame运行一段时间后便不进入回调函数

tip:1.在onPreviewFrame函数里加入mCamera.add

在调用Camera.startPreview()接口前,我们需要setPreviewCallbackWithBuffer,而setPreviewCallbackWithBuffer之前我们需要重新addCallbackBuffer,因为setPreviewCallbackWithBuffer 使用时需要指定一个字节数组作为缓冲区,用于预览图像数据 即addCallbackBuffer,然后你在onPerviewFrame中的data才会有值;

3,从上面看来,我们设置addCallbackBuffer的地方有两个,一个是在startPreview之前,一个是在onPreviewFrame中,这两个都需要调用,如果在onPreviewFrame中不调用,那么,就无法继续回调到onPreviewFrame中了。

CallbackBuffer(data);

2.surfaceChanged里加入mCamera.addCallbackBuffer(gBuffer);

mCamera.setPreviewCallbackWithBuffer(this);

3.surfaceCreated里mCamera.setPreviewDisplay(mSurfaceHolder);

gBuffer = previewBuffer();

mCamera.addCallbackBuffer(gBuffer);

mCamera.setPreviewCallbackWithBuffer(this);

4.private byte[] previewBuffer() {

Log.d("Function","previewBuffer iniciado");

int bufferSize;

byte buffer[];

int bitsPerPixel;

Camera.Parameters mParams = mCamera.getParameters();

Camera.Size mSize = mParams.getPreviewSize();

Log.d("Function","previewBuffer: preview size=" + mSize.height + " " + mSize.width);

int mImageFormat = mParams.getPreviewFormat();

if (mImageFormat == ImageFormat.YV12) {

int yStride = (int) Math.ceil(mSize.width / 16.0) * 16;

int uvStride = (int) Math.ceil((yStride / 2) / 16.0) * 16;

int ySize = yStride * mSize.height;

int uvSize = uvStride * mSize.height / 2;

bufferSize = ySize + uvSize * 2;

buffer = new byte[bufferSize];

Log.d("Function","previewBuffer: buffer size=" + Integer.toString(bufferSize));

return buffer;

}

bitsPerPixel = ImageFormat.getBitsPerPixel(mImageFormat);

bufferSize = (int) (mSize.height * mSize.width * ((bitsPerPixel / (float) 8)));

buffer = new byte[bufferSize];

Log.d("Function","previewBuffer: buffer size=" + Integer.toString(bufferSize));

return buffer;

}

5.在每次改变相机参数时,在startView之前加上mCamera.addCallbackBuffer(gBuffer);

mCamera.setPreviewCallbackWithBuffer(this);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐