Використання 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 .