试图从Android相机获取最大fps

时间:2014-06-24 10:50:33

标签: android camera buffer frame-rate

我正在开发Android应用程序,我需要从相机中获取最大fps。

我一直在尝试实现setPreviewCallbackWithBuffer,但我无法让它工作。

有人能给我一个例子或解释吗?

我设置了一个计时器,每10毫秒运行一次,然后运行takePicture()。这是正确的,或者获取最大fps的方法是什么?

我已经到处搜索,但我找不到适合我的解释。

谢谢。

编辑2:

startRecording.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
    if(!recording)
    {
        recording = true;
        thread.start();

        cam.startPreview();     
        Size previewSize=cam.getParameters().getPreviewSize();
        int dataBufferSize=(int)(previewSize.height*previewSize.width*(ImageFormat.getBitsPerPixel(cam.getParameters().getPreviewFormat())/8.0));

        cam.addCallbackBuffer(new byte[dataBufferSize]);
        cam.addCallbackBuffer(new byte[dataBufferSize]);
        cam.addCallbackBuffer(new byte[dataBufferSize]);
        cam.setPreviewCallbackWithBuffer(new PreviewCallback() {
            public void onPreviewFrame(byte[] imageData, Camera arg1) {
                try {
                    photos.add(imageData);
                } catch(Exception e) {                                                                  System.out.println("ERROR!");
                }

            }
        });
    }
(...)

谢谢!

1 个答案:

答案 0 :(得分:1)

问题#1:定时器

引用the documentation for setPreviewCallbackWithBuffer()

  

使用addCallbackBuffer(byte [])提供的缓冲区,除了在屏幕上显示之外,还为每个预览帧安装一个回调函数。只要预览处于活动状态且缓冲区可用,就会重复调用回调。任何其他预览回调都会被覆盖。

因此,请删除Timer。只需拨打setPreviewCallbackWithBuffer()一次,您就可以使用预览框进行调用,因为它们已准备好进行处理。

问题#2:硬编码缓冲区大小

引用the documentation for addCallbackBuffer()

  

对于YV12以外的格式,缓冲区的大小通过将预览图像宽度,高度和每像素字节数相乘来确定。可以从getPreviewSize()读取宽度和高度。可以使用getPreviewFormat()中的图像格式从getBitsPerPixel(int)/ 8计算每像素的字节数。

     

如果使用YV12格式,可以使用setPreviewFormat(int)中列出的公式计算大小。

请遵循这些说明,而不是猜测缓冲区大小。

问题#3:添加缓冲区

进一步引用the documentation for addCallbackBuffer()

  

将预先分配的缓冲区添加到预览回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。当预览帧到达并且仍然存在至少一个可用缓冲区时,将使用缓冲区并从队列中删除缓冲区。然后使用缓冲区调用预览回调。如果帧到达并且没有剩余缓冲区,则丢弃该帧。应用程序应在完成处理数据时添加缓冲区。

当您致电addCallbackBuffer()时,请预先致电setPreviewCallbackWithBuffer()获取一些缓冲区。在onPreviewFrame()中,安排后台线程来处理该帧的缓冲区。完成该工作后,通过调用addCallbackBuffer()将相同的缓冲区添加回池中。 NOT 只是继续分配新的缓冲区。