2012-12-27 10 views
5

Possiedo un server Python Tornado che accetta un file mp3 bitrate variabile un chunk alla volta (i blocchi sono costituiti da un numero fisso di frame).Python decodifica MP3 in blocchi su Mac OS

Tutto quello che sto facendo è passare quel binario in avanti, tuttavia, voglio sapere la durata del blocco. Poiché è un bitrate variabile, non posso fare un semplice calcolo. Stavo cercando su pymedia ma sviluppo su mac OS e sembra che pymedia non possa installarsi lì (inoltre, non è stato aggiornato dal 2006). Ho anche provato pymad ma non ho potuto installarlo (non è stato aggiornato dal 2007), sembra comunque più centrato sui file.

Idealmente, mi piacerebbe estrarre il bitrate da ogni blocco nel modo in cui lo fa mutagen per esempio. Tuttavia, mutagen richiede un file come input mentre desidero inserire un frame mp3 o una serie di tali frame.

def _on_read_frames(self, data): 
    logging.info('read from input:\n%s', data) 
    binary_audio = base64.b64decode(data) 
    # need to find out how many miliseconds went by here 

UPDATE: Questo fa parte di un vicino streaming in tempo reale l'architettura in modo che il formato mp3 è codificato in piccoli pezzi, così la mia soluzione attuale è quella di utilizzare bit rate costante che permette semplice calcolo, mi sono reso conto che non c'è quasi nessun vantaggio nell'utilizzare il bit rate variabile qui.

+1

Dubito che troverete qualcosa che funziona già per il vostro caso. La fonte mutagena per la gestione di MP3 non sembra essere così grande forse implementare qualcosa da te in base ad esso? – entropy

+1

Dopo aver realizzato che per lo streaming di blocchi audio in tempo reale, il bitrate variabile non offre alcun vantaggio. In effetti, fornisce uno svantaggio. Capisco ora perché nessuno ha creato strumenti per questo, non è davvero utile! Potrei comunque creare un tale strumento, perché anche con un bitrate costante può essere utile misurare il bitrate su qualsiasi fotogramma audio. – JonathanC

risposta

1

Ci sono 1.152 campioni per fotogramma, quindi se il vostro chunk è un numero fisso di N frame, allora il vostro chunk è una lunghezza fissa di N*1152 campioni. Per trasformarlo in millesecondi, dovrai trovare la frequenza di campionamento dall'intestazione del frame.

Hai solo bisogno di un parser MP3. Ecco il codice sorgente per un decodificatore completo: https://bitbucket.org/portalfire/pymp3 incluso il codice di analisi dell'intestazione del frame, che è davvero tutto ciò che serve.

Qui è più la documentazione sul formato: http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header