Android FOCUS_MODE_CONTINUOUS_VIDEO 和捕捉预览帧

Posted

技术标签:

【中文标题】Android FOCUS_MODE_CONTINUOUS_VIDEO 和捕捉预览帧【英文标题】:Android FOCUS_MODE_CONTINUOUS_VIDEO and capturing preview frames 【发布时间】:2012-10-19 03:19:29 【问题描述】:

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

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

这里是一些测试代码:

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 是“用于视频录制”,但并没有明确说明它不能正常工作。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

您可能是对的,但是我现在用于测试的所有手机都可以正常工作,所以我无法判断。在过去的 3 年里,手机摄像头的操作有了很大的改进。无论如何,谢谢! 我今天在使用 Nexus 5、SGS 6 等时仍然遇到类似的问题......当我刚刚将 CONTINUOUS_VIDEO 设置为相机时,它不起作用......而是使用了 CONTINUOUS_PICTURE。只有当我也调用 setRecordingHint(true) 时,焦点才真正使用 CONTINUOUS_VIDEO。 我现在使用的代码更喜欢 Continuous_picture 而不是 Continuous_video,所以我在 nexus 5 上看不到问题。但感谢(文字)提示!

以上是关于Android FOCUS_MODE_CONTINUOUS_VIDEO 和捕捉预览帧的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制

Android游戏开发大全的目录