2011-02-15 11 views
5

mi proyecto requiere que pueda grabar audio en un dispositivo Android. Implementé una solución usando MediaRecorder() pero el audio grabado tiene una calidad terrible. ¿Qué estoy haciendo mal? debo pensar que esta no puede ser la única forma de grabar audio :) quizás estoy haciendo algo mal, estoy incluyendo mi código a continuación. por favor, apúntame en la dirección correcta.calidad de audio muy baja grabada en mi droidx usando MediaRecorder, ¿por qué?

gracias!

MediaRecorder recorder = new MediaRecorder(); 
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp"); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setOutputFile(outputFile.getAbsolutePath()); 
recorder.prepare(); 
recorder.start(); 
// stop 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

Respuesta

7

AMR_NB apesta.

Establecer la tasa de bits a 16 y frecuencia de muestreo para 44100.

3GPP apesta generalmente, intente utilizar AAC/MPEG_4 su lugar.

Pruebe esto y actualícenos.

+0

gracias, eso funcionó :) también usé la respuesta de typo.pl a continuación, pero no puedo marcarlos como respuestas, ¿alguien puede ayudar? –

+0

No estoy seguro de cómo ayudar con eso, pero puedo decirle que ALGUNOS dispositivos, no podrá obtener sonido de mayor calidad, aparentemente es una limitación de chips. Parece que solo hay algunos dispositivos como ese, en su mayoría de 1.5/1.6. – keltor

0

Sin escuchar el audio, no puedo decir mucho.

Hay métodos en el objeto MediaRecord puede alterar - Android MediaRecorder object

void  setAudioEncoder(int audio_encoder) 
    Sets the audio encoder to be used for recording. 
void  setAudioEncodingBitRate(int bitRate) 
    Sets the audio encoding bit rate for recording. 
void  setAudioSamplingRate(int samplingRate) 
    Sets the audio sampling rate for recording. 

intente cambiar estos y ver si alguno de los cambios ayuda con la calidad de audio.

+0

¿Has probado alguno de ellos por tu cuenta? – CopsOnRoad

8

probar este código:

MediaRecorder recorder = new MediaRecorder(); 
File outputFile = new File(Environment.getExternalStorageDirectory(), "audio.3gp"); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
recorder.setAudioEncodingBitRate(16); 
recorder.setAudioSamplingRate(44100); 
recorder.setOutputFile(outputFile.getAbsolutePath()); 
recorder.prepare(); 
recorder.start(); 

Usted va a conseguir una cierta mejora, pero no esperes demasiado. Siempre se puede tratar de salvar sin compresión utilizando la clase RehearsalAudioRecord de este proyecto OpenSource

http://rehearsalassist.svn.sourceforge.net/viewvc/rehearsalassist/android/releases/RehearsalAssistant_0_8_2/src/urbanstew/RehearsalAssistant/

La forma de implementar la clase en su proyecto es muy simple. Sólo tiene que reemplazar su MediaRecorder por:

RehearsalAudioRecorder recorder = new RehearsalAudioRecorder(RehearsalAudioRecorder.RECORDING_UNCOMPRESSED, MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT); 
recorder.setOutputFile(outputFile.getAbsolutePath()); 
recorder.prepare(); 
recorder.start(); 

Usted será capaz de grabar archivos WAVE que son bastante grandes, pero si necesita calidad es el único camino a seguir. Tenga en cuenta que en dispositivos más antiguos este código podría

+0

Usted estaba escribiendo algo. 'Tenga en cuenta que en dispositivos más antiguos este código podría ...' – CopsOnRoad

4

El gran problema que tenía en la calidad de grabación de audio era que configuraba la velocidad demasiado baja en 16. 16 es un valor que generalmente corresponde a la profundidad de bits, no a la velocidad de bits . La tasa de bits normalmente se muestra como kbps, pero MediaRecorder.setAudioEncodingBitRate() toma bps (no tenga en cuenta "k"). Prueba esto:

MediaRecorder recorder = new MediaRecorder(); 

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(...); 
recorder.setAudioEncoder(...); 

final int bitDepth = 16; 
final int sampleRate = 44100; 
final int bitRate = sampleRate * bitDepth; 

recorder.setAudioEncodingBitRate(bitRate); 
recorder.setAudioSamplingRate(sampleRate); 

recorder.setOutputFile(...); 

recorder.prepare(); 
recorder.start(); 
// stop 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

Usted tendrá que comprobar supported media formats de averiguar los emparejamientos correctos de formato (codificador de audio), el recipiente (formato de salida), tasa (por lo general dada en kHz, pero pasó a MediaRecorder.setSamplingRate muestreo () como solo Hz), y velocidad de bits (generalmente dada en kbps). Tenga en cuenta que no todos los formatos en la documentación tienen tasas de bits especificadas; usar el método en el código anterior debería dar una idea aproximada de la velocidad de bits adecuada en ese caso.

Gracias a @StarPinkER, @PrvN, @arlomedia en este SO answer por ayudarme a aclarar esto.

+0

Funcionó para mí, mientras que la respuesta anterior y aceptada (simplemente establecer la velocidad de bits en 16 sin multiplicar) no funciona. Todavía tiene muchos más ups, ¿puede que esto esté relacionado con el teléfono? Estoy usando un Samsung S7. –

+0

@RobinBetka 16 bps es ridículamente bajo hasta el punto de que no tendría sentido. Como el valor de 16 arrojó un audio discernible incluso en mis propias pruebas, supongo que la mayoría de las bibliotecas tienen algún tipo de límite inferior razonable en la tasa de bits que se pasa al códec. Según el dispositivo y el códec, puedo ver fácilmente que estos límites inferiores son diferentes. Por lo tanto, en algunos dispositivos, la calidad de audio puede ser mayor cuando la velocidad de bits se especifica como 16 en un formato diferente porque el límite inferior en el nuevo formato es más alto que la velocidad de bits predeterminada del formato original. Solo una suposición. – nyttimangus

+0

Ohhh sí, esto es correcto. – Relm

Cuestiones relacionadas