Domanda

Mi piacerebbe scrivere una semplice applicazione CLI linux che può prendere 2 sorgenti video (1 di un parlante presentatore e 1 con le loro diapositive e senza audio) e unirle.

Mi piacerebbe l'intero video in uscita di essere i due video originali, fianco a fianco. In mancanza di ciò, la mia seconda opzione migliore sarebbe un "picture in picture" il video stile, con il presentatore in una piccola cornice in un angolo.

Da una ricerca poche ore, GStreamer sembra che potrebbe essere in grado di fare questo. Qualcuno può confermare prima di spendere più tempo a cercare fuori?

Se non è possibile, ci sono altre API là fuori che potrei essere in grado di utilizzare?

È stato utile?

Soluzione 2

Si scopre GStreamer possibile unire due video, mettendoli fianco a fianco in un'uscita video utilizzando il filtro videomixer.

Una pipeline di base che prende due file di input, li scalabile per essere la stessa dimensione, quindi li unisce e li codifica in un video Theora potrebbe essere simile a questo:

filesrc -> decodebin -> ffmpegcolourspace -> videoscale ->  videobox -> videorate
                                                                                  \
filesrc -> decodebin ->  ffmpegcolourspace  ->  videoscale  ->  videorate   ->    videomixer -> ffmpegcolourspace -> theoraenc -> oggmux -> filesink

Come si implementa questa conduttura dipende dalla lingua. Ho realizzato il prototipo con le associazioni di Ruby, e funziona molto bene.

Altri suggerimenti

Ecco un semplice setup (di lavoro) usando GST-lancio (installare i gstreamer-tools pacchetto su Ubuntu / Debian):

GST-lancio dispositivo v4l2src = / dev / video1! videoscale! ffmpegcolorspace! video / x-raw-YUV, width = 640, height = 480! Videobox border-alfa = 0 = sinistra -640! Nome videomixer = mescolare! ffmpegcolorspace! xvimagesink v4l2src! videoscale! ffmpegcolorspace! video / x-raw-YUV, width = 640, height = 480! Videobox destra = -640! mescolare.

Questa legge sostanzialmente due video che utilizzano il video 4 Linux 2, uno dal dispositivo predefinito e un altro flusso da / dev / video1. Si potrebbe desiderare di cambiare la situazione se la vostra installazione è diversa.

La prima parte (non in grassetto) è responsabile per la lettura del video dal dispositivo di cattura, negoziare una dimensione e spazio colore (! Ffmpegcolorspace videoscale), forzando uno specifico formato video (video / x-raw-YUV, larghezza = 640 altezza = 480), l'aggiunta di 640 pixel trasparenti a fianco (così da spostare l'immagine a destra) e creando un videomixer con il nome "mix". Infine, l'auto-negozia di nuovo lo spazio colore e visualizza il risultato utilizzando una finestra XVideo.

La seconda parte (in grassetto) legge il secondo flusso video (dal dispositivo di acquisizione predefinita, aggiungere device = / dev / videoX per scegliere un dispositivo diverso), poi fa lo stesso spazio colore, dimensioni la negoziazione e la selezione del formato video come per il primo flusso, poi sposta il video 640 pixel a sinistra e alimenta il risultato al elemento denominato mix (il nostro video mixer). è necessario il punto alla fine e istruisce GStreamer per la ricerca di un elemento esistente denominato "mix" invece di cercare un filtro.

Si potrebbe sostituire v4l2src device = / dev / video1 con posizione filesrc = video.avi! decodebin per ottenere l'input da un file video.

Sostituire xvimagesink con jpegenc! AVIMux! posizione filesink = out.avi per scrivere il risultato in un file video.

AviSynth viene in mente. Ho usato molti anni fa sotto Windows ed è abbastanza bravo a arbitraria di post-elaborazione. AviSynth v3 dovrebbe girare nativamente sotto Linux, ma è ancora lontano dall'essere pronto. Ci sono strumenti per eseguire la versione precedente con Wine, però.

MEncoder può farlo in modo nativo su Linux. È possibile sborsare il loro codice, o invocare il binario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top