2012-02-06 13 views
12

Sto provando a sovrapporre a livello di programmazione le immagini o un video nella parte superiore di un altro video utilizzando FFmpeg. Sembra che AVFilter possa farlo.FFmpeg AVFilter overlay/filigrana al livello di programmazione

Ci sono molti esempi di come fare questo o cose simili con la riga di comando, tuttavia, non ho trovato esempi di utilizzo di AVFilter a livello di codice oltre a doc/examples/filtering.c che mi aiuta ma non abbastanza. Posso già decodificare e codificare un video, ho solo bisogno di imparare come filtrare i frame decodificati e aggiungere una filigrana.

Esistono esempi di utilizzo di libavfilter a livello di codice?

Esistono esempi di utilizzo dei filtri di sovrapposizione o di film?

+0

L'esempio di codice può essere facilmente modificato per applicare un filtro arbitrario. Qual è il problema? Per esempi sull'uso dei filtri di sovrapposizione e film, vedere [Come filigranare un video usando FFmpeg] (http://www.idude.net/index.php/how-to-watermark-a-video-using-ffmpeg). –

+1

Il problema con l'esempio è che è sovraccarico (2 filtri, grafico del filtro, ecc.). Per qualcuno che è nuovo e vuole scoprire come applicare un AVFilter è confuso, perché non chiarisce ciò che è assolutamente necessario per iniziare. –

risposta

7

Il comando:

ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv 

produce il video con l'immagine "watermarklogo.png" in alto a sinistra. Chiamare questo comando da un altro programma dovrebbe essere abbastanza semplice.

Rompere questo giù poco a poco per capirlo:

ffmpeg è il programma che verrà usato per aggiungere la filigrana.

-i viene utilizzato per specificare i file di input.

inputvideo.avi è il file di input specificato da -i.

-vf viene utilizzato per specificare il filtro video. In questo caso, questo è tutto tra virgolette.

movie=watermarklogo.png caricherà il file che si desidera utilizzare come filigrana. Qui cariciamo il file come sorgente video (utilizzando movie) indipendentemente dal fatto che il file sia o meno un video. In questo caso è un'immagine.

[watermark] etichetta il file appena caricato. Questa etichetta verrà utilizzata nel resto del codice.

[in] e [out] fare riferimento al flusso di input e al flusso di output del video.

overlay viene utilizzato subito dopo l'etichetta [watermark] in modo che si riferisca ad esso. In questo semplice caso, inseriamo lo overlay allo 10:10. Ciò significa che la filigrana sarà sfalsata di 10 pixel dall'alto e da sinistra. Se si desiderava in basso a destra, utilizzare overlay=main_w-overlay_w-10:main_h-overlay_h-10 dove main_w corrisponde alla larghezza del flusso di input, overlay_h corrisponde all'altezza del file di sovrapposizione e così via.

Infine, outputvideo.flv è chiaramente il file in cui si desidera salvare i risultati.

Ulteriori informazioni:

ho trovato queste informazioni tramite the site Dmitry had mentioned nei commenti. Alex ha detto che questa pagina potrebbe essere troppo complessa per qualcuno che è nuovo a queste cose.Tuttavia, non ho mai fatto nulla del genere e nel giro di un paio di minuti ho avuto i risultati che ritengo siano stati cercati.

Nota: ho avuto un momento di difficoltà quando mi è stato sempre l'errore:

error while opening encoder for output stream #0.1 

Se avete lo stesso problema probabilmente necessario impostare manualmente la frequenza di campionamento utilizzando il parametro -ar (ad es -ar 22050).

+0

Puoi definire i tempi per la filigrana? diciamo che voglio che la filigrana inizi alle 00:00 e scompaia all'01: 00, è possibile? – rroche

+0

@rroche Controlla [questo post] (http://stackoverflow.com/questions/9160771/ffmpeg-watermark-first-30-second). La risposta di Felix è probabilmente la più semplice, ma la risposta di Dmitry (lo stesso Dmitry di sopra) è un po 'più ordinata e consente una dissolvenza della filigrana. – golmschenk

+4

La domanda si riferisce all'uso della libreria AVFilter, non alla chiamata al binario FFMPEG. – Erik

Problemi correlati