Come concatenare le clip dallo stesso video con ffmpeg


15

Ho un lungo video con diverse scene. Voglio estrarre e concatenare 2 scene dal video (che non iniziano su un I-frame) usando ffmpeg 2.1.4.

Ad esempio, supponiamo che io voglia 5 secondi dall'01: 00 e dalle 02:00.

Posso farlo:

ffmpeg -ss 01:00 -i in.mkv -ss 02:00 -i in.mkv -filter_complex "
  [0:v]select='lt(t,5)'[v0];
  [0:a]aselect='lt(t,5)'[a0];
  [v0][a0][1:v][1:a]concat=n=2:v=1:a=1
" -c:a libvorbis -t 10 out.mkv

Questo mi dà il film che voglio, ma selezionare effettivamente forza ffmpeg a decodificare l'intero resto del film. Quindi, come faccio a dirlo per troncare il primo film invece di decodificarlo?

Preferirei farlo con un filtro complesso ffmpeg, se possibile. So che posso solo usare -tper ricodificare prima i film separati, ma il passaggio di codifica aggiuntivo è molto lento nel mio caso e perde anche una buona quantità di qualità per questo video.

Non riesco a trovare un filtro che tronchi la lunghezza di un vapore. Esistono nodi filtro che corrispondono ai parametri -to -ss?

Risposte:


16

filtro concat

Questo metodo è ottimale se è necessario eseguire ulteriori filtri:

Utilizzare i trim, atrim, setpts, asetpts, e concatfiltri:

ffmpeg -i input -filter_complex \
"[0:v]trim=60:65,setpts=PTS-STARTPTS[v0]; \
 [0:a]atrim=60:65,asetpts=PTS-STARTPTS[a0]; \
 [0:v]trim=120:125,setpts=PTS-STARTPTS[v1];
 [0:a]atrim=120:125,asetpts=PTS-STARTPTS[a1]; \
 [v0][a0][v1][a1]concat=n=2:v=1:a=1[out]" \
-map "[out]" output.mkv
  • setptse asetptsimpedirà un risultato a scatti a causa di problemi di timestamp di presentazione.

  • Assicurati di utilizzare una versione recente. Vedi la pagina di download di FFmpeg per i collegamenti alle build per Windows, OS X e Linux.


concat demuxer

Un altro metodo è quello di creare i segmenti singolarmente e copiarli in streaming anziché ricodificarli (per risparmiare tempo e qualità) e unirli con il demuxer concat .

$ ffmpeg -ss 60 -i input -t 5 -codec copy clip1.mkv
$ ffmpeg -ss 120 -i input -t 5 -codec copy clip2.mkv
$ echo "file 'clip1.mkv'" > concat.txt
$ echo "file 'clip2.mkv'" >> concat.txt
$ ffmpeg -f concat -i concat.txt -codec copy output.mkv

2
Ah grazie. il trim è quello che mi mancava. Tuttavia, ci vuole molto tempo per arrivare all'offset temporale che specifico, come se decodificasse tutto. Inoltre, parte dell'output mancava l'audio. Per risolvere, ho specificato lo stesso input più volte con -ss, quindi ho usato il trim per troncare il video. In questo caso non hai bisogno di impostazioni, poiché ss imposta pts su 0. Sembrava funzionare e non aveva strane pause casuali durante la codifica. Per quanto riguarda la copia di stream, l'ho provato prima. Inizia con il precedente I-frame, quindi ottieni una parte diversa del film rispetto a quella che volevi.
affondò il

La prego di rispondere alla mia domanda, è simile a questa. video.stackexchange.com/questions/18247/…
Eftekhari

È interessante notare che -filter_complexfunziona ma i concatfile non lo fanno - vale a dire che il primo video sembra a posto ma la qualità del secondo è orribile. Nota, ho copiato questi comandi esattamente per entrambi (ad eccezione del file di input).
Bobmarksie,

7

Questo dovrebbe funzionare più velocemente ...

ffmpeg -ss 1:00 -t 5 -i in.mkv -ss 2:00 -t 5 -i in.mkv \
  -filter_complex "[0][1]concat=n=2:v=1:a=1" \ 
  out.mkv

Non è necessario specificare -t sull'output. Non è necessario suddividere l'audio e il video prima del concat.


1
Questo utilizza il filtro concat che richiederà la ricodifica. Questo può o meno essere desiderato dall'utente.
Llogan,
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.