我想从相机的手机中获取相框。因此,我 try catch 视频,并使用 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);

            }
      }

最佳答案

这是真的; Android 录像机不使用 Camera.PreviewCallback ,它可能比使用 Java 回调获得的快得多。原因是它可以将视频帧从相机发送到内核内部的硬件编码器,而无需将像素放入用户空间。

但是,我已经在 Nexus 4 或 Galaxy S3 等高级设备上使用 Java 可靠地实现了 30 FPS。秘诀是:使用 Camera.setPreviewCallbackWithBuffer() 避免垃圾收集,并使用 HandlerThread 将回调从 UI 线程中推送出去。

当然,预览回调本身应该尽可能彻底地优化。在您的示例中,对 camera.getParameters() 的调用很慢并且可以避免。不应进行任何分配 ( new )。

10-07 19:40
查看更多