9

こんにちは,mediaRecorder を使って音声を録音したいと思っています。保存したいフォーマットはamrです。

this.mediaRecorder = new MediaRecorder();
this.mediaRecorder.setAudioChannels(1);
this.mediaRecorder.setAudioSamplingRate(8000);

this.mediaRecorder.setAudioEncodingBitRate(16);
this.mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
this.mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
this.mediaRecorder.setOutputFile(this.file.getAbsolutePath());

this.mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

私はthis.mediaRecorder.setAudioEncodingBitRate(16)を使用しましたが、一部のデバイスは問題ありません

mediaRecorder.setAudioEncodingBitRate(12500)、一部のデバイスは問題ありません

しかし、私は mediaRecorder.setAudioEncodingBitRate を削除します 一部のデバイスは問題ありません

私の質問は、デフォルトの AudioEncodingBitRate を取得する方法です。どのパラメーターを使用する必要がありますか?

4

3 に答える 3

29

AudioEncodingBitRate の設定が低すぎます。私は同じ間違いをしました:-)

これはうまくいくようです:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
if (Build.VERSION.SDK_INT >= 10) {
    recorder.setAudioSamplingRate(44100);
    recorder.setAudioEncodingBitRate(96000);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
} else {
    // older version of Android, use crappy sounding voice codec
    recorder.setAudioSamplingRate(8000);
    recorder.setAudioEncodingBitRate(12200);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
recorder.setOutputFile(file.getAbsolutePath());
try {
    recorder.prepare();
} catch (IOException e) {
    throw new RuntimeException(e);
}

発想はここから

プラス:ドキュメントを読んでください。setAudioSamplingRate のドキュメントには、次のように書かれています。

サンプリング レートは、オーディオ録音の形式とプラットフォームの機能に大きく依存します。たとえば、AAC オーディオ コーディング標準でサポートされているサンプリング レートは 8 ~ 96 kHz の範囲で、AMRNB でサポートされているサンプリング レートは 8 kHz、AMRWB でサポートされているサンプリング レートは 16 kHz です。

于 2013-02-04T18:58:54.300 に答える
1

エンコードのビットレートは、サンプル レートから計算する必要があることがわかりました。

これらの値がどのように関連しているかについての良い記事がhttps://micropyramid.com/blog/understanding-audio-quality-bit-rate-sample-rate/にあります

高品質の録音には 8:1 圧縮を使用します。私は 48 KHz のサンプリングを好みますが、この投稿で要求された 8000 Hz のサンプル レートでも同じロジックが機能します。

final int BITS_PER_SAMPLE = 16;       // 16-bit data
final int NUMBER_CHANNELS = 1;        // Mono
final int COMPRESSION_AMOUNT = 8;     // Compress the audio at 8:1


public MediaRecorder setupRecorder(String filename, int selectedAudioSource, int sampleRate) {
    final int uncompressedBitRate = sampleRate * BITS_PER_SAMPLE * NUMBER_CHANNELS;
    final int encodedBitRate = uncompressedBitRate  / COMPRESSION_AMOUNT;
    mediaRecorder = new MediaRecorder();
    try  {
        mediaRecorder.setAudioSource(selectedAudioSource);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setAudioSamplingRate(sampleRate);
        mediaRecorder.setAudioEncodingBitRate(encodedBitRate);
        mediaRecorder.setOutputFile(filename);
    }catch (Exception e) {
        // TODO
    }
    return mediaRecorder;
}

MediaRecorder mediaRecorder = setupRecorder(this.file.getAbsolutePath(), 
                                   MediaRecorder.AudioSource.MIC, 
                                   8000);
于 2019-09-16T13:10:21.930 に答える