Как уменьшить кадры с наложением в ffmpeg
Я пытаюсь конвертировать некоторые файлы в ProRes. Одна довольно важная часть преобразования:
- уменьшение кадров с 60 до 30
- смешивая каждые 2 кадра в один и достигая более плавного движения. (простой вид размытия в движении)
Я попробовал -blend
команда, однако она не была распознана как команда.
-i source.mp4 -r 30 -vcodec prores_ks -profile:v 0 Output.mov
Как уменьшить кадры с наложением в ffmpeg?
4 ответа
Простое удаление кадра:
ffmpeg -i input.mov -r 30 output.mov
Интерполируйте кадры с помощью фильтра minterpolate:
ffmpeg -i input.mov -vf minterpolate=fps=30 output.mov
- См. Ссылку выше, так как есть много дополнительных опций.
Интерполируйте кадры с помощью фильтра частоты кадров:
ffmpeg -i input.mov -vf framerate=fps=30 output
- См. Ссылку выше, так как есть много дополнительных опций.
Пытаться
ffmpeg -h
или
ffmpeg --help
и вам будет короткая помощь. Пожалуйста, прочтите это.:)
Пытаться
ffmpeg -filters
и у вас будет список доступных фильтров
Пытаться
ffmpeg -help filter=name
и у вас будет синтаксис и параметры для этого фильтра
Мне уже нужно было сделать что-то подобное, уменьшив частоту кадров. Если вы это сделаете
ffmpeg -i "input" -r outputframerate [video encoding options...] [-y] "output"
Примечание. Пункты в скобках [] не являются обязательными.
У вас будет простое изменение частоты кадров с возможной потерей входных кадров. И это особенно то, чего вы не хотите получать.
Чтобы изменить частоту кадров без потери входных кадров, вам придется использовать видеофильтр.
Tblend фильтр смешивает последовательные кадры. Это фильтр, который следует использовать, если исходная частота кадров является целым числом, умноженным на частоту кадров назначения (например: 60→30, 75→15, 75→25,...)
ffmpeg -i "input" -vf tblend=all_mode=average [video encoding options...] -r outputframerate⁽¹⁾ [-y] "output"
⁽¹⁾ Если сам не тестировал этот фильтр, и я уверен, что выходную частоту кадров нужно где-то установить. Фильтр tblend не имеет параметра fps. Может, просто смешивает 2 последовательных кадра? Вы должны проверить этот момент и попробовать?
Существует еще одно устройство смены частоты кадров, более приспособленное для использования с любой частотой кадров ввода-вывода:
minterpolate: преобразование частоты кадров с использованием интерполяции движения.
Итак, введите:
ffmpeg -i "input" -vf minterpolate=fps=outputframerate [video encoding options...] [-y] "output"
Другие параметры minterpolate имеют достаточно хорошие значения по умолчанию, чтобы обеспечить хорошее смешивание. Проверьте их с помощью
ffmpeg -help filter=minterpolate
Если вы хотите добавить некоторые параметры в цепочку minterpolate, вам придется использовать ':' в качестве разделителя параметров. Предположим, вы хотите использовать режим интерполяции движения = blend вместо стандартной интерполяции с компенсацией движения (mci), введите:
ffmpeg -i "input" -vf minterpolate=fps=outputframerate:mi_mode=blend [video encoding options...] [-y] "output"
Если вы хотите использовать много фильтров видео, вы не должны связывать параметры -vf. Последний будет иметь приоритет над предыдущими. Вы должны (как ':' для параметров фильтра) использовать ',' в качестве разделителя фильтров. Пример:
ffmpeg -i "input" -vf minterpolate=fps=outputframerate:mi_mode=blend,filter2=param1=value1:param2=value2[...] [video encoding options...] [-y] "output"
Порядок данных фильтров важен.
Все было сделано с
ffmpeg версия 3.2.14-1~deb9u1 Авторские права (c) 2000-2019 разработчики FFmpeg
Специально для смешивания между кадрами в замедленной съемке, чтобы получить действительно высокое качество, почти размытие между кадрами, которые вы можете использовать.tblend=average
.
Это то, что я в конечном итоге использовал, и оно обеспечивает невероятно мягкий, плавный вид моих видеороликов с интервальной съемкой:
ffmpeg -i in_video.mp4 -vf "tblend=average,setpts=0.05*PTS" -r 60 -crf 2 -an out_video.mp4
Или, для вашего варианта использования:
ffmpeg -i in_video.mp4 -vf "tblend=average,setpts=0.5*PTS" -r 30 -crf 2 -an out_video.mp4
Наиболее общее решение используетtmix
:
ffmpeg -i source.mp4 -vf tmix=frames=60/30 -r 30 ...
Где 60 — ваша входная частота кадров, а 30 — выходная.
Фон
Видеофильтр tmix берет каждый входной кадр и усредняет его с последующим. В этот момент у вас есть размытый поток со скоростью 60 кадров в секунду. -r 30
подсемплирует это, выбирая каждый второй кадр (и увеличивая его длительность в два раза), что дает вам желаемый результат.
придирки
С технической точки зрения это работает, только если ваше соотношение является целым числом (например, 50/25, 60/20, но не 60/24). Если вы действительно хотите быть точным, вы можете перейти от 60->24 (= 2,5 исходных кадров на выходной кадр), например, взвешивая средний кадр на 100% и оба его соседа на 75%, всего 2,5:
ffmpeg -i source.mp4 -vf 'tmix=frames=3:weights=75 100 75' -r 25 ...
(Хотя я не уверен, почему вы беспокоитесь.)
Источники
Спасибо Яну за ссылку и Максу за ответ.