Używanie trim
i concat
- plików źródłowych z różnymi kodekami
W tym celu należy upewnić się, że poszczególne pliki mają tę samą rozdzielczość, a najlepiej takie same próbkowanie klatek i chroma itp. Zapobiegnie to błędom lub usterkom podczas konkatenacji.
Możesz zrobić wszystko za jednym razem, bez dzielenia pliku, używając filtrów trim
i 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
Tutaj trim
służy do określania poszczególnych części wejściowych strumieni wideo ( 0:v
, 1:v
), które później chcesz połączyć. Te części są nazwane v0
poprzez v2
. ( setpts
Filtr resetuje znaczniki czasu tych poszczególnych części na 0, co jest wymagane do konkatenacji). Później łączymy trzy części.
Jeśli chcesz przyciąć od określonego znacznika czasu do końca, użyj trim=start=15
zamiast określać zakres.
Jeśli Twoje pliki zawierają dźwięk, musisz przyciąć te strumienie osobno:
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
Pamiętaj, że w tym przypadku wideo i audio zostaną ponownie zakodowane - upewnij się, że określono odpowiednie docelowe parametry wyjściowej jakości (np. -crf
Dla x264, x265 lub libvpx-vp9). Możesz przeczytać więcej na ten temat na Wiki FFmpeg, np. Dla VP9 lub H.264 .
Korzystanie z poszczególnych segmentów
Jeśli chcesz podzielić klipy, a następnie ponownie je złożyć:
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
Jeśli pliki zawierają dźwięk, zastosuj to samo podejście jak powyżej:
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
Spowoduje to ponowne kodowanie strumienia wideo. Jest to nieco prostsze, ale poza tym powinno być równoważne powyższej metodzie.
Korzystanie z concat
demuxera
Zasadniczo możesz także próbować połączyć strumienie bitów bez ich ponownego kodowania, korzystając z demuxera konkatencyjnego. Utwórz plik o nazwie concat.txt
i dodaj następujące wpisy (odpowiadające klipom wideo utworzonym powyżej):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
Następnie połącz te pojedyncze pliki:
ffmpeg -f concat -i concat.txt -c copy output.avi
Wymaga to jednak, aby twoje klipy miały ten sam kodek, rozdzielczość, szybkość klatek itp. - więc nie działa z wszystkimi rodzajami źródeł heterogenicznych.
Za pomocą concat
protokołu
Powyższy rodzaj konkatenacji na poziomie pliku można również osiągnąć przy użyciu concat
protokołu, z takimi samymi ograniczeniami jak powyżej (ten sam kodek, rozdzielczość itp.):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
Aby uzyskać więcej informacji na temat konkatenacji, przeczytaj odpowiednią stronę Wiki FFmpeg .