从安卓手机相机获取帧

4

我想从手机相机中获取帧。因此,我尝试捕捉视频,并使用Matlab查找此视频的每秒帧数,结果得到了每10秒250帧。但是当我使用

public void onPreviewFrame(byte[] data, Camera camera) {}

在Android上,我每10秒只能获得70帧。你知道为什么吗?以下是我的代码:

private Camera.PreviewCallback previewCallBack = new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

        System.out.println("Get frame " + frameNumber);
        if (data == null)
            throw new NullPointerException();
        Camera.Parameters p = camera.getParameters();
        Camera.Size size = p.getPreviewSize();
        if (frameNumber == 0) {
            startTime = System.currentTimeMillis();
        }
        // Log.e("GetData", "Get frame " + frameNumber);
        frameNumber++;

        camera.addCallbackBuffer(data);

            }
      }
1个回答

8
那是真的;Android视频录制不使用Camera.PreviewCallback,可能比Java回调快得多。原因是它可以将摄像头的视频帧发送到内核中的硬件编码器,而无需将像素放入用户空间。
然而,在像Nexus 4或Galaxy S3这样的高级设备上,我已经可靠地实现了30 FPS的Java。秘诀是:通过使用Camera.setPreviewCallbackWithBuffer()避免垃圾回收,并通过使用HandlerThread将回调推到UI线程之外。
当然,预览回调本身应尽可能优化。在您的示例中,调用camera.getParameters()很慢,可以避免使用。不应进行任何分配(new)。

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