首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android FOCUS_MODE_CONTINUOUS_VIDEO和捕获预览帧

Android FOCUS_MODE_CONTINUOUS_VIDEO和捕获预览帧
EN

Stack Overflow用户
提问于 2012-10-29 18:55:50
回答 2查看 6.9K关注 0票数 2

我正在开发一个图像识别应用程序,并希望相机始终自动对焦。ZXing的工作人员每隔几秒钟就调用自动对焦(),解决了这个问题,但是在一些相机上,对焦并不顺利,而是压缩到一端并重新聚焦。在我的Alcatel 995,姜饼2.3.3API级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如何在录制视频时实时显示过滤后的摄像机预览?上讨论过

下面是一些测试代码:

代码语言:javascript
运行
复制
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,如果有人想尝试在他们的手机。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-29 14:35:36

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

  1. 上面的代码似乎是正确的,应该会使相机正确地对焦。
  2. 这种行为是电话特有的。运行2.3.6的Alcatel 995绝对不会在这种模式下聚焦而不运行录像机。运行相同代码的三星Galaxy (不确定哪个操作系统)在没有运行录像机的情况下会聚焦。
票数 1
EN

Stack Overflow用户

发布于 2015-09-09 09:23:59

尝试相机参数的“setRecordingHint(真)”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13127914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档