如何在Android编程中从相机应用程序中捕获预览图像帧?

9
我正在编写一个Android应用程序,用于捕获相机预览帧并将其转换为位图。以下是我的代码:
   Camera.PreviewCallback previewCallback = new Camera.PreviewCallback()  
    { 
            public void onPreviewFrame(byte[] data, Camera camera)  
            { 
                    try 
                    { 
                            BitmapFactory.Options opts = new BitmapFactory.Options(); 
                            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts); 
                    } 
                    catch(Exception e) 
                    {

                    } 
            } 

    }; 

    mCamera = Camera.open();
    mCamera.setPreviewCallback(previewCallback); 

我开始预览后,回调函数被调用并返回数据,但是位图为空。

当我将字节数组转换为位图时,我做错了什么?


与此(仍无答案)问题相同:https://dev59.com/SXA75IYBdhLWcg3wW3sZ - OJW
可能是在Android中获取视频图像帧的重复问题。 - Tim
2个回答

19

onPreviewFrame()函数中,你应该首先检查图像格式。


以下是NV21示例。

public void onPreviewFrame(byte[] data, Camera camera) 
{
    Parameters parameters = camera.getParameters();
    imageFormat = parameters.getPreviewFormat();
    if (imageFormat == ImageFormat.NV21)
    {
        Rect rect = new Rect(0, 0, PreviewSizeWidth, PreviewSizeHeight); 
        YuvImage img = new YuvImage(data, ImageFormat.NV21, PreviewSizeWidth, PreviewSizeHeight, null);
        OutputStream outStream = null;
        File file = new File(NowPictureFileName);
        try 
        {
            outStream = new FileOutputStream(file);
            img.compressToJpeg(rect, 100, outStream);
            outStream.flush();
            outStream.close();
        } 
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

如果你想了解另一种拍照方法,请查看这篇文章:如何在Android上使用相机


1

你尝试过在使用BitmapFactory之前将预览帧数据解码为RGB吗?默认格式是YUV,我不确定它是否与BitmapFactory兼容。Dave Manpearl的解码方法可以在这里找到:

从Android中获取视频图像帧

如果有效,请告诉我。

祝好,

保罗


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接