Шаг 1:
Отрубите последнюю секунду из файла ровно 5 м 1 с.
ffmpeg -i "input.mp4" -t 300 -c copy "input-5m.mp4"
Шаг 2:
Слияние файлов и уменьшение до 720p
1) Создайте текстовый файл, содержащий список всех обрезанных файлов, в последовательности, как это
file 'input1-5m.mp4'
file 'input2-5m.mp4'
file 'input3-5m.mp4'
...
file 'inputn-5m.mp4'
2) Слияние и сжатие
ffmpeg -f concat -i "list.txt" -vf scale=1280x720,setsar=1 -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
Если у вас более старая сборка ffmpeg, вам, возможно, придется вставить -strict -2
чтобы пропустить низший кодер VisualOn AAC.
Если вы хотите пропустить шаг 1, вы можете использовать команду ниже для части 2 шага 2:
ffmpeg -f concat -i "list.txt" -vf "select='(gte(mod((t\),301),0)*lt(mod((t\),301),300))',scale=1280x720,setsar=1,setpts=N/TB/FRAME_RATE" -af "aselect='(gte(mod((t\),301),0)*lt(mod((t\),301),300))',asetpts=N/SR/TB" -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
Но это не сработает, если временные метки во входных файлах имеют неправильную структуру.
С новым флагом concatdec_select
это также можно сделать следующим образом
1) Создайте текстовый файл, как указано выше, но с указанными точками входа / выхода:
file 'input1.mp4'
outpoint 300
file 'input2.mp4'
outpoint 300
file 'input3.mp4'
outpoint 300
...
file 'inputn.mp4'
outpoint 300
2) Слияние и сжатие
ffmpeg -f concat -i "list.txt" -vf "select=concatdec_select,scale=1280x720,setsar=1,setpts=N/TB/FRAME_RATE" -af "aselect=concatdec_select,asetpts=N/SR/TB" -sws_flags lanczos -c:v libx264 -crf 23 -c:a aac "merged-720p.mp4"
Подстановочный знак в этом методе заключается в том, что отсечки выбора могут быть неточными, за исключением потоков с внутренним кодированием.