2009-06-02 28 views
14

Estoy trabajando en una aplicación que debe procesar archivos de audio. Cuando uso archivos mp3, no estoy seguro de cómo manejar los datos (los datos que me interesan son los bytes de audio, los que representan lo que escuchamos).¿Cómo obtener datos de audio de un MP3?

Si uso un archivo wav, sé que tengo un encabezado de 44 bytes y luego los datos. Cuando se trata de un mp3, he leído que están compuestos por cuadros, cada cuadro contiene un encabezado y datos de audio. ¿Es posible obtener todos los datos de audio de un archivo mp3?

Estoy usando Java (he agregado MP3SPI, Jlayer y Tritonus) y puedo obtener los bytes del archivo, pero no estoy seguro de qué representan estos bytes o cómo manejarlos. .

Respuesta

26

Desde el documentation for MP3SPI:

File file = new File(filename); 
AudioInputStream in= AudioSystem.getAudioInputStream(file); 
AudioInputStream din = null; 
AudioFormat baseFormat = in.getFormat(); 
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
              baseFormat.getSampleRate(), 
              16, 
              baseFormat.getChannels(), 
              baseFormat.getChannels() * 2, 
              baseFormat.getSampleRate(), 
              false); 
din = AudioSystem.getAudioInputStream(decodedFormat, in); 

A continuación, acaba de leer los datos de din - será los datos "en bruto", como por decodedFormat. (Véase la docs for AudioFormat para obtener más información.)

(Tenga en cuenta que este código de ejemplo no cierra la corriente ni nada de eso -. El uso apropiado try/finally bloques de forma normal)

+0

Hola Jon, Gracias por su respuesta rápida! en su propuesta; ¿'decodedFormat' es una representación de los datos mp3 decodificados en otro formato? si escribo "din.read()", ¿obtengo los bytes de datos en el formato descodificado? Gracias – dedalo

+0

Sí. Ese formato decodificado dice "Quiero que decodifiques como datos PCM firmados". –

+0

Hola. Seguí su consejo y funcionó. Para visualizar los datos que uso: while ((numBytesRead = din.read (audioBytes))! = -1) {} Esto lee los bytes en 'din' y los almacena en la matriz audioBytes. He intentado visualizar los datos usando: while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Bytes Valor decodificado" + audioBytes [0]);} Tengo una pregunta acerca de estos datos: Cada muestra usa 16 bits, eso es 2 posiciones en la matriz audioBytes, rigth? ¿Cómo podría obtener el valor de cada muestra? ¿El formato decodificado (wav) tiene los 44 bytes de encabezado? ¡Muchísimas gracias por tu ayuda! – dedalo

0

Los datos que se quiere son las muestras reales, mientras que MP3 representa los datos de manera diferente. Entonces, como todo lo demás ha dicho, necesita una biblioteca para decodificar los datos de MP3 en muestras reales para su propósito.

0

Como se menciona en las otras respuestas, necesita un decodificador para decodificar MP3 en muestras de audio normales.

Una opción popular sería JavaLayer (LGPL).

Cuestiones relacionadas