ffmpeg: как добавить пиксельный эффект?
Мне нужно размыть некоторые загруженные видео и закодировать их. Фактически, размытие означает, что пикселируйте их так, чтобы появились "большие квадраты", и размыли их.
Есть идеи, как я могу это сделать? (ffmpeg был бы хорош, любой инструмент командной строки Windows должен быть в порядке)
Благодарю.
3 ответа
FFmpeg может поддерживать фильтры frei0r, которые включают pixeliz0r. Пример:
ffmpeg -i input -filter:v frei0r=pixeliz0r=0.02:0.02 output
Два параметра:
- BlockSizeX: горизонтальный размер одного "пикселя"
- BlockSizeY: вертикальный размер одного "пикселя"
Конечно, большее значение создаст большие блоки. Сборки Zeranoe FFmpeg включают frei0r, однако я не уверен, работает ли он, так как у некоторых пользователей были проблемы с ним в #ffmpeg IRC, хотя это было, по крайней мере, 6 месяцев назад.
Что касается Linux, то компиляция проста. Пользователи Ubuntu могут следовать HOWTO: установить и использовать последние версии FFmpeg и x264 и просто добавить frei0r-plugins-dev в качестве зависимости, а затем добавить --enable-frei0r
к вашей конфигурации ffmpeg.
Если вы не хотите устанавливать для этого плагин frei0r, есть альтернативный способ.
dimensions=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=\:" input)
ffmpeg -i input -filter_complex \
"[0:v] scale='iw/15:-1', scale='$dimensions:flags=neighbor'" output
Это уменьшает размер входного файла (в данном примере, на 15), а затем уменьшает его до исходных размеров. flags=neighbor
говорит ffmpeg использовать алгоритм пересчета ближайшего соседа, что приводит к эффекту pixelated. Вы можете изменить размер блока, изменив число 15.
Первая строка необходима для определения исходных размеров входных данных и их прямого масштабирования, в противном случае уменьшение или увеличение может привести к ошибкам округления, которые немного изменят размер выходных данных.
Фильтр пикселизации может помочь:
ffmpeg -i input -vf pixelize=300 output
Замените 300 на свою интенсивность (ограничено 1024).