当前位置 : 主页 > 手机开发 > android >

在Android中从相机的手机中获取帧

来源:互联网 收集:自由互联 发布时间:2021-06-11
我想从相机的手机上获取相框.所以,我尝试捕获视频,我使用matlab查找此视频的每秒帧数,我每10秒获得250帧.但是当我使用时 public void onPreviewFrame(byte[] data, Camera camera) {} 在Android上,我每1
我想从相机的手机上获取相框.所以,我尝试捕获视频,我使用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回调更快.原因是它可以将视频帧从相机发送到内核中的硬件编码器,而无需将像素放入用户空间.

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

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

网友评论