Android SDK によると、MediaRecorder.setCamera を使用して、プレビューをリセットせずに、ビデオのキャプチャとプレビューのために既存のカメラ インスタンスをリサイクルできます。サンプルを見つけることができず、すべての試みは無駄でした: 間違った状態の例外が発生するか、MediaRecorder.prepare が失敗します。
- この方法がまったく使用可能かどうかは誰にもわかりませんか?
- じゃあどうやって使えばいいの?
- Web で入手できるサンプルはありますか?
Android SDK によると、MediaRecorder.setCamera を使用して、プレビューをリセットせずに、ビデオのキャプチャとプレビューのために既存のカメラ インスタンスをリサイクルできます。サンプルを見つけることができず、すべての試みは無駄でした: 間違った状態の例外が発生するか、MediaRecorder.prepare が失敗します。
私は同じ問題に遭遇し、それがどのように機能するかを見つけました。いくつかのことを正しく行う必要があります。まず、 Android ドキュメントからステート チャートを確認する必要があります。
コマンドの動作順序は次のとおりです。
mCamera = Camera.open();
rec = new MediaRecorder(); // state "Initial"
mCamera.lock();
mCamera.unlock();
rec.setCamera(mCamera); // state still "Initial"
rec.setVideoSource(MediaRecorder.VideoSource.CAMERA); // state "Initialized"
rec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // state "DataSourceConfigured"
rec.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
rec.setPreviewDisplay(surfaceHolder.getSurface());
rec.setOutputFile(Environment.getExternalStorageDirectory() + "/test.mp4");
rec.prepare(); // state "Prepared"
rec.start(); // state "Recording"
// ...
rec.stop(); // state "Initial"
完全な例はここにあります。
Android Camera アプリのソースは、最良の例を提供します。調査の結果、recorder.setCamera(camera)
のインスタンス化直後MediaRecorder
、または少なくとも設定が適用される前に を呼び出す必要があることがわかりました。呼び出す前に設定 (setVideoSource()
など) を適用するsetCamera()
と、エラーが発生します。
@lyron からヒントをもらいました。
まず、フロントカメラを開きます。
int cameraId = -1;
int camNums = Camera.getNumberOfCameras();
for( int i = 0 ; i < camNums ; i++) {
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(i, info);
if( info.facing == CameraInfo.CAMERA_FACING_FRONT ) {
cameraId = i;
break;
}
}
mCamera = Camera.open(cameraId);
mCamera.unlock();
上記のようにフロントカメラを使用する必要があります。
そして、カメラのロックを解除することを忘れないでください。
そうしないと、以下のエラーが表示されます。
E/MediaRecorder(15509): start failed: -19
E/SampleVideoRecorder(15509): Exception :
E/SampleVideoRecorder(15509): java.lang.RuntimeException: start failed.
E/SampleVideoRecorder(15509): at android.media.MediaRecorder.start(Native Method)
次に、このように他の設定を行う前にカメラを設定します。
recorder = new MediaRecorder();
recorder.setCamera( mCamera ); // like this!
recorder.setAudioSource( MediaRecorder.AudioSource.MIC);
recorder.setVideoSource( MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoSize( 2560, 1440 );
recorder.setVideoFrameRate(30);
recorder.setPreviewDisplay(holder.getSurface());
recorder.setOutputFile( s_dir );
try {
recorder.prepare();
recorder.start();
} catch( Exception e ) {
Log.e("SampleVideoRecorder", "Exception : ", e );
recorder.release();
recorder = null;
}
prepare() の前に setCamera() を呼び出す必要があると誰かが言っています。
しかし、私は自分のコードが機能していることを見ています。
mediarecorder のインスタンスを作成した後、次の関数を使用しようとしましたか?
//カメラのロックを解除して、別のプロセスがアクセスできるようにします。
mCameraDevice.unlock();
//録画に使用するカメラを設定します。この関数を使用して、カメラ オブジェクトを分解せずに、プレビュー モードと //キャプチャ モードをすばやく切り替えます。
mMediaRecorder.setCamera(mCameraDevice);
役立つリンクが 2 つ見つかりました。Android Camera git リポジトリとMediaRecorder の例