Використання trimта concat- вихідні файли з різними кодеками
Для цього переконайтесь, що ваші окремі файли мають однакову роздільну здатність, а в ідеалі - однакову частоту кадрів та кольорову підсистему тощо. Це дозволить уникнути помилок чи збоїв під час конкатенації.
Ви можете зробити все за один раз, не розбиваючи файл, використовуючи trimі 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
Тут trimвикористовується для вказівки окремих частин вхідних відеопотоків ( 0:v, 1:v), які згодом потрібно об'єднати. Ці частини названі v0наскрізь v2. ( setptsФільтр скидає часові позначки цих окремих частин до 0, що потрібно для конкатенації). Пізніше ми об'єднуємо три частини.
Якщо ви хочете обрізати від певної часової позначки до кінця, використовуйте trim=start=15замість того, щоб вказати діапазон.
Якщо у ваших файлах є аудіо, ви повинні обрізати ці потоки окремо:
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
Зверніть увагу, що в цьому випадку відео та аудіо будуть перекодовані - обов’язково вкажіть відповідні цілі якості виводу (наприклад, -crfдля x264, x265 або libvpx-vp9). Докладніше про це можна прочитати на FFmpeg Wiki, наприклад, для VP9 або H.264 .
Використання окремих сегментів
Якщо ви хочете розділити кліпи та пізніше зібрати їх:
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
Якщо у файлах є аудіо, використовуйте той самий підхід, що і вище:
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
Це знову перекодує відеопотік. Це трохи простіше, але в іншому випадку має бути еквівалентним вищевказаному методу.
Використання concatдемуксера
В принципі, ви також можете спробувати об'єднати бітові потоки, не перекодуючи їх, використовуючи concat demuxer. Створіть названий файл concat.txtта додайте такі записи (відповідні відеокліпам, створеним вище):
file 'part1.mp4'
file 'short-video.mp4'
file 'part3.mp4'
Потім з'єднайте ці окремі файли:
ffmpeg -f concat -i concat.txt -c copy output.avi
Це вимагає, щоб у ваших кліпів був один і той же кодек, роздільна здатність, частота кадрів тощо - тому він не працює з усіма різновидами гетерогенних джерел.
Використання concatпротоколу
Вищезазначений тип конкатенації на рівні файлів може бути досягнутий і за допомогою concatпротоколу з тими ж обмеженнями, що і вище (той же кодек, роздільна здатність тощо):
ffmpeg -i "concat:part1.avi|part2.avi|part3.avi" -c copy output.mp4
Для отримання додаткової інформації про конкатенацію читайте відповідну сторінку Вікі FFmpeg .