我正在尝试修改
android-Camera2Basic代码来捕获一连串的图片.但是,在我的Nexus 5上运行L 5.0.1,我无法以超过200-300ms的速度获得图片之间的延迟.
我尝试了一大堆东西,但这是最基本的.这是我修改的Camera2Basic代码的唯一部分.我的预览TextureView只有50x50dp,但这不要紧,对吧?
对于什么是值得的,这个代码只有延迟约50-100ms在我的Nexus 6,与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(); } };
解决方法
您遇到的问题是您请求的图像输出格式的工件. JPEG编码过程在摄像机管道上施加了大的停顿时间,因此在发生编码时,在一次曝光结束和下一次开始之间存在大量停机时间.
引用的30fps速率可以通过将ImageReader上的输出图像格式设置为YUV来实现,因为这是相机的“本机”输出.这将是在捕获图像时存储图像的方式,然后您将需要执行JPEG编码,分离相机的内联处理.
例如,在Nexus 5上,JPEG编码的输出停止时间为243ms,您已经观察.对于YUV_420_888输出,为0ms.同样,由于其大尺寸,RAW_SENSOR编码引入了200ms的停顿时间.
还要注意,即使您通过选择“更快”的格式删除停顿时间障碍物,仍然有最小帧时间,具体取决于输出图像大小.但是对于Nexus 5的全分辨率输出,这是33ms,这是你期待的.
相关信息在相机元数据的StreamConfigurationMap对象here中.查看getoutputStallDuration(int格式,Size大小)和getoutputMinFrameDuration(int格式,Size size)方法进行确认.