2013-08-28 3 views
6

Questo è qualcosa che ho cercato di fare per un po ', ed è più di una domanda aperta. Se qualcuno ha qualche conoscenza che può aiutarmi a far luce su questo, sarebbe molto apprezzato.Mp3 parsing in Python

Voglio decodificare il flusso audio in un mp3 e usarlo per guidare l'animazione, tutto usando python. A quanto ho capito, i dati audio in un mp3 sono memorizzati in frame di 32 subbands di frequenza (o bin di frequenza), che è l'ideale per me - se potessi prendere un mp3 ed estrarre un'ampiezza per ogni sottobanda su ciascun frame, sarebbe sii perfetto per quello che voglio fare.

Ho trovato la soluzione qui https://bitbucket.org/portalfire/pymp3 dove tutta l'elaborazione sembra essere eseguita in python. È piuttosto lento, ma anche se potessi usarlo per estrarre ciò che voglio, sarebbe bello - io sto faticando a capire cosa sta succedendo in quel codice però. Avevo anche una soluzione in cui mi sono convertito in wav e poi ho usato fft per estrarre le frequenze dal wav. Questo è stato molto rumoroso e sembra un modo stupido di farlo in quanto i dati che voglio vengono memorizzati direttamente nell' mp3 - la conversione in un'onda sonora sembra non necessaria. Questo era in realtà più veloce del primo però. Ecco cosa ho finito con:

http://www.youtube.com/watch?v=f_0FORxlK4A

Beh, se qualcuno ha qualche consiglio, o l'esperienza che vogliono condividere, o le idee per le librerie che dovrei guardare, mi piacerebbe davvero sentire.

Grazie!

Henry

+1

Si consiglia di passare attraverso http://wiki.python.org/moin/PythonInMusic una volta per verificare un enorme set di librerie disponibili là fuori –

+0

Ci sono un certo numero di librerie MP3 e chiedere consigli su quale usare è esattamente il tipo di cosa che un forum di domande e risposte come SO è cattivo da gestire. – abarnert

+2

Un consiglio che posso dare: se sai come usare cython, ctypes, o qualsiasi altro meccanismo simile, vale la pena guardare le librerie C come mpg123 che non hanno alcun collegamento Python e che racchiudono solo i bit di cui hai bisogno . Hai molte più opzioni in questo modo. – abarnert

risposta

1

Date un'occhiata a:

http://lightshowpi.org/

fiutare il codice sorgente e vedere come hanno fatto.

Hanno anche usato FFT sull'uscita wave ma in tempo reale, e non è così lento come si considera che funzioni bene su Raspberry Pi.

Potrebbero invece passare alla trasformazione coseno in quanto è più veloce, e questo è ciò che si farebbe se si controllassero direttamente i frame MP3, poiché l'MP3 è codificato in cosine transform.

Quindi, per prima cosa devi sapere quale bin assomiglia a quali frequenze nel mondo reale.

Su pypi.python.org ci sono collegamenti AV o ffmpeg diretti che consentono di decodificare fotogramma per fotogramma, ma non so se è possibile estrarre freq da oggetti che rappresentano fotogrammi o si dovrà prima convertire in anche crudo.

Se fossi in te, userei il puro codice Python MP3 che hai trovato per estrarre solo ciò di cui ho bisogno, ottimizzandolo nel processo. Usando cython se necessario.

Ma questo approccio limita solo l'MP3. Lightshow Pi funziona su quasi tutti i tipi compressi.