2012-05-09 10 views
5

Intenté crear un búfer de audio y enviarlo a una nueva clase. En esta clase jugaría este búfer con AudioTracker pero no funciona. Puedo escuchar el sonido a tiempo, pero el sonido es como un efecto de halle. No tengo Idear por mi error y no encontré una respuesta para este problema. Espero que me puedas ayudar. (Lo siento mi Inglés no es el mejor) Sorcecode:¿Cómo puedo transferir el búfer de audio para reproducirlo directamente?

public class input { 
private static final String TAG = "Aufnahme"; 
private AudioRecord recorder = null; 
private boolean isRecording = false; 
private int SAMPLERATE = 8000; 
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS, 
     AUDIO_FORMAT); 
private Thread recordingThread = null; 

public void startRecording() { 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE, 
      CHANNELS, AUDIO_FORMAT, bufferSize); 

    recorder.startRecording(); 
    isRecording = true; 

    recordingThread = new Thread(new Runnable() 

    { 
     public void run() { 
      writeAudioData(); 
     } 

    }); 
    recordingThread.start(); 

} 

public void stopRecording() { 
    isRecording = false; 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    recordingThread = null; 
} 

private void writeAudioData() { 

    byte data[] = new byte[bufferSize]; 

    while (isRecording) { 

     recorder.read(data, 0, bufferSize); 
     send(data); 

    } 
} 

private void send(byte[] data) { 

    int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 

    at.play(); 
    at.write(data, 0, bufferSize); 
    at.stop(); 
    at.release(); 

} 

Respuesta

4

Ok, me di cuenta del problema. El efecto Hall provino del sonido del altavoz que se grabó en tiempo real. Mal error.

+4

¡Felicitaciones por la solución! Cuando pueda, asegúrese de marcar su respuesta como 'aceptada' para que otros puedan aprender de su solución. Saludos ~ –

+0

Jugué con el bufferSize y minbufferSize y pude obtener una reproducción fiel de los datos de audio. Arreglé el búfer de entrada a 8192 y la salida a 1024. Puede ajustarse más, pero sirve para mi propósito. Gracias por el código original. Funciona según lo deseado. – axs

0

El motivo cuando escribe datos en el objeto AudioTrack, en realidad lo abre, escribe en el búfer, lo cierra y lo suelta, y si el tamaño mínimo del búfer es tan pequeño, no puede oír debido a la reiniciación constante del Pista de audio. Es por eso que se soluciona cambiando el tamaño del búfer. Si lo hace 8000 y su frecuencia de muestreo es 8000, escuchará el sonido con un segundo de retraso. Para resolver esto, deshágase de su método de envío y cambie el método writeAudio a este:

private void writeAudioData() { byte data [] = new byte [bufferSize];

int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 


    at.play(); 

    while (isRecording) { 
     recorder.read(data, 0, bufferSize); 
     at.write(data, 0, bufferSize); 
    } 
    at.stop(); 
    at.release(); 
Cuestiones relacionadas