1

我正在尝试在我的应用程序上实现 ImageReader,但我不知道为什么,他什么也没读。

List<Surface> surfaces = new ArrayList<Surface>();

        Surface previewSurface = new Surface(texture);
        previewRequestBuilder.addTarget(previewSurface);
        recordRequestBuilder.addTarget(previewSurface);
        surfaces.add(previewSurface);

        Surface recorderSurface = mediaRecorder.getSurface();
        surfaces.add(recorderSurface);

        ImageReader mImageReader = ImageReader.newInstance(previewSize.getWidth(),previewSize.getHeight(), ImageFormat.JPEG,5);
        Surface processSurface = mImageReader.getSurface();
        surfaces.add(processSurface);
        mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Log.v("ImageReader ","An Image");
            }
        },null);

        cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                captureSession = cameraCaptureSession;
                updateRequest(PREVIEW_REQUEST);
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Activity activity = getActivity();
                if (null != activity) {
                    Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
                }
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

所以我得到了 3 个 Surface:previewSurface 用于显示,recordSurface 用于录制视频,processSurface 用于获取图像(使用 ImageReader)并进行处理。但我什至没有看到我的 Log.v 一次!

提前感谢您的回答。

4

1 回答 1

1

您的代码可能无法正常工作的原因至少有两个:

  1. 在您的实现中OnImageAvailableListener,在onImageAvailable(ImageReader reader)您不读取和关闭图像的方法中。根据我的经验,如果您不从阅读器读取/关闭图像,相机就会冻结。如果是这种情况,那么您应该至少看到一次(甚至更多次)日志消息。我建议您在方法中添加读取和关闭图像:

    @覆盖
     公共无效 onImageAvailable(ImageReader 阅读器){
         Log.v("ImageReader","一幅图像");
         图片 img = reader.acquireNextImage();
         img.close();
     }

  1. 您的设备可能不支持获取特定大小和类型的 3 个流(用于 3 个表面)。您应该验证您的设备上有哪些支持(LEGACY/LIMITED/FULL)。例如,您的设备可能不支持最大大小的 3 个同时流。检查文档。有很好的表格显示了可能的情况,并仔细检查您的尺寸/类型是否合适。
于 2015-12-23T10:57:43.670 回答