sonido reproducir musica archivos archivo agregar abrir java audio wav javasound

reproducir - Convierta la transmisión de audio a una matriz de bytes WAV en Java sin archivo temporal



musica mp3 en java netbeans (5)

Dado un InputStream llamado in que contiene datos de audio en un formato comprimido (como MP3 u OGG), deseo crear una matriz de byte contenga una conversión WAV de los datos de entrada. Desafortunadamente, si intentas hacer esto, JavaSound te entrega el siguiente error:

java.io.IOException: stream length not specified

Me las arreglé para que funcione al escribir el wav en un archivo temporal y luego volver a leerlo, como se muestra a continuación:

AudioInputStream source = AudioSystem.getAudioInputStream(new BufferedInputStream(in, 1024)); AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source); AudioInputStream ulaw = AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, pcm); File tempFile = File.createTempFile("wav", "tmp"); AudioSystem.write(ulaw, AudioFileFormat.Type.WAVE, tempFile); // The fileToByteArray() method reads the file // into a byte array; omitted for brevity byte[] bytes = fileToByteArray(tempFile); tempFile.delete(); return bytes;

Esto es obviamente menos deseable. ¿Hay una mejor manera?


Esto es muy simple...

File f = new File(exportFileName+".tmp"); File f2 = new File(exportFileName); long l = f.length(); FileInputStream fi = new FileInputStream(f); AudioInputStream ai = new AudioInputStream(fi,mainFormat,l/4); AudioSystem.write(ai, Type.WAVE, f2); fi.close(); f.delete();

El archivo .tmp es un archivo de audio RAW, el resultado es un archivo WAV con encabezado.


El problema es que la mayoría de los AudioFileWriters necesitan saber el tamaño del archivo por adelantado si escriben en un OutputStream. Como no puedes proporcionar esto, siempre falla. Desafortunadamente, la implementación API de sonido Java predeterminada no tiene ninguna alternativa.

Pero puede intentar usar la arquitectura AudioOutputStream desde los complementos de Tritonus (Tritonus es una implementación de código abierto de la API de sonido de Java): http://tritonus.org/plugins.html


Demasiado tarde, lo sé, pero me necesitaban esto, así que este es mi granito de arena sobre el tema.

public void UploadFiles(String fileName, byte[] bFile) { String uploadedFileLocation = "c://"; AudioInputStream source; AudioInputStream pcm; InputStream b_in = new ByteArrayInputStream(bFile); source = AudioSystem.getAudioInputStream(new BufferedInputStream(b_in)); pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source); File newFile = new File(uploadedFileLocation + fileName); AudioSystem.write(pcm, Type.WAVE, newFile); source.close(); pcm.close(); }


El problema es fácil de resolver si prepara la clase que creará el encabezado correcto para usted. En mi ejemplo, el ejemplo de cómo leer la entrada de audio en los datos del buffer wav va en algún buffer, después de eso creo el encabezado y tengo el archivo wav en el buffer. No es necesario en bibliotecas adicionales. Solo copie el código de mi ejemplo.

Ejemplo de cómo usar la clase que crea el encabezado correcto en la matriz de almacenamiento intermedio:

public void run() { try { writer = new NewWaveWriter(44100); byte[]buffer = new byte[256]; int res = 0; while((res = m_audioInputStream.read(buffer)) > 0) { writer.write(buffer, 0, res); } } catch (IOException e) { System.out.println("Error: " + e.getMessage()); } } public byte[]getResult() throws IOException { return writer.getByteBuffer(); }

Y clase NewWaveWriter que puedes encontrar debajo de mi enlace.


Noté que este fue preguntado hace mucho tiempo. En caso de que una persona nueva (utilizando Java 7 y superior) encuentre este hilo, tenga en cuenta que hay una mejor manera de hacerlo a través de la API Files.readAllBytes. Ver: ¿Cómo convertir un archivo .wav a una matriz de bytes?