什么是好记录声音的setAudioEncodingBitRate

时间:2013-02-01 12:00:14

标签: android

你好,我想用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);

我用过.mediaRecorder.setAudioEncodingBitRate(16),有些设备还可以

mediaRecorder.setAudioEncodingBitRate(12500),有些设备还可以

但我删除了mediaRecorder.setAudioEncodingBitRate某些设备没问题

所以我的问题是如何获得默认的AudioEncodingBitRate。 我需要使用哪个参数?

3 个答案:

答案 0 :(得分:26)

您将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);
}

这个想法来自here

加:阅读文档。 setAudioSamplingRate的文档说明如下:

  

采样率实际上取决于录音的格式以及平台的功能。例如,AAC音频编码标准支持的采样率范围为8到96 kHz,AMRNB支持的采样率为8kHz,AMRWB支持的采样率为16kHz。

答案 1 :(得分:3)

我正在使用波纹管配置并提供惊人的清晰录制输出。

localFileName = getFileName()+".wav";
localFile = new File(localdir, localFileName);
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mRecorder.setOutputFormat(AudioFormat.ENCODING_PCM_16BIT);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioChannels(1);
mRecorder.setAudioEncodingBitRate(128000);
mRecorder.setAudioSamplingRate(44100);
mRecorder.setOutputFile(localFile.getPath());

但是,如果您同时播放音频并且在三星设备中存在一些问题。

[但仅在您同时播放音频并同时录制时]

答案 2 :(得分: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);