ach*_*ain 12 java android android-camera android-5.0-lollipop
我试图修改android-Camera2Basic代码来捕获一连串的图片.但是,在运行L 5.0.1的Nexus 5上,我无法在200-300ms之间获得图片之间的延迟.
我尝试了很多东西,但这是最基本的.这是我修改过的Camera2Basic代码的唯一部分.我的预览TextureView只有50x50dp,但这不重要,对吧?
对于它的价值,这段代码在我的Nexus 6上只有50-100ms的延迟,L 5.1.
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();
}
};
Run Code Online (Sandbox Code Playgroud)
rcs*_*ner 20
您遇到的问题是您请求的图像输出格式的工件.JPEG编码过程会在摄像机管道上产生很大的停顿时间,因此在这种编码发生时,一次曝光结束与下一次曝光结束之间会有很多停机时间.
引用的30fps速率可以通过将输出图像格式设置ImageReader为YUV来实现,因为这是相机的更"本机"输出.这将是在捕获图像时存储图像的方式,然后您必须在之后进行JPEG编码,将相机的内联处理分开.
例如,在Nexus 5上,JPEG编码的输出停顿时间为243ms,您一直在观察.对于YUV_420_888输出,它是0ms.同样,由于它们的大尺寸,RAW_SENSOR编码引入了200ms的停顿时间.
另请注意,即使您通过选择"更快"格式来移除失速时间障碍物,仍然会有最小帧时间,具体取决于输出图像大小.但对于Nexus 5的全分辨率输出,这是33毫秒,这正是你所期待的.
相关信息在此处为相机元数据的StreamConfigurationMap对象.查看确认方法和方法.getOutputStallDuration(int format, Size size)getOutputMinFrameDuration(int format, Size size)
尝试设置以下捕获请求参数
requestBuilder = camDevice
.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
requestBuilder.set(CaptureRequest.EDGE_MODE,
CaptureRequest.EDGE_MODE_OFF);
requestBuilder.set(
CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON);
requestBuilder.set(
CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF);
requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE,
CaptureRequest.NOISE_REDUCTION_MODE_OFF);
requestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
requestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
Run Code Online (Sandbox Code Playgroud)
我不确定信息进入CameraCaptureSession.CaptureCallback有多快.它没有图像数据,可以在ImageReader.OnImageAvailableListener之前或之后调用它.尝试测量ImageReader.OnImageAvailableListener调用之间的时间.并且不要忘记读取图像并释放它们,因为如果填充缓冲区并且图像未被释放,则新图像不可用.例如:
private class imageAvailableListener implements
ImageReader.OnImageAvailableListener {
@Override
public void onImageAvailable(ImageReader ir) {
Log.i(TAG, "Time = " + System.currentTimeMillis());
Image im = ir.acquireNextImage();
im.close();
}
}
ImageReader mImageReader = ImageReader.newInstance(imageReaderWidth,
imageReaderHeight, ImageFormat.YUV_420_888, 2);
mImageReader.setOnImageAvailableListener(
new imageAvailableListener(), null);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10713 次 |
| 最近记录: |