Измените частоту кадров видео MP4 с помощью ffmpeg

8

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

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

Любая идея, почему ffmpeg игнорирует -rпараметр?

FireMonkey
источник
Если вы пытаетесь ускорить / замедлить видео, а не дублировать кадров / вывода, см superuser.com/questions/854753/... и / или askubuntu.com/questions/370692/...
Питер Кордес

Ответы:

7

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

Без потерь (видео) ремиксинг

Как отмечено в комментариях, есть способ сделать это, когда видео не нужно перекодировать. Требуется повторное смешивание файла с другим форматом контейнера MKV, а затем повторное смешивание его обратно в MP4. Вот пример, который изменяет видео до 12 кадров в секунду:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

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

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

FFMPEG Wiki Руководство

Это руководство из ffmpeg wiki . Обратите внимание, что все эти параметры требуют перекодирования видео.

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

Вы можете изменить скорость видеопотока, используя фильтр видео 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
pseudosavant
источник
1
Можно ускорить / замедлить, просто смешав, но FFmpeg не знает, как это сделать . например, для mkv, mkvtoolnix может сделать это. например, mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv изменить частоту кадров на контейнере MKV . Вы можете сделать ремукс в MKV и обратно в MP4, или найти инструмент, который делает это для MP4 напрямую. Кодирование видео очень загружает процессор и требует больших потерь, так что это ужасный вариант.
Питер Кордес
Полностью согласен, что ремиксинг на более низкую частоту кадров является предпочтительным, так как это подход без потерь, который требует гораздо меньше ресурсов. На практике я не нашел хорошего инструмента для этого с MP4. Я не пробовал совсем недавно, но когда я впервые написал этот ответ, у меня было повторное смешивание MP4-> MKV-> MP4, и я не мог заставить его работать с использованием mkvtoolnix, ffmpeg и / или mp4box. Я должен попробовать с параметрами, которые вы предлагаете.
псевдосавант
6

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

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Мартин Беккет
источник
Это транскодирование, когда вам действительно нужно только сделать ремукс. (Если вы на самом деле не хотите дублировать / отбрасывать кадры вместо того, чтобы замедлять /
Питер Кордес
3

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

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

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

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

Malvineous
источник
1
Мой полезный ответ. Нет перекодирования здесь
Йота
1

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

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

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

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

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

Танкист 六四
источник
1
Это не верно. Если rв качестве переключателя вывода указано, ffmpeg будет производить вывод с указанной частотой кадров, независимо от частоты кадров ввода. Если rв качестве переключателя ввода указано, ffmpeg будет дублировать или отбрасывать кадры по мере необходимости для подачи указанного количества кадров в секунду ввода в фильтр / кодировщик.
Гьян
Поведение, которое вы описываете при rпереключении ввода, противоречит моему более раннему эксперименту с форматом .mp4, примечанию Малвиноуса (на этой странице) и описанию ошибки 403 trac.ffmpeg.org/ticket/403 ; Ваше описание, когда rиспользуется на выходе, происходит при перекодировании, в то время как сценарий OP, кажется, соответствует случаю (исправить частоту кадров без перекодирования) тем фактом, что он имел частоту кадров .33.
Танкист 六四
1
Проверьте отчет, вставленный здесь . Обратите внимание на командную строку вверху, метаданные ввода и вывода и, наконец, нет. из кодированных кадров.
Гьян
1
Согласились, что OP хочет просто согласовать файл, но его заданная команда перекодирует, поскольку переключатель (и) копирования не указан. В этом случае ffmpeg должен генерировать новый поток на rfps.
Гьян
Спасибо, Малвя, за убедительный пример выхода. Да, вы правы в использовании -r. Такое использование не могло повлиять на мои более ранние эксперименты в ответ на OP, потому что, рассматривая соответствующий случай, я никогда не сбрасывал параметр копирования из ffmpeg и -rпоэтому игнорируется. Я написал запрос на добавление
Tankman 六四
0

Самый быстрый способ - создать BAT-файл в каталоге со следующими строками:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Вам нужно иметь mkvmerge и ffmpeg в одном каталоге. Он автоматически меняет каждый mp4-файл за секунды без потери качества.

Педер Гердин
источник