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