¿Cómo puedo transferir el búfer de audio para reproducirlo directamente

Intenté crear un buffer de audio y enviarlo a una nueva clase. En esta clase, jugaría este buffer con AudioTracker pero no funciona. Puedo oír el sonido a tiempo, pero el sonido es como un efecto paralelo. No tengo Idear por mi error y no encontré una respuesta para este problema. Espero que puedas ayudarme. (Lo siento, mi inglés no es el mejor) Código de sorpresa:

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

Ok, me di cuenta del problema. El efecto de sala provenía del sonido del altavoz que se grabó en tiempo real. Mal error.

La razón cuando escribes datos en el objeto AudioTrack , realmente lo abre, escribe en buffer, lo cierra y lo libera, y si el tamaño mínimo del búfer es tan pequeño, en realidad no se puede oír debido a la reinytilización constante del AudioTrack. Esta es la razón por la que se resuelve cambiando el tamaño del búfer. Si lo hace 8000 y su frecuencia de muestreo es 8000, oirá 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 esto:

Private void writeAudioData () {byte data [] = nuevo 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(); 
  • ¿Por qué es imposible utilizar el grabador de voz en el emulador de Android?
  • Cómo grabar voz en formato "wav" en Android
  • ¿Cómo grabar audio solo si está por encima de cierto nivel de sonido?
  • Android: prueba si Audio-Record-Focus está disponible?
  • ¿Cómo desactiva AGC en el HTC EVO (Supersonic)?
  • Grabar / capturar la reproducción interna de sonido de la aplicación de Android y exportar mp3?
  • Grabar un archivo wav desde el micrófono en Android - problemas
  • Entrada de audio a través de la toma de auriculares en Android?
  • Android, filtros de audio
  • Talking App como hablar, la grabación de audio no funcionó en todos los dispositivos
  • Android: Grabación de audio con visualización de nivel de voz
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.