Android AudioTrack que juega el archivo .wav, consiguiendo solamente el ruido blanco

Cuando reproduzco un archivo con el código siguiente:

private void PlayAudioFileViaAudioTrack(int ResId) throws IOException { int intSize = android.media.AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); int count = 256 * 1024; // 256 kb byte[] byteData = null; byteData = new byte[(int) count]; InputStream in = null; AssetFileDescriptor fd = null; fd = mResources.openRawResourceFd(ResId); in = mResources.openRawResource(ResId); int bytesRead = 0, amount = 0; int size = (int) fd.getLength(); at.play(); while (bytesRead < size) { amount = in.read(byteData, 0, count); if (amount != -1) { at.write(byteData, 0, amount); } } in.close(); at.stop(); at.release(); } 

Lo único que escucho es ruido estático y blanco. He comprobado que mi archivo .wav tiene las mismas propiedades (samplerate, bitrate). No tengo mucho conocimiento sobre los datos de audio sin procesar (PCM), así que me preguntaba si alguien podría ver lo que está mal con mi código.

Desde su código puedo ver que acaba de leer los datos del archivo wav y sólo importarlos a la AudioTrack. Los archivos Wav tienen un pequeño encabezado como se puede ver aquí https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ Así que tienes que saltar el encabezado y apuntar el descriptor de archivo en el lugar correcto donde los datos de audio reales son.

También cuando se reproduce un archivo de audio y se trata de operaciones de byte debe tener cuidado de la Endianess. Echa un vistazo aquí Uso de AudioTrack en Android para reproducir un archivo WAV

Debajo de mi código (algunas comprobaciones y el salto de encabezado WAV faltan) que funciona en Nexus One y Galaxy S con un archivo wav con frecuencia de 8000Hz y codificación de 16 bits.

 public void playWav(){ int minBufferSize = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); int bufferSize = 512; AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); String filepath = Environment.getExternalStorageDirectory().getAbsolutePath(); int i = 0; byte[] s = new byte[bufferSize]; try { FileInputStream fin = new FileInputStream(filepath + "/REFERENCE.wav"); DataInputStream dis = new DataInputStream(fin); at.play(); while((i = dis.read(s, 0, bufferSize)) > -1){ at.write(s, 0, i); } at.stop(); at.release(); dis.close(); fin.close(); } catch (FileNotFoundException e) { // TODO e.printStackTrace(); } catch (IOException e) { // TODO e.printStackTrace(); } } 

Eso parece más complicado de lo que hice. Jugué sonidos usando esto. Creo que los archivos .wav funcionarían igual de bien.

 MediaPlayer mpPlayProgram = new MediaPlayer(); mpPlayProgram.setDataSource("/sdcard/file.mp3"); mpPlayProgram.prepare(); mpPlayProgram.start(); mpPlayProgram.release(); 

Para los recursos estáticos, es aún más fácil:

 MediaPlayer mpStart = MediaPlayer.create(this, resID); mpStart.start(); mpStart.release(); 

Si ha guardado el archivo en formato wav y desea reproducirlo utilizando AudioTrack, siga este código:

  File file=new File(Environment.getExternalStorageDirectory()+"/AudioRecorder/fahim.wav"); InputStream is; DataInputStream dis = null ; BufferedInputStream bis; try { is = new FileInputStream(file); bis = new BufferedInputStream(is, 8000); dis = new DataInputStream(bis); // Create a DataInputStream to read the audio data from the saved file } catch (FileNotFoundException e1) { ShowToast("fILE NOT FOUND:"+e1.getMessage()); } int i = 0; // Read the file into the "music" array music=new byte[(int) file.length()]; try { while (dis.available() > 0) { music[i] = dis.readByte(); // This assignment does not reverse the order i++; } } catch (IOException e) { ShowToast("I/O Exception:"+e.getMessage()); } try {dis.close();} catch (IOException e) {e.printStackTrace();} int minBufferSize = AudioTrack.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); at.play(); ShowToast("size:"+music.length); //*/ at.write(music, 0, music.length); 
  • Codificar wav a AAC en Android
  • ¿Puedo obtener datos crudos de cpm de MediaPlayer o SoundPool?
  • PCM de Android a Ulaw que codifica el archivo wav
  • Escritura de datos grabados PCM en un archivo .wav (java android)
  • Conversión de PCM a AAC mediante mediacodec
  • Emitir codificación y decodificación de una grabación de audio al formato G711 (PCMU - uLaw)
  • Android MediaPlayer hace que el juego se congele con "AudioHardware pcm la reproducción se va a esperar"
  • Android AudioRecord y AudioTrack codec opciones?
  • Creación de un archivo WAV a partir de datos PCM sin procesar utilizando el SDK de Android
  • Cómo convertir archivos .pcm a .wav o .mp3?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.