2009-06-02 19 views
14

Sto lavorando a un'applicazione che deve elaborare i file audio. Quando utilizzo i file mp3 non sono sicuro di come gestire i dati (i dati a cui sono interessato sono i byte audio, quelli che rappresentano ciò che ascoltiamo).Come ottenere dati audio da un MP3?

Se sto utilizzando un file wav, so di avere un'intestazione di 44 byte e quindi i dati. Quando si tratta di un mp3, ho letto che sono composti da frame, ogni frame contenente un'intestazione e dati audio. È possibile ottenere tutti i dati audio da un file mp3?

Sto usando java (ho aggiunto MP3SPI, Jlayer e Tritonus) e sono in grado di ottenere i byte dal file, ma non sono sicuro di ciò che questi byte rappresentano o come gestire quindi .

risposta

26

Dal 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); 

È poi basta leggere i dati da din - saranno i dati "grezzi" come da decodedFormat. (Vedere la docs for AudioFormat per ulteriori informazioni.)

(Si noti che questo codice di esempio non chiude il flusso o qualcosa di simile -. L'uso di adeguati blocchi try/finally come normale)

+0

Ciao Jon, Grazie per la tua risposta rapida! Nella tua proposta; è 'decodedFormat' una rappresentazione dei dati mp3 decodificati in altri formati? se scrivo "din.read()", ottengo i byte di dati nel formato decodificato? Grazie – dedalo

+0

Sì. Quella decodificaFormato dice "Voglio che decodifichi come dati PCM firmati". –

+0

Ciao. Ho seguito il tuo consiglio e ha funzionato. Per visualizzare i dati che utilizzo: while ((numBytesRead = din.read (audioBytes))! = -1) {} Questo legge i byte in "din" e li memorizza nell'array audioBytes. Ho provato a visualizzare i dati utilizzando: while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Valore decodificato byte" + audioBytes [0]);} Ho una domanda su questi dati: Ogni campione usa 16 bit, cioè 2 posizioni nell'array AudioByte, rigth? Come posso ottenere il valore di ogni campione? Il formato decodificato (wav) ha i 44 byte di intestazione? Grazie mille per il tuo aiuto! – dedalo

0

I dati che si desidera sono i campioni reali, mentre MP3 rappresenta i dati in modo diverso. Quindi, come quello che hanno detto tutti gli altri - hai bisogno di una libreria per decodificare i dati MP3 in campioni reali per il tuo scopo.

0

Come menzionato nelle altre risposte, è necessario un decodificatore per decodificare MP3 in campioni audio regolari.

Un'opzione popolare sarebbe JavaLayer (LGPL).

Problemi correlati