FFMPEG overlay filter parzialmente conversion


0

Sto cercando di applicare il filtro di sovrapposizione sul video per unire una singola immagine per alcuni secondi. Dal momento che la durata del mio video è di circa 1 min, sembra inutile quando FFMPEG tenta di ricodificare nuovamente l'intero video invece di ricodificare la parte del video che deve essere modificata.

Il mio comando video blend è:

ffmpeg -i beach.mp4 -i logo.png 
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" 
-pix_fmt yuv420p -c:a copy output.mp4

Qualcuno sa come posso evitarlo? (Stavo pensando di dividere il video, ma sembra che il video non possa essere diviso accuratamente specificando l'inizio e il fotogramma finale)


Puoi codificare il segmento da 20 secondi con la sovrapposizione come un file separato, quindi tagliare i primi ~ 20 secondi dall'originale con -c copy. Quindi utilizzare il concat demuxer unirmi a loro. Si noti che i due segmenti risultanti da unire devono corrispondere ai parametri (codec, base dei tempi, ecc.) E sarà necessario tagliare su un fotogramma chiave per ottenere i migliori risultati. Un sacco di lavoro per un video di un minuto. La mia pigrizia mi direbbe semplicemente ricodificare tutto o semplicemente non occuparmi della sovrapposizione. Se stai usando un player basato sul web puoi farlo aggiungere il logo.
llogan

@LordNeckbeard Grazie, ma questa operazione verrà eseguita molte volte, non solo una volta. Ecco perché ho bisogno di prestazioni.
dajuric

Ho pensato che fosse una possibilità, ma non l'hai menzionato nella domanda. Dovresti mostrare l'output completo della console dal tuo comando.
llogan

@LordNeckbeard Ci scusiamo per non averlo menzionato. Questa era l'uscita completa; Non ho scritto nient'altro, ho bloccato il primo passo.
dajuric

L'overlay deve accadere esattamente per 20 secondi?
Gyan

Risposte:


2

Dato che stai bene con qualche imprecisione, ti suggerisco il seguente metodo:

Segmenta l'input video

ffmpeg -i beach.mp4 -c copy -segment_time 20 -f segment beach_seg%02d.mp4

Sovrapposizione logo sul primo segmento

ffmpeg -i beach_seg00.mp4 -loop 1 -i logo.png 
-filter_complex "[0:v][1:v] overlay=25:25:shortest=1" 
-pix_fmt yuv420p -c:a copy overlay.mp4

Segmenti concatenati

Per prima cosa, prepara un file di testo segments.txt

file 'overlay.mp4'
file 'beach_seg01.mp4'
file 'beach_seg02.mp4'
file 'beach_seg03.mp4'
...

Quindi, concat

ffmpeg -f concat -i segments.txt -c copy beach_with_logo.mp4

L'avvertimento qui è che la base temporale di overlay.mp4 potrebbe non corrispondere a quella dei segmenti della spiaggia. In tal caso, controlla la base dei tempi di uno dei segmenti della spiaggia (il tbn ) e aggiungi -video_track_timescale <tbn> al comando di sovrapposizione.


Grazie mille (Mulvya e LordNeckbeard)! Puoi semplicemente spiegarmi se taglio un video in tre parti e ho bisogno di elaborare il pezzo medio con un software, e quel software richiede l'offset del fotogramma, come dovrei ottenere l'offset del fotogramma? (Ho usato force_keyframes per impostare i fotogrammi chiave e poi ho eseguito il taglio - è OK?)
dajuric
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.