5

У меня есть видео продолжительностью 10 минут, которое я хочу разрезать на пять 2-минутных сегментов.

Я могу использовать ffmpeg, чтобы вырезать видео в определенное время с помощью следующего:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

Нужно ли сначала узнать длину видео, а затем повторить приведенную выше команду, или есть более простой способ сделать это?

2 ответа2

8
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, если вы не скомпилировали из исходного кода).

1
i=-120
infile=<inputfile>
while [[ "$?" == "0" ]]; do \
    ((i+=120)) \
    ffmpeg -ss $i -t 120 -i $infile ${infile/.mpg/.$((i/120)).mpg} \
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .