2009-05-17 15 views
5

Sto lavorando su un server di streaming che sarà in grado di trasmettere annunci mirati. In pratica, gli ascoltatori ascoltano la stessa musica, ma ogni 30 minuti arriva un blocco di annunci e ogni ascoltatore ha il proprio blocco. L'implementazione di tale server di streaming pone vari problemi e questa domanda riguarda uno di questi.Come concatenare perfettamente stream MP3?

Il server funzionerà in modo simile a Icecast, cioè leggerà il flusso sulla rete da un generatore di flusso e lo inoltrerà a tutti gli ascoltatori. Quando è il momento di trasmettere annunci, il server interrompe il recupero del flusso dal generatore, legge gli annunci dai file e li inserisce nel buffer di ciascun listener, li trasmette e riprende sul flusso di inoltro dal generatore.

Quando il server passa dallo streaming di inoltro agli annunci di trasmissione, deve concatenare due stream MP3 (che trasmettiamo in MP3). La mia preoccupazione è che semplicemente aggiungendo un pezzo di dati dopo l'altro si possano produrre alcuni artefatti udibili. Può essere fatto senza problemi?

Ho già capito: - Posso rendere il server consapevole dei frame MP3 per evitare errori di sincronizzazione. - Sto pensando di aggiungere fotogrammi MP3 dal file dell'annuncio dopo i frame MP3 dallo streaming. - Poiché l'annuncio viene caricato da un file MP3 correttamente codificato, eludere il problema del serbatoio di byte, poiché il primo fotogramma del file non può utilizzarlo.

Ma la mia preoccupazione è il modo in cui funziona MDCT. Gli ascoltatori non hanno idea di cosa farà il mio server, quindi i loro decodificatori MP3 potrebbero produrre alcuni artefatti perché i dati MDCT errati verranno inseriti uno dopo l'altro nello stream che scaricano. Il riempimento dello zero all'inizio del file con l'annuncio compenserà questo?

Conoscete eventuali librerie/strumenti (open source se possibile) che possono unire senza difficoltà due file MP3 senza decomprimerli?

È possibile indicare le buone risorse che descrivono il formato MP3? Ho cercato molto Internet, ho trovato molte informazioni, ma mi manca ancora il quadro generale.

Forse sai che sarebbe più semplice se usassi un altro codec come OGG/Vorbis, AAC?

PS. Questa domanda non è un duplicato di What is the best way to merge mp3 files?. mp3wrap e strumenti simili non sono un'opzione per me.

risposta

0

Se sei su Windows, l'API Microsoft DirectShow potrebbe essere la soluzione giusta. Dovresti scoprire che è capace di fare cose con audio e video sia staticamente che in streaming, in una varietà di formati (hai solo bisogno dei codec necessari e l'interfaccia è praticamente la stessa per tutti).

In questo modo, DirectShow è sfortunatamente progettato in modo orribilmente intricato e ha una curva di apprendimento ripida, ma la potenza che offre in modo impareggiabile se si sta per eseguire la manipolazione audio/video su Windows. Ci sono comunque un gran numero di esempi e tutorial su come usarlo, quindi alla fine potrebbe non essere così doloroso. Inoltre, se si utilizza .NET Framework, esiste una versione gestita dal nome di DirectShow.NET. Non sarà un compito facile qualunque cosa tu faccia, a meno che non ci sia qualcosa là fuori di quanto non ne sia a conoscenza. Buona fortuna comunque!

+0

Tale API potrebbe essere troppo computazionalmente costosa. La stazione radio in cui lavoro ha già 5k utenti/traffico di picco del server. Anche se è solo un secondo della musica che devo elaborare per ogni ascoltatore, è un'ora di musica da decomprimere/comprimere in pochissimo tempo ... – Jasiu

+0

Non sono sicuro che sarebbe necessariamente ... dovresti davvero fare qualche altro studio su questo, dato che DirectShow è * il * modo di andare per i contenuti multimediali su Windows. – Noldorin

2

Credo che gli MP3 possano essere uniti semplicemente concatenando i file. In alcuni test rapidi (cat file1.mp3 file2.mp3 > merged.mp3; mplayer merged.mp3) sembra funzionare come previsto. Lo streaming da un server Web probabilmente funzionerà altrettanto bene.

Come gestire il passaggio del file di input corrente? Puoi semplicemente considerare gli annunci come brevi brani da riprodurre.

+0

Sì, è così che mi piacerebbe andare, ma sei sicuro che funzioni e non ci sono circostanze in cui verrà prodotto un errore udibile? – Jasiu

+1

La maggior parte di questo non funzionerà ... ci sono più formati mp3 ... È possibile avere un bit rate costante mp3 impostato con alcune dimensioni di frame costanti (così tanti bit per campione) o un tasso variabile di bit mp3 che fluttua. .. non sono compatibili Anche la semplice concatenazione avrebbe messo l'intestazione e i tag id3 nel mezzo del file, quindi i file multimediali avrebbero problemi a riprodurre il file. Se si desidera eseguire questa operazione nel modo corretto, sarà necessario utilizzare un software che esegue questa operazione oppure convertire entrambi i file di controllo in un unico formato e quindi concatenare i flussi audio e salvare in un nuovo file. – uzbones

+0

Diciamo che non ho tag ID3 e utilizzo il bitrate costante. – Jasiu

0

mi sono avvicinato un problema molto simile, e dopo aver chiesto le domande giuste alle varie fonti si avvicinò con la seguente ...

qualsiasi decoder degno salterà dati "cattivi" fino a quando non colpisce un colpo di testa frame valido. Questo è ciò su cui ID3v2 si basa per iniettare informazioni aggiuntive nei dati mp3. Al server, andrei con l'analisi dei file MP3 sorgente per servire solo frame MP3 validi. Se servi alcuni frame silenziosi (circa 7 dovrebbero farlo), il decodificatore dovrebbe avere il tempo di stabilirsi prima di salire per il prossimo carico di dati MP3 (non associati), evitando gli artefatti che (correttamente) assumono quando concatenano frame da codifica differente sessioni.

Più problematica è la possibile commutazione di attributi MP3 (1/2 canali, frequenza di campionamento in uscita, ecc.) Tra un fotogramma al successivo. Alcuni decodificatori si arrabbiano molto di fronte a un tale flusso, con conseguente riproduzione a velocità 1/2 e simili. Quindi, è necessario assicurarsi che tutto il materiale di origine sia codificato con gli stessi attributi di output altrimenti si potrebbe sbloccarsi.

Potreste aver visto questo già, ma se non:

http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=79&printer=t

0

non vedo perché si vorrebbe per concatenare i file. Perché non usi una sorta di sistema di playlist e semplicemente cambi il tuo file. Penserei che ciò consentirebbe maggiore flessibilità a lungo termine e non si finirebbe con file MP3 di grandi dimensioni.

+0

Non sono sicuro di aver capito cosa stai dicendo, ma non riesco a capire come la tua idea consente annunci mirati. La mia radio utilizza il protocollo SHOUTcast/Icy, ci sono vari giocatori, quindi non posso fare nulla dal lato client. Sto parlando di file, perché non importa per il gusto di questa domanda, ma in realtà userò gli stream MP3 generati al volo. – Jasiu

+0

Sarebbe tutto sul lato server ... Fondamentalmente il server considererebbe gli annunci come canzoni, tranne che si alternerebbero tra canzoni e annunci. Suppongo che tu non concateni tutte le canzoni insieme quando le metti nello stream ... – uzbones

2

Si dovrebbe essere in grado di concatenare file mp3 di entrambi i formati CBR e VBR. I file MP3 non hanno un'intestazione principale (ignorando ID3 e Xing). I dati audio vengono memorizzati come blocchi in cui ogni blocco include la propria intestazione. L'intestazione contiene le informazioni necessarie (bitrate, frequenza di campionamento, stereo, ecc.) Per la decodifica dei dati audio in quel blocco.

Questo è uno dei motivi per cui è difficile determinare la durata di un file mp3.

Un altro modo di vedere le cose, se si concatenare un file MP3 CBR con un file VBR, il risultato finale è lo stesso di un file lungo VBR con la prima sezione di audio ad un bitrate costante.

Il problema è che alcuni lettori MP3 possono essere rigidi e si aspettano un header Xing per un file VBR MP3. Questo tuttavia non è mai stato specificato per il formato MP3, ma ora si presume che sia vero.