2

我正在开发一个图像识别应用程序,并希望相机始终自动对焦。ZXing 的人通过每隔几秒调用一次 autofocus() 解决了这个问题,但是在某些相机上,这不能顺利对焦,而是拉到一端并重新对焦。在我的 Alcatel 995、姜饼 2.3.3 API 级别 10 手机上,每次发生这种情况时,它实际上都会发出令人震惊的点击。

此手机不支持 FOCUS_MODE_CONTINUOUS_PICTURE。我尝试使用受支持的 FOCUS_MODE_CONTINUOUS_VIDEO,但它不起作用。我写了一个测试应用程序,通过回调正常捕获相机的每个预览帧,但它没有聚焦。我在应用程序中添加了录像机功能,在录制视频时,相机会一直自动对焦。但我认为,视频录制消除了在每一帧上获得回调的能力。已在 https://stackoverflow.com/questions/9477042/extract-video-frames-while-recording-the-video-on-android?rq=1如何在录制视频时显示实时过滤的相机预览进行了讨论?

这是一些测试代码:

public void surfaceCreated(SurfaceHolder holder) {
    mCamera = Camera.open();
    try {
        Camera.Parameters parameters = mCamera.getParameters();
        mCamera.setDisplayOrientation(90); // just get it right for testing
        mCamera.setParameters(parameters);
        mCamera.setPreviewDisplay(holder);
        mCamera.setPreviewCallback(new PreviewCallback() {
            public void onPreviewFrame(byte[] data, Camera arg1) {
                Log.d(TAG, String.format("Frame %d", mFrameNumber++)); // see the frames in the logcat
            }
        });
    } catch (IOException exception) {
        mCamera.release();
        mCamera = null;
        Log.d(TAG, "exception setting parameters");
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    List<Size> previewSizes = parameters.getSupportedPreviewSizes();
    Size previewSize = getOptimalPreviewSize(previewSizes, w, h);
    parameters.setPreviewSize(previewSize.width, previewSize.height);
    parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 
    mCamera.setParameters(parameters);
    mCamera.startPreview();
    if (mRecordingVideo)
        startVideo(mCamera, holder);
}

// derived from http://developer.android.com/guide/topics/media/camera.html#capture-video
private void startVideo(Camera camera, SurfaceHolder holder) {
    camera.stopPreview(); // not specified in documentation but seems to be needed
    camera.unlock();
    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setCamera(camera);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // No audio is recorded
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
    mMediaRecorder.setOutputFile("/dev/null");
    try {
        mMediaRecorder.setPreviewDisplay(holder.getSurface());
        mMediaRecorder.prepare();
    } catch (IOException e) {
        camera.release();
        Log.d(TAG, "startVideo: Failed.");
        e.printStackTrace();
    }
    mMediaRecorder.start();
}

如果我mRecordingVideo在上面的代码中设置启动录像机,我会获得自动对焦,但会丢失每个预览帧的回调。

Camera.Parameters类定义说FOCUS_MODE_CONTINUOUS_VIDEO是“用于视频录制”,但并没有明确说明它不能正常工作。

  1. 我还能做些什么来说服连续自动对焦在姜饼手机上工作而不录制视频?我错过了什么吗?
  2. 这是手机专用的吗?其他手机是否在此模式下连续自动对焦而不录制视频?如果有人想在他们的手机上试用它,我会将完整的测试应用程序的源代码发布到Github 。
4

2 回答 2

1

有人通过在另一个大陆的另一部手机上测试这个来帮助我。非常感谢,科林!

  1. 上面的代码似乎是正确的,应该可以使相机正确对焦。

  2. 此行为是特定于电话的。运行 2.3.6 的阿尔卡特 995 肯定不会在没有录像机运行的情况下在此模式下对焦。运行相同代码的三星 Galaxy Nexus(不确定是哪个操作系统)在没有运行录像机的情况下会聚焦。

于 2012-11-29T14:35:36.847 回答
1

尝试“setRecordingHint(true)”到相机参数

于 2015-09-09T09:23:59.180 回答