我试图在Android设备上保存具有固定帧率(最好高达30)的图像序列,具有相同功能的camera2(Galaxy S7),但我无法a)获得稳定的帧率,b)达到甚至20fps(使用jpeg)编码).我已经包含了Android camera2捕获突发的建议太慢了.
根据,JPEG的最小帧持续时间是33.33毫秒(对于低于1920x1080的分辨率)
characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputMinFrameDuration(ImageFormat.JPEG, size);
Run Code Online (Sandbox Code Playgroud)
并且每个尺寸的稳定度为0ms(类似于YUV_420_888).
我的捕获构建器如下所示:
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CONTROL_AE_MODE_OFF);
captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, _exp_time);
captureBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, _iso_value);
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, _foc_dist);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CONTROL_AF_MODE_OFF);
captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, _wb_value);
// https://stackoverflow.com/questions/29265126/android-camera2-capture-burst-is-too-slow
captureBuilder.set(CaptureRequest.EDGE_MODE,CaptureRequest.EDGE_MODE_OFF);
captureBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE_OFF);
captureBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_OFF);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_CANCEL);
// Orientation
int rotation = getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION,ORIENTATIONS.get(rotation));
Run Code Online (Sandbox Code Playgroud)
焦距设置为0.0(inf),iso设置为100,曝光时间设置为5ms.白平衡可以设置为OFF/AUTO/ANY VALUE,不会影响下面的时间.
我使用以下命令启动捕获会话:
session.setRepeatingRequest(_capReq.build(), captureListener, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
注意:如果我请求RepeatingRequest或RepeatingBurst,它没有区别.
在预览中(仅附加纹理表面),一切都是30fps.但是,只要我附加了一个图像阅读器(在HandlerThread上运行的监听器),我将其实例化如下(不保存,只测量帧之间的时间):
reader = ImageReader.newInstance(_img_width, _img_height, ImageFormat.JPEG, 2);
reader.setOnImageAvailableListener(readerListener, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
使用时间测量代码:
ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader myreader) {
Image image = null;
image = myreader.acquireNextImage();
if (image …Run Code Online (Sandbox Code Playgroud)