2013-02-01 8 views
6

Hallo, ich möchte MediaRecorder verwenden, um Stimme aufzunehmen. Ich möchte das Format speichern ist amr.was ist gut setAudioEncodingBitRate auf Platte Stimme

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); 

i verwendet this.mediaRecorder.setAudioEncodingBitRate (16), einige Geräte ok

mediaRecorder.setAudioEncodingBitRate (12500) sind, some

ist ok, aber ich die mediaRecorder.setAudioEncodingBitRate lösche einige Geräte ok

so meine Frage, wie die AudioEncodingBitRate standardmäßig erhalten. Welchen Parameter muss ich verwenden?

Antwort

22

Sie haben AudioEncodingBitRate zu niedrig eingestellt. Ich habe den gleichen Fehler :-)

Dies scheint zu funktionieren:

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

Die Idee von here

kommt zusätzlich: die Dokumentation lesen. Die Dokumentation von setAudioSamplingRate sagt Folgendes:

Die Abtastrate hängt wirklich von dem Format für die Audioaufzeichnung, sowie von den Fähigkeiten der Plattform ab. Zum Beispiel liegt die von dem AAC-Audiocodierungsstandard unterstützte Abtastrate im Bereich von 8 bis 96 kHz, die von AMRNB unterstützte Abtastrate beträgt 8 kHz und die von AMRWB unterstützte Abtastrate beträgt 16 kHz.

+0

aber ich will – pengwang

+0

auch das amr-Format speichern, dann entfernen Sie einfach den, wenn Zweig und ust den Code aus dem sonst Teil. AMR_NB = Narrowband bedeutet, dass Sie keine höhere SamplingRate als 8k verwenden können, was zu einer schlechteren Aufnahmequalität führt. Wenn Sie den AMR-Encoder verwenden, sollten Sie das THREE_GPP-Format verwenden. –

+1

Ich denke immer noch, Ihr Hauptproblem war die setAudioEncodingBitRate-Methode. Sie müssen hier die Bitrate angeben. Bitrate = Bits/Sekunde. 12 Bit/Sekunde ist kein Wert, mit dem Sie ein Audiosignal codieren können. [hier] (http://en.wikipedia.org/wiki/Bit_rate) finden Sie gängige Bitraten für Audio. Z.B. 800 Bits/Sekunde sind minimal notwendig, um Sprache zu erkennen. –

1

Ich verwende Balg-Konfigurationen und gibt erstaunlich klare Aufnahme-Ausgabe.

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()); 

jedoch, wenn Sie gleichzeitig mit Wiedergabe von Audio aufnehmen entlang es hat einige Probleme in der Samsung-Geräte.

[aber erst wieder, wenn Sie Audio-spielen und beide zusammen in der gleichen Zeit der Aufnahme]