ffmpeg -i input.mp4 -map 0 -c copy -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4
... создаст файлы по типу out01.mp4 out02.mp4, длительность каждого из которых составляет 120 секунд (кроме последнего, который может быть короче). Обратите внимание, что он должен разделить файл на ключевом кадре, поэтому вы не получите 100% точное разбиение. Смотрите сегментную документацию.
Если вы хотите перекодировать, вы можете получить точное разделение, используя -force_key_frames
. Чтобы заставить ключевой кадр каждые 120 секунд и разделить, используя сегмент:
ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-force_key_frames expr:gte(t,n_forced*120) -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4
Кроме того, вы можете использовать -g
чтобы установить размер GOP - для этого вам необходимо знать частоту кадров вашего видео. Если ваше видео имеет частоту кадров 25 кадров в секунду, то GOP 120 * 25 = 3000 будет получать один ключевой кадр каждые две минуты; очевидно, это слишком мало! Уменьшение его до 300 будет более разумным и даст вам ключевые кадры в местах, которые вам нужны:
ffmpeg -i input.mp4 -map 0 -c:v libx264 -preset veryfast -crf 22 -c:a libfdk_aac -vbr 3 \
-g 300 -f segment -segment_time 120 -reset_timestamps 1 out%02d.mp4
Конкретные кодеки, поддерживаемые вашей версией ffmpeg, могут отличаться от моих (у вас не будет libfdk_aac, если вы не скомпилировали из исходного кода).