Utilizzo di trim
e concat
- file di origine con codec diversi
Per questo, assicurati che i tuoi singoli file abbiano la stessa risoluzione e idealmente lo stesso framerate e il sottocampionamento cromatico ecc. Ciò eviterà errori o glitch durante la concatenazione.
Puoi fare tutto in una volta senza dividere il file, usando i filtri trim
e concat
:
ffmpeg -i edv_g24.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[v0][v1][v2]concat=n=3:v=1:a=0[out]" \
-map "[out]" output.mp4
Qui, trim
viene utilizzato per specificare le singole parti dei flussi video di input ( 0:v
, 1:v
) che in seguito si desidera concatenare. Queste parti sono nominate v0
attraverso v2
. (Il setpts
filtro reimposta i timestamp di queste singole parti su 0, necessario per la concatenazione). Successivamente, concateniamo le tre parti.
Se si desidera tagliare da un determinato timestamp fino alla fine, utilizzare trim=start=15
invece di specificare l'intervallo.
Se i tuoi file hanno audio, devi tagliare quei flussi separatamente:
ffmpeg -i edv_g24_2.mp4 -i short-video.mp4 -filter_complex "\
[0:v]trim=0:10,setpts=PTS-STARTPTS[v0]; \
[0:a]atrim=0:10,asetpts=PTS-STARTPTS[a0]; \
[1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; \
[1:a]atrim=0:5,asetpts=PTS-STARTPTS[v1]; \
[0:v]trim=15:30,setpts=PTS-STARTPTS[v2]; \
[0:a]atrim=15:30,asetpts=PTS-STARTPTS[a2]; \
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mp4
In questo caso, il video e l'audio verranno ricodificati: assicurarsi di specificare gli obiettivi di qualità di output appropriati (ad esempio -crf
per x264, x265 o libvpx-vp9). Puoi leggere di più su questo nel Wiki di FFmpeg, ad esempio per VP9 o H.264 .
Utilizzo di singoli segmenti
Se si desidera dividere i clip e successivamente rimontarli:
ffmpeg -i edv_g24.mp4 -ss 0 -to 10 -c copy part1.mp4
ffmpeg -i edv_g24.mp4 -ss 10 -to 15 -c copy part2.mp4
ffmpeg -i edv_g24.mp4 -ss 15 -c copy part3.mp4
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][1:v][2:v]concat=n=3:v=1:a=0[outv]" \
-map "[outv]" -t 30 output.mp4
Se i file hanno audio, usa lo stesso approccio di cui sopra:
ffmpeg -i part1.mp4 -i short-video.mp4 -i part3.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" -t 30 output.mp4
Ciò ricodificherà nuovamente il flusso video. È un po 'più semplice ma altrimenti dovrebbe essere equivalente al metodo sopra.
Utilizzando concat
demuxer
In linea di principio puoi anche provare a concatenare i flussi di bit senza ricodificarli, usando il demuxer concat. Crea un file chiamato concat.txt
e aggiungi le seguenti voci (corrispondenti ai video clip creati sopra):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
Quindi concatenare questi singoli file:
ffmpeg -f concat -i concat.txt -c copy output.avi
Ciò richiede tuttavia che le tue clip abbiano lo stesso codec, risoluzione, framerate ecc., Quindi non funzionano con tutti i tipi di fonti eterogenee.
Utilizzando il concat
protocollo
Il suddetto tipo di concatenazione a livello di file può essere ottenuto anche utilizzando il concat
protocollo, con lo stesso tipo di vincoli di cui sopra (stesso codec, risoluzione, ecc.):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
Per maggiori informazioni sulla concatenazione, leggi la rispettiva pagina Wiki di FFmpeg .