2

画像認識アプリを開発していて、カメラが常に自動的に焦点を合わせたいと思っています。ZXing の人々は、数秒ごとに autofocus() を呼び出すことでこの問題を解決しましたが、一部のカメラでは、これはスムーズに焦点を合わせず、一方の端に移動して再焦点を合わせます。私の Alcatel 995、gingerbread 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 を実行している Alcatel 995 は、ビデオ レコーダーが実行されていないと、このモードではフォーカスしません。同じコードを実行している Samsung Galaxy Nexus (どの OS かは不明) は、ビデオ レコーダーが実行されていなくてもフォーカスします。

于 2012-11-29T14:35:36.847 に答える
1

カメラのパラメータに「setRecordingHint(true)」をしてみる

于 2015-09-09T09:23:59.180 に答える