Scrivo questo post per due motivi: prima di tutto per lamentarmi, che è lunedì ed è attività che mi riesce bene. L’altro motivo è per scrivere da qualche parte le frustrazioni incontrate nel tentare di fare manipolazioni e presdigitazioni su dei video usando soltanto strumenti open source (il problema non è l’open source, come vedremo).

Il problema: prendere una parte di un video pubblicato via RTMP (streaming vero, da piattaforma proprietario Adobe) e piazzare sopra lo spezzone un logo in sovraimpressione.

Semplice no?

Dettaglio tecnico: i video in questione sono codificati in H.264/MP3. Il container è l’f4v (ma questo, fortunatamente, conta poco o nulla).

L’operazione è da compiere server side per cui tutto attraverso command line e scripting (no GUI).

Che strumenti ci sono a disposizione per fare un lavoretto del genere? Ovviamente rtmpdump, ffmpeg e/o mencoder.

Spezzando diligentemente il problema principale in problemi più piccoli, il primo era: scaricarsi dallo streaming uno spezzone di un video. Il tool (unico, non ci sono alternative al momento) è appunto rtmpdump. Appena lo provo rimango subito molto contento del fatto che rtmpdump scaricasse non in “tempo reale” secondo gli FPS del filmato, ma mooolto più velocemente, praticamente in download. Peccato però che il tool non permettesse di specificare un tempo di partenza e uno di fine dello scaricamento. O tutto o niente. Un altro problema di rtmpdump è che il container del filmato scaricato è FLV, senza possibilità di intervenire su questa opzione.

Riprendendo in mano le mie conoscenze arrugginitissime di C++, modifico il programma in modo da poter specificare un offset di partenza e un tempo massimo di scaricamento. Tutto OK, senonché il filmato finale riporterà comunque la durata complessiva del filmato originale.

Mentre lavoro su questo problemino, il giorno stesso Adobe fa chiudere il sito di rtmpdump per contravvenzione al DMCA (nota che Adobe dichiarava simpaticamente di voler aprire il protocollo). Per adesso, dunque, sospendo la questione rtmpdump.

Mi trovo dunque tra le mani un video H.264/MP3. Problema successivo: stamparci sopra un logo per tutta la durata dello stesso.

L’unico modo per farlo (talvolta è bello sapere di aver un’unica possibilità, talvolta meno), è usare l’opzione “vhook” di ffmpeg. In pratica è possibile eseguire del codice – una sorta di sistema a plugin – durante la codifica del video. Uno di questi plguin si chiama, pensa un po’, “watermark” e fa esattamente quello che mi serve.

Però. Però si dà il fatto che questo sistema di “plugin” sia stato misconosciuto dagli sviluppatori di ffmpeg (“fa cagare”) e per questo prima deprecato (nella versione 0.5) e poi direttamente tolto (versione SVN attuale)… il sistema sarà sostituito (notare il tempo al futuro) da un framework molto più elegante chiamato libavfilter.

La versione che arriva con la mia Ubuntu è la 0.5 (meno male!) ma è compilata con il simpatico –disable-vhook (merda!). Ergo, se voglio usare -vhook devo ricompilarmi ffmpeg, ma la versione 0.5, non la versione SVN. Nota a latere: se chiedi supporto agli sviluppatori (mailing list o canale IRC), questi vogliono che tu faccia i test solo con la versione SVN… che non supporta vhook… OK, capito?

Faccio le mie prove e sembra andare tutto bene… il logo in sovraimpressione fa la sua sporca figura ma… ma l’audio è desincronizzato! Dopo qualche secondo, l’audio rallenta e dopo un po’ le immagini sembrano quelle di un filmato di Enrico Ghezzi.

Il problema sembra essere il decoder MP3 usato da ffmpeg, al quale non piace troppo l’Mp3 della traccia audio del filmato. Probabilmente è colpa del coder usato, ma alla fine sembra che devo trovare un’altra soluzione. Qualcuno attento potrebbe obiettare “Ma perché per un H264 viene usata una traccia audio Mp3 e non AAC?”. Osservazione più che corretta. Il problema è che questi video sono prodotti in codifica “real time” da alcune squadre di produzione. Il software utilizzato per questa codifica è Adobe Live Encoder il quale, “bontà sua”, non supporta out-of-the-box AAC. Occorre acquistare un plugin che costa circa 250€ (ogni commento è superfluo). Per questo motivo il cliente ha preferito per adesso usare Mp3 con l’encoder marcio di Adobe.

Quanti decoder Mp3 ci sono Open Source? Due. Uno è libavcodec, fornito ed usato da ffmpeg e l’altro è libmad. È possibile usare libmad con ffmpeg? No.

A questo punto occorre tirare fuori dal cassetto degli attrezzi mencoder, che invece può usare come decoder libmad, e provare. (qualcuno sa come e se si può usare libmp3lame per decodificare gli mp3 di ffmpeg?)

Incredibilmente, funziona. Mencoder + libmad riesce a ricodificare il video tenendo sincronizzato audio e video.

L’idea dunque sarebbe: passo lo spezzone originale da mencoder per crearne una versione digeribile da ffmpeg, usando come video codec “copy”, in modo da non dover ricodificare il video perdendo di qualità. Poi il video viene passato a ffmpeg per il watermarking del logo.

Già. Peccato che il video prodotto da mencoder con questa procedura sia “sminchiato”, come dicono a Milano… pieno di artefatti e con grossi problemi nelle immagini in movimento (bpyramid? bframes? Boh…).

E così continuo le mie prove, sinceramente frustrato e con poche speranze…

Print