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.
- PCM -> AAC (Encoder) -> PCM (Decodificador) en tiempo real con optimización correcta
- ¿Cómo puedo obtener datos de frecuencia de PCM usando FFT
- ¿Valores de amplitud de audio PCM?
- Manera correcta de convertir datos de onda PCM de 16 bits a flotar
- Dificultad para portar el código de salida de PCM sin procesar de Java a Android AudioTrack API
- Descodificación de archivos de audio y re-codificación al formato PCM deseado: 44,100 kHz, 2 canales, 16 bits
- Conversión de archivos MIDI a audio sin procesar utilizando un sintetizador de software
- ¿Cómo obtener la frecuencia del resultado fft?
- AudioTrack - matriz corta a la distorsión de la matriz del byte usando jlayer (decodificador del java mp3)
- ¿Cómo se puede conectar un efecto de reverberación a los datos de AudioRecord / PCM y guardarlo en un archivo?
- Convertir PCM-16 a AMR usando AmrInputStream
- Mensaje de notificación de AudioTrack corriente
- JTransforms FFT en Android de datos de PCM
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);
- Ejecutar Android App Error (FATAL EXCEPTION: principal Proceso: PID: 14099)
- Android: elimina sólo el efecto FadingEdge inferior de la barra de desplazamiento