Android AudioTrack reproduciendo el archivo .wav, obteniendo solo ruido blanco

Cuando juego un archivo con el siguiente código:

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. Comprobé que mi archivo .wav tiene las mismas propiedades (frecuencia de muestreo, velocidad de bits). No tengo mucho conocimiento acerca de los datos de audio en bruto (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 solo importarlos al AudioTrack. Los archivos Wav tienen un encabezado pequeño como se puede ver aquí https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ Así que debe omitir el encabezado y apuntar su descriptor de archivo al lugar correcto donde se encuentran los datos de audio reales. son.

Además, cuando reproduces un archivo de audio y trabajas con operaciones de bytes, debes ocuparte de Endianess. Mire aquí Usando AudioTrack en Android para reproducir un archivo WAV

Debajo de mi código (faltan algunas comprobaciones y el salto de encabezado WAV) que funciona tanto en Nexus One como en Galaxy S con un archivo wav con encoding de frecuencia 8000Hz y 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 se ve MUCHO MÁS complicado que lo que hice. Toqué 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 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 quiere reproducirlo usando 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);