Android平台之不预览获取照相机预览数据帧及精确(2)

另外还要主要的就是要记得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就没有上传了,如果有什么问题可以直接留言讨论。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8b3f2db8225a635fb9ada2a49b1a4587.html