9

У меня есть видео в формате mp4 с частотой кадров .33 (1 кадр за 3 секунды). Я хочу увеличить частоту кадров до 5 кадров / сек. Я попробовал приведенную ниже команду, но она ничего не делает:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Есть идеи, почему ffmpeg игнорирует опцию -r ?

4 ответа4

6

Если входной файл не имеет допустимой частоты кадров, возможно, вам придется установить ее явно

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
4

Я знаю, что это старый вопрос, но ни один из текущих ответов больше не является рекомендуемым способом. Это руководство от вики ffmpeg. Обратите внимание, что все эти параметры требуют перекодирования видео.

Ускорение / замедление видео

Вы можете изменить скорость видеопотока, используя фильтр видео setpts. Обратите внимание, что в следующих примерах аудиопоток не изменяется, поэтому в идеале его следует отключить с помощью -an.

Чтобы удвоить скорость видео, вы можете использовать:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Фильтр работает путем изменения метки времени представления (PTS) каждого видеокадра. Например, если на временных метках 1 и 2 показаны два последовательных кадра и вы хотите ускорить видео, эти временные метки должны равняться 0,5 и 1 соответственно. Таким образом, мы должны умножить их на 0,5.

Обратите внимание, что этот метод пропускает кадры для достижения желаемой скорости. Вы можете избежать пропущенных кадров, указав более высокую частоту кадров на выходе, чем на входе. Например, чтобы перейти от входа 4 FPS к тому, который увеличен до 4x, что (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Чтобы замедлить ваше видео, вы должны использовать множитель больше 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Гладкий; плавный

Вы можете сгладить медленное / быстрое видео с помощью видеофильтра minterpolate. Это также известно как "интерполяция движения" или "оптический поток".

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Другие варианты включают slowmoVideo и Butterflow. Ускорение / замедление звука

Вы можете ускорить или замедлить звук с помощью аудио фильтра atempo. Чтобы удвоить скорость звука:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Фильтр atempo ограничен использованием значений от 0,5 до 2,0 (поэтому он может замедлять его не менее чем до половины первоначальной скорости и увеличивать скорость до не более чем вдвое). Если вам нужно, вы можете обойти это ограничение, объединив несколько фильтров atempo. Следующее с четырехкратной скоростью звука:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Используя сложный фильтр графа, вы можете ускорить видео и аудио одновременно:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
2

Я мог только заставить измененную частоту кадров вступить в силу, если входной файл был классифицирован как "сырой" файл:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Без указания -f h264 умолчанию будет 25 кадров в секунду, и его нельзя будет изменить. По-видимому, это произошло потому, что потоку вообще не хватало информации о частоте кадров, и это частота кадров по умолчанию для ffmpeg.

Очевидно, когда вы используете -r в качестве параметра вывода, он дублирует или отбрасывает кадры, поэтому видео воспроизводится с той же скоростью - в данном случае, не то, что вам нужно! Но изменение входной частоты кадров, как указано выше, приведет к ускорению или замедлению видео без потери или дублирования кадров.

1

Такая особенность - изменение частоты кадров - называется "соответствующей" и часто используется для создания замедленной или ускоренной перемотки вперед, например, показывая рост растения в считанные минуты дней. ffmpeg не позволяет перезаписывать / изменять частоту кадров без перекодирования. Если это так, продолжительность изменится, и звук будет несинхронизирован, если не будет отдельно исправлено. Но я боюсь, что аудио не представляет интереса для вашего случая с частотой кадров .33

Вы хотите соответствовать, потому что вы просто хотите изменить частоту кадров, но ffmpeg игнорирует -r молча если частота кадров указана во входном файле. Поскольку ваш входной файл имеет формат .mp4, его собственная частота кадров имеет приоритет -r когда перекодировать не нужно. Для этого вам понадобится другой инструмент: mencoder.

Предполагая, что ваш входной файл не содержит звука - вероятно, верно для любого видео с частотой кадров .33 - вам нужно:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Обратите внимание, что по умолчанию mencoder производит вывод в формате AVI.

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