【问题标题】:Get frames from camera's phone in android从android中的相机手机获取帧
【发布时间】:2014-05-15 12:48:56
【问题描述】:

我想从相机的手机中获取帧。所以,我尝试捕捉视频并使用 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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多