另外还要主要的就是要记得onPreviewFrame回调函数中添加addCallbackBuffer调用,不然缓存不会自动更新,就不能获取到后续的数据帧;要获取精确时间截(这里说精确,是因为这个时间截是系统在数据发送到SurfaceTexture时设置的,非常接近预览数据生成的时间,要远比手工在onPreviewFrame中打上数据的时间截准确),还要调用updateTexImage()。可以像下面这样编写程序:
long timestampx;
if (osversion >= OSSURPORTFORSURFACETEXTURE) {
surfaceTexture.updateTexImage();
timestampx = surfaceTexture.getTimestamp()/1000000;
camera.addCallbackBuffer(previewBuffer);
}
上述代码是写在onPreviewFrame回调函数中的,有一个值得注意的地方是不要在onPreviewFrame中做耗时的工作,因为那么极可能会导致丢掉一些预览数据帧。
通过上面的方法,已经可以在不显示预览的情况下获取到数据帧,并打上极为精确的生成时间截,这对于需要精确计算时间的程序来说是非常有用的。当然是用SurfaceTexture也可以将预览图像显示出来,你可以开一个线程专门来做这件事,而不是在onPreviewFrame中完成。下面提供一段显示预览图像的参考代码:
try {
YuvImage image = new YuvImage(data, ImageFormat.NV21,
WIDTH_COLLECT, HEIGHT_COLLECT, null);
if (image != null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compressToJpeg(new Rect(0, 0, WIDTH_COLLECT,
HEIGHT_COLLECT), 100, stream);
Bitmap bm = BitmapFactory.decodeByteArray(
stream.toByteArray(), 0, stream.size());
stream.close();
Canvas canvas = previewHolder.lockCanvas();
canvas.drawBitmap(bm, 0, 0, null);
previewHolder.unlockCanvasAndPost(canvas);
}
} catch (Exception e) {
// TODO: handle exception
}
previewHolder就是要显示预览数据的SurfaceView的SurfaceHolder,当然你要可以加上synchronized同步机制。
Demo就没有上传了,如果有什么问题可以直接留言讨论。