簡體   English   中英

在Android中從相機的手機中獲取幀

[英]Get frames from camera's phone in android

我想從相機的手機上獲取相框。 所以,我嘗試捕獲視頻,我使用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()的調用很慢,可以避免。 不應該進行分配( new )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM