Android camera2捕获连拍太慢

我正在尝试修改android-Camera2Basic代码以捕获一连串的图片。但是,在运行L 5.0.1的Nexus

5上,图片之间的延迟不会超过200-300ms。

我已经尝试了很多东西,但这是最基本的。这是我修改过的Camera2Basic代码的唯一部分。我的预览TextureView只有50x50dp,但这没关系,对吧?

就其价值而言,此代码在我的Nexus 6(带有L 5.1)上仅能延迟50-100毫秒。

private void captureStillPicture() {

try {

List<CaptureRequest> captureList = new ArrayList<CaptureRequest>();

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

for (int i=0;i<10;i++) {

captureList.add(mPreviewRequestBuilder.build());

}

mCaptureSession.stopRepeating();

mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null);

mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() {

@Override

public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,

TotalCaptureResult result) {

Log.d("camera","saved");

mPictureCounter++;

if (mPictureCounter >= 10)

unlockFocus();

}

};

回答:

您遇到的问题是您所请求的图像输出格式的伪像。JPEG编码过程将大量的停顿时间加在相机管线上,因此在一次曝光结束与下一次曝光之间(这种编码发生时)会有很多停机时间。

引用的30fps速率可以通过将输出图像格式设置ImageReader为YUV来实现,因为这是相机的“本机”输出。这将是在捕获图像时存储图像的一种方式,然后您将必须随后进行JPEG编码,这与相机的内联处理是分开的。

例如,在Nexus

5上JPEG,您一直在观察的编码输出停顿时间为243ms。对于YUV_420_888输出,它是0毫秒。同样,由于其尺寸较大,RAW_SENSOR编码会引入200ms的停顿时间。

还请注意,即使通过选择“更快”的格式消除了停顿时间障碍,根据输出图像的大小,仍然有最短的帧时间。但是,对于Nexus

5的全分辨率输出,这是33ms,这正是您所期望的。

相关信息位于相机元数据的StreamConfigurationMap对象中,在此处。请查看getOutputStallDuration(int

format, Size size)getOutputMinFrameDuration(int format, Size size)方法进行确认。

以上是 Android camera2捕获连拍太慢 的全部内容, 来源链接: utcz.com/qa/428511.html

回到顶部