Utilizar AudioTrack en Android para reproducir un archivo WAV

Estoy trabajando con Android, intentando que mi aplicación AudioTrack reproduzca un archivo .wav de Windows (Tada.wav). Francamente, no debería ser tan difícil, pero estoy escuchando un montón de cosas extrañas. El archivo se guarda en la mini tarjeta SD de mi teléfono y la lectura del contenido no parece ser un problema, pero cuando reproduzco el archivo (con los parámetros sólo estoy PRETTY SURE son correctos), tengo unos segundos de ruido blanco Antes de que el sonido parezca resolverse en algo que apenas puede ser derecho.

He grabado con éxito y reproducido mi propia voz de nuevo en el teléfono – He creado un archivo. Pcm de acuerdo a las instrucciones en este ejemplo:

Http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(Sin la máscara hacia atrás) …

¿Alguien tiene algunas sugerencias o conocimiento de un ejemplo en la web para reproducir un archivo .wav en un Android ??

Gracias, R.

Me tropecé con la respuesta (francamente, al intentar & ^ @! No pensé que funcionaría), en caso de que nadie está interesado … En mi código original (que se deriva del ejemplo en el enlace en el mensaje original) Los datos se leen del archivo de la siguiente manera:

InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readShort(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

En esta versión, la música [] es un array de SHORTS. Por lo tanto, el método readShort () parecería tener sentido aquí, ya que los datos son de 16 bits PCM … Sin embargo, en el Android que parece ser el problema. Cambié ese código a lo siguiente:

  music=new byte[(int) file.length()];//size & length of the file InputStream is = new FileInputStream (file); BufferedInputStream bis = new BufferedInputStream (is, 8000); DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file int i = 0; // Read the file into the "music" array while (dis.available() > 0) { music[i] = dis.readByte(); // This assignment does not reverse the order i++; } dis.close(); // Close the input stream 

En esta versión, la música [] es una matriz de BYTES. Todavía estoy diciendo a AudioTrack que es de 16 bits de datos PCM, y mi Android no parece tener un problema con la escritura de una matriz de bytes en un AudioTrack así configurado … De todos modos, finalmente suena bien, por lo que si alguien Sino que quiere jugar los sonidos de Windows en su Android, por alguna razón, esa es la solución. Ah, Endianness …

R.

¿Está saltando los primeros 44 bytes del archivo antes de volcar el resto de los datos del archivo en el búfer? Los primeros 44 bytes son el encabezado WAVE y suenan como ruido aleatorio si intenta reproducirlos.

Además, ¿está seguro de que está creando la AudioTrack con las mismas propiedades que la WAVE que está intentando reproducir (frecuencia de muestreo, velocidad de bits, número de canales, etc.)? Windows realmente hace un buen trabajo de dar esta información a usted en la página Propiedades del archivo: texto alternativo

He encontrado muchas respuestas largas a esta pregunta. Mi solución final, que dado que todo el corte y pegado es apenas el mío, se reduce a:

 public boolean play() { int i = 0; byte[] music = null; InputStream is = mContext.getResources().openRawResource(R.raw.noise); at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize, AudioTrack.MODE_STREAM); try{ music = new byte[512]; at.play(); while((i = is.read(music)) != -1) at.write(music, 0, i); } catch (IOException e) { e.printStackTrace(); } at.stop(); at.release(); return STOPPED; } 

STOPPED es sólo una "true" devuelta como una señal para restablecer el botón de pausa / reproducción. Y en el inicializador de clase:

 public Mp3Track(Context context) { mContext = context; minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); } 

El contexto es simplemente "esto" de la actividad que llama. Usted puede utilizar un FileInputStream en el sdcard, el etc. Mis archivos están en res / raw

Como dijo Aaron C , usted tiene que saltar inicial 44 bytes o (como prefiero) leer los primeros 44 bytes que son el encabezado WAVE. De esta manera usted sabe cuántos canales, bits por muestra, longitud, etc … la WAVE contiene.

Aquí puede encontrar una buena implementación de un analizador de encabezado WAVE.

Por favor, no perpetúen el código de parsing terrible. El análisis de WAV es trivial para implementar http://soundfile.sapp.org/doc/WaveFormat/ y se agradecerá al ser capaz de analizar cosas como la frecuencia de muestreo, la profundidad de bits y el número de canales.

También x86 y ARM (por lo menos por defecto) son poco endian, así que los archivos WAV nativo-endian deben estar bien sin ninguna barajadura.

  • Cómo agregar efecto de eco a archivo wav en android?
  • Cómo convertir el archivo WAV / OGG a archivo FLAC en Android?
  • Reproducción de archivos .wav cortos - Android
  • Cómo codificar un WAV a un mp3 en un dispositivo Android
  • MediaPlayer onCompletion no se llama con precisión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.