web-dev-qa-db-ja.com

Android MediaRecorder

以下は、ビデオとオーディオを記録するための私の作業コードの構造です。

質問:1)なぜCamcorderProfileが必要なのですか? setProfile(...)は、QUALITY_HIGHが指定する寸法に設定しているように見えますが、後でsetVideoSize(...)を使用して必要な寸法を設定します。これにより、これが上書きされます。ただし、2つのCamcorderProfile行を削除すると、LogCat setVideoSize(...)を使用してE/MediaRecorder(19526): setVideoSize called in an invalid state: 2でアプリがクラッシュします。

2)音声を録音しないのはどうすればよいですか?ドキュメントには、setAudioSource(...)が呼び出されない場合、オーディオトラックは存在しないと記載されています。ただし、その行を削除すると、LogCat setProfile(...)を使用してE/MediaRecorder(19946): try to set the audio encoder without setting the audio source firstでアプリがクラッシュします。

3)CamcorderProfile行とsetAudioSource(...)行の両方を削除すると、1)のようにクラッシュします。

4)行を追加してみました

recorder.setOutputFormat(OutputFormat.DEFAULT);

camcorderProfile行の代わりに。しかし、今ではperpare()でクラッシュします。 setAudioSource(...)が呼び出された場合、LogCatは次のようになります。E/MediaRecorder(20737): audio source is set, but audio encoder is not set LogCatが呼び出されなかった場合、次のようになります。E/MediaRecorder(20544): video source is set, but video encoder is not set

私はインターネット全体を見てきましたが、MediaRecorderをセットアップする正しい方法の良い例を見つけることができません。 ここ API 8以降はCamcorderProfileクラスを使用する必要があることを意味しますが、問題が発生しているようです。

どんな助けでも素晴らしいでしょう!ありがとう!

コード(以下のように実行すると機能します):

recorder = new MediaRecorder();
recorder.setCamera(<<camera>>);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(profile);

recorder.setOutputFile(<<Path String>>);
recorder.setVideoSize(<<Width>>, <<Height>>);

recorder.setPreviewDisplay(<<Surface>>);

recorder.setOrientationHint(0); 
recorder.setMaxDuration(10000);
recorder.setOnInfoListener(this);

try
{
    recorder.prepare();
    recorder.start();
} catch ...
11
jacobianism

私はMediaRecorderの経験があまりありませんが、いくつかの関連トピックを読んでいたので、あなたの質問に答えようとします。

1、3、4)CamcorderProfileは、解像度だけでなく、出力形式とエンコーダー(オーディオとビデオの両方)としても設定します。おそらくsetOutputFormatを呼び出す前にsetVideoSizeを使用する必要があり、そうでない場合はその後にsetVideoEncodersetAudioEncoderを呼び出す必要があるため、エラーが発生します。 CamcorderProfileを使用したい。 [これによると 回答 ]

2)繰り返しになりますが、CamcorderProfileはオーディオプロパティ(コーデック、ビットレート、サンプルレートなど)も設定するため、呼び出す前にオーディオソースを設定する必要がありますそれが、アプリがクラッシュした理由です。オーディオを録音したくない場合は、次のコードを試してください:(テストしなかったので、実際に機能するかどうかはわかりませんが、機能すると確信しています)

recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setOutputFile(PATH);
recorder.setPreviewDisplay(SURFACE);

recorder.prepare();
recorder.start();

CamcorderProfileを使用したくない場合(つまり、オーディオまたはビデオのみを記録したい場合)、必要な品質を確保するために追加のパラメーターを設定する必要がある場合があることにも注意してください。次のサンプルコードを見てください。

recorder = new MediaRecorder();
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);

// Following code does the same as getting a CamcorderProfile (but customizable)
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// Video Settings 
recorder.setVideoSize(WIDTH, HEIGHT);
recorder.setVideoFrameRate(FRAME_RATE);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
recorder.setVideoEncodingBitRate(VIDEO_BITRATE);
// Audio Settings
recorder.setAudioChannels(AUDIO_CHANNELS);
recorder.setAudioSamplingRate(SAMPLE_RATE);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
recorder.setAudioEncodingBitRate(AUDIO_BITRATE);

// Customizable Settings such as:
//   recorder.setOutputFile(PATH);
//   recorder.setPreviewDisplay(SURFACE);
//   etc...

// Prepare and use the MediaRecorder
recorder.prepare();
recorder.start();
...
recorder.stop();
recorder.reset();
recorder.release();

これがお役に立てば幸いです。

17
Thomas H.