web-dev-qa-db-ja.com

Androidカメラをバックグラウンドで使用する方法は?

私は現在、バックグラウンドでビデオを録画して処理する必要があるアプリを開発しています。

(カメラのプレビューデータをバックグラウンドでリアルタイムに取得し、プレビューデータを画像処理する必要があります)

ただし、それを実現するには、CameraとOpenCV as Serviceを使用する必要があり、OpenCVとAndroid.Hardware.Cameraでプレビューを使用せずにJavaCameraViewを使用することは不可能のようです。

これが私の質問です。

  1. OpenCVのNativeCameraをこの目的に使用できると聞きました。出来ますか? (おそらく例を挙げて?)

  2. この目的でJavaCameraView(または同様のもの)を使用できるメソッドはありますか?私は現在GalaxyS4を使用しています。

  3. Androidがそのような方法をサポートしていない場合、考えられる回避策はありますか?(表面ビューなしでカメラプレビューを使用するか、プレビューを使用せずにカメラデータを処理します)

  4. (オプション)なぜAndroidはそのような操作をサポートしないのですか?それは非常に迷惑です!

質問にお答えいただきありがとうございます。

11
EngineerCat

はい以下の手順で可能です。

あるイベントでバックグラウンドサービスを開始するアクティビティを1つ作成するか、アラームマネージャーを使用して要件に応じてサービスを開始および停止することもできます。

以下のコードを参照してください。

public boolean starMediaRecording(){
        Camera.Parameters params = mServiceCamera.getParameters();
        mServiceCamera.setParameters(params);
        Camera.Parameters p = mServiceCamera.getParameters();

        final List<Size> listSize = p.getSupportedPreviewSizes();
        Size mPreviewSize = listSize.get(2);
        p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        p.setPreviewFormat(PixelFormat.YCbCr_420_SP);
        mServiceCamera.setParameters(p);

        try {
            mServiceCamera.setPreviewDisplay(mSurfaceHolder);
            mServiceCamera.startPreview();
        }
        catch (IOException e) {
            Log.e(TAG, e.getMessage());
            e.printStackTrace();
        }

        mServiceCamera.unlock();

        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mServiceCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4");
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

        mMediaRecorder.prepare();
        mMediaRecorder.start(); 

        mRecordingStatus = true;

        return true;

}

public void stopMediaRecorder() {
    mServiceCamera.reconnect();

    mMediaRecorder.stop();
    mMediaRecorder.reset();

    mServiceCamera.stopPreview();
    mMediaRecorder.release();

    mServiceCamera.release();
    mServiceCamera = null;
    }
}
2
Bhaumik Thakkar

サービスを使用して、カメラをバックグラウンドで起動できます。 this を参照できます。これがお役に立てば幸いです。

0
RussVirtuoso