studio reproductor para musica mediaplayer fuente fondo ejemplo codigo android wav audio-streaming

mediaplayer - reproductor de musica para android codigo fuente



Usando AudioTrack en Android para reproducir un archivo WAV (6)

¿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 sonarían como ruido aleatorio si intentas reproducirlos.

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

Estoy trabajando con Android, tratando de hacer que mi aplicación AudioTrack reproduzca un archivo .wav de Windows (Tada.wav). Francamente, no debería ser tan difícil, pero escucho muchas cosas extrañas. El archivo se guarda en la tarjeta mini SD de mi teléfono y la lectura del contenido no parece ser un problema, pero cuando reproduzco el archivo (con los parámetros, solo estoy PRETTY SURE), obtengo unos segundos de ruido blanco antes de que el sonido parece resolverse en algo que puede ser correcto.

He grabado y reproducido exitosamente mi propia voz en el teléfono. Creé un archivo .pcm de acuerdo con las instrucciones de este ejemplo:

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

(sin el enmascaramiento al revés) ...

¿Alguien recibió alguna sugerencia o conocimiento de un ejemplo en la web para reproducir un archivo .wav en un Android?

Gracias r.


Como dijo , debe omitir los 44 bytes iniciales o (como prefiero) leer los primeros 44 bytes que son el encabezado WAVE. De esta manera, sabrá cuántos canales, bits por muestra, longitud, etc. contiene el WAVE.

Here puede encontrar una buena implementación de un analizador / escritor de encabezado WAVE.


Ejemplo de archivo wav:
http://www.mauvecloud.net/sounds/pcm1644m.wav

Código de muestra:

public class AudioTrackPlayer { Context mContext; int minBufferSize; AudioTrack at; boolean STOPPED; public AudioTrackPlayer(Context context) { Log.d("------","init"); mContext = context; minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); } public boolean play() { Log.d("------","play"); int i = 0; byte[] music = null; InputStream is = mContext.getResources().openRawResource(R.raw.pcm1644m); 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; }

}


He encontrado muchas respuestas largas a esta pregunta. Mi solución final, que dado todo el corte y pegado no es mía, 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; }

DETENIDO es solo un "verdadero" enviado como 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 de llamada. Puede usar FileInputStream en la sdcard, etc. Mis archivos están en res / raw


Me encontré con la respuesta (francamente, al intentar & ^ @! No pensé que funcionaría), en caso de que alguien esté interesado ... En mi código original (que se deriva del ejemplo en el enlace en la publicación original), Los datos se leen del archivo así:

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 matriz de SHORTS. Entonces, el método readShort () parece tener sentido aquí, ya que los datos son PCM de 16 bits ... Sin embargo, en el Android ese 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. Sigo diciéndole a AudioTrack que se trata de datos PCM de 16 bits, y parece que mi Android no tiene problemas para escribir una serie de bytes en un AudioTrack configurado así ... De todos modos, finalmente suena bien, así que si alguien de lo contrario, quiere reproducir sonidos de Windows en su Android, por alguna razón, esa es la solución. Ah, endianidad ......

R.


Por favor, no perpetúe el código de análisis terrible. El análisis de WAV es trivial para implementar http://soundfile.sapp.org/doc/WaveFormat/ y te agradecerás al poder analizar cosas como la frecuencia de muestreo, la profundidad de bits y la cantidad de canales.

Además, x86 y ARM (al menos de forma predeterminada) son little endian, por lo que los archivos WAV de endian nativos deberían estar bien sin ningún tipo de mezcla.