突发捕获10 FPS,预览无滞后

时间:2018-03-07 14:02:55

标签: android android-camera2

我需要使用以10 FPS以突发模式捕获图像的活动来执行应用程序。 我的问题是我能够使用突发模式捕获非常快的图片,但似乎我的图像缓冲区已满,然后才有时间对待它们(我只是想把我的图像放到ArrayList中)。 所以我的缓冲区已满,我的应用程序崩溃了。

我选择的缓冲区大小为50(我不能占用太多内存)。 似乎我的爆发模式可以达到30 FPS,但我能够以10 FPS处理我的图像。

所以,我想减慢我的捕捉速度,但是当我这样做时(通过等待再重复另一次捕捉),它也会减慢我的预览速度。所以我的预览有一个滞后。

我不想保存我的图片,我只想存储它们以便稍后处理它们(在其他活动中)​​。

你有什么想法,也许是为了减慢我的捕获速度,或者加快我的治疗速度。

代码:: 我的代码基于示例Camera2Basic。

private void captureStillPicture() {
    try {
        final Activity activity = getActivity();
        if (null == activity || null == mCameraDevice) {
            return;
        }

        mPreviewRequestBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF);
        mPreviewRequestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON);
        mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF);
        mPreviewRequestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_OFF);
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);

        mCaptureSession.stopRepeating();
        mCaptureSession.abortCaptures();
        mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

        mCaptureSession.capture(mPreviewRequestBuilder.build(), captureCallback, null);

        mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());

    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

blockCapture()允许在捕获之间等待100毫秒。

private void blockCapture() {
    mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());
    while(Math.abs(timerBurst - System.currentTimeMillis()) < 1000){}
    System.out.println("ELAPSED :::::::: " + Math.abs(timerBurst - System.currentTimeMillis()));
    timerBurst = System.currentTimeMillis();
    mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
    for(int i =0; i< NB_BURST; i++){captureList.add(mPreviewRequestBuilder.build());}

}

private final CameraCaptureSession.CaptureCallback captureCallback
        = new CameraCaptureSession.CaptureCallback() {

    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                   @NonNull CaptureRequest request,
                                   @NonNull TotalCaptureResult result) {
        showToast("Saved: " + mFile);
        Log.d(TAG,"Saved: " + mFile);
        mCounterImageForSave ++;
        mCounterBurst++;
        if(mCounterImageForSave <= 1) {
            timerBurst = System.currentTimeMillis();
        }

        if(mCounterBurst >= NB_BURST && isPlayed) {
            mCounterBurst = 0;
            try {
                blockCapture();
                mCaptureSession.capture(mPreviewRequestBuilder.build(),captureCallback,null);

            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }
        if (mCounterBurst >= NB_BURST || !isPlayed)
            unlockFocus();
    }
};

我试图捕获YUV_420_888图像而不是JPEG,但我的图像全黑,我无法转换它们。 对不起,如果我的英文错误...

0 个答案:

没有答案