FFmpeg: è possibile applicare il filtro solo a una parte di un file video durante la transcodifica


8

Ho una breve clip di 3:00 min che viene capovolta da sinistra a destra per circa: 30 secondi al centro.

Quindi, se il tutto fosse capovolto da sinistra a destra, vorrei solo applicare:

ffmpeg -i 3min.mp4 -vf hflip flipped_3min.mp4

Ma dato che è solo parzialmente capovolto, c'è un modo, in un singolo comando ffmpeg, di applicare un segmento temporale per quel filtro hflip (1: 30-2: 00)?

Sto cercando un po 'di documentazione su questo e non riesco a trovare nulla del genere, mi chiedo se non sia possibile o meno in FFmpeg.

Risposte:


12

Come capovolgere solo una sottosezione di un video usando ffmpeg?

Ecco, -filter_complexè tuo amico, in quanto può creare catene di input filtrati. hflipUtilizzeremo ancora il filtro menzionato nella domanda nel filtro.

È possibile applicare una sottosezione in questo modo:

ffmpeg -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];\
[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];\
[b]hflip[c];\
[a][c]concat[d];\
[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];\
[d][e]concat[out1]" -map [out1] flip.mp4

Una riga per una facile copia + incolla:

ffmpeg  -i input.mp4 -filter_complex "[0:v]trim=start=0:duration=90[a];[0:v]trim=start=90:duration=30,setpts=PTS-STARTPTS[b];[b]hflip[c];[a][c]concat[d];[0:v]trim=start=120:duration=60,setpts=PTS-STARTPTS[e];[d][e]concat[out1]" -map [out1] flip.mp4

Spiegazione:

Usare un filtrografo è un po 'come creare una catena di azioni, e c'è una bella spiegazione visiva 1 di questo nella sezione "Introduzione ai filtri" della documentazione sui filtri. I filtri funzionano con gli input - questo è il bit che vedi prima del filtro, ad esempio [0:v](video del primo flusso di input) o [a](un output creato chiamato a) - e output . Vale a dire, un input o input vengono trasformati in base a filtere quindi output come output o output .

Abbiamo un semplice insieme di azioni qui, e se le esaminiamo in sequenza possiamo creare un filtro per gli ingressi e le uscite.

segmenti

Crea 3 segmenti di video (dall'ingresso [0:v]) usando trim:

  • Primo segmento (90 secondi), non fare nulla (output as [a])
  • Secondo segmento (30 secondi) hflipe setptsper evitare problemi di durata (output trim as [b]e passarlo hflipa output as [c])

Questi due vengono quindi concatmessi insieme per rendere l'uscita [a]+[c] -> [d](durata: 120 s)

  • Terzo segmento (60 secondi), impostare nuovamente PTS (output as [e])

Unisci i segmenti per creare l'output [d] + [e] -> [out1]e -mapquello per l'output finale nel file.

Questo ti dà un video della stessa durata dell'originale (180 s), ma con una sezione di 30 secondi al centro che viene capovolta orizzontalmente 2 .


1 :

Rappresentazione visiva dalla ffmpegdocumentazione dei filtri

In libavfilter, un filtro può avere più ingressi e più uscite. Per illustrare il genere di cose che sono possibili, consideriamo il seguente filtro grafico.

                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+

Questo filtro grafico divide il flusso di input in due flussi, quindi invia un flusso attraverso il filtro di ritaglio e il filtro vflip, prima di fonderlo nuovamente con l'altro flusso sovrapponendolo in alto.


2 Testato usandoffmpeg version N-72939-g5b0f55a


7

In questo esempio, l'inversione orizzontale si verifica tra 2-3 secondi.
In questo esempio, l'inversione orizzontale si verifica tra 2-3 secondi.

Alcuni filtri hanno il supporto della sequenza temporale tramite l' opzione di abilitazione .

Puoi vedere un elenco di filtri e se hanno il supporto per la sequenza temporale con ffmpeg -filters. Un " T" che precede il nome del filtro indica che supporta la modifica della sequenza temporale. Se il filtro desiderato non ha il supporto per la sequenza temporale, aggiorna il tuo ffmpegcome i filtri a volte vengono aggiornati per supportare questo. Altrimenti, utilizzare i filtri di trim come spiegato nell'altra risposta.

ffmpeg esempio:

ffmpeg -i input -vf "hflip=enable='between(t,90,120)'" -c:a copy output

ffplay esempio:

ffplay -vf "hflip=enable='between(t,90,120)'" input
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.