Набор скриптов, который периодически используется для сохранения состояния доски и сборки таймлапса VK Pixel Battle.
Готовые таймлапсы 2017-10-10:
Готовые таймлапсы 2018-10-10:
Готовые таймлапсы 2020-10-10:
- возможно даже будут
(Видео закодировано в Lossless H.264, так что его воспроизведёт далеко не любой плеер и уж тем более не браузер)
Скрипты оформлены в виде Python-модуля:
-
pixel_battle.grabber— непосредственно сам сборщик. Скачивает картинку по адресуhttps://pixel-dev.w84.vkforms.ru/api/dataкаждые несколько секунд и сохраняет как оптимизированный PNG в указанный каталог (для примераimg). Умеет проводить дедупликацию с помощью создания симлинков; если симлинков на один и тот же файл будет слишком много (более 1440 штук подряд), то лишние симлинки удаляются, чтобы не нагружать файловую систему большим числом файлов. Так как картика закодирована текстовыми символами, требуется предоставить файл с палитрой для декодирования этих символов, а размер картинки ожидается 1590x400 пикселей. Использовать примерно так:python -m pixel_battle grabber -i 30 --use-symlinks -p palette_2019-10-10.json imgВ том же каталоге
imgсоздаёт файлыlast.jsonиlast.pngс информацией о последней скачанной картинки иstate.jsonсо списком симлинков, чтобы не забывать их во время перезапуска скрипта.А чтобы скачивался топ сообществ, нужно выдрать HTTP-заголовок
X-vk-signи прописать его в опцию--top-vk-sign. -
pixel_battle.img2video_prepare— собирает скачанные grabber'ом картинки из каталогаimg, пририсовывает снизу дату (берёт из имени файла) и сохраняет в указанный каталог, создавая ffconcat-плейлист, который потом можно скормить в ffmpeg. Имена картинок должны быть png и начинаться сГГГГ-ММ-ДД_ЧЧ-ММ-СС. Порядок и количество подкаталогов ни на что не влияют — все файлы будут отсортированы по имени, которое является временем. Использовать примерно так:python -m pixel_battle img2video_prepare img my/src -c my/src.ffcatВ каталоге
my/srcбудут картинки с датами, а в файлеmy/src.ffcatбудет concat-плейлист, который можно скормить в ffmpeg. -
pixel_battle.img2videoконвертирует картинки из каталога с картинками в какой-нибудь видеофайл. Чтобы даты картинок при этом не потерялись, есть опция--list, которая позволяет указать файл, в который будут записаны оригинальные имена картинок. Имена картинок должны начинаться сГГГГ-ММ-ДД_ЧЧ-ММ-СС, сортировка по имени, порядок и количество подкаталогов ни на что не влияют.Параметры по умолчанию настроены на Lossless VP9 по причине лицензионной чистоты, но из практических соображений лучше использовать h264, так как libx264rgb жмёт в четыре раза лучше и работает в три раза быстрее.
Опцией
--formatможно выбрать формат видео:- vp9 (по умолчанию) — Lossless VP9, файл webm;
- h264 — Lossless H.264, файл mp4;
- h264-main — Lossy H.264 с профилем Main, который осиливают многие устройства (однако RGB не поддерживается и качество теряется);
- h264-baseline — Lossy H.264 с профилем Baseline, который осиливают большинство существующих устройств (однако RGB не поддерживается и качество теряется);
- custom — никаких параметров выходного видео не задавать, всё прописывается
через
--extra-args.
Кратко о полезных опциях:
-
-b 1024kили-crf 29можно использовать для управления качеством h264-main или h264-baseline; -
--pixfmt rgb24 / yuv420pпозволяет выбрать формат пикселей. Форматrgb24(по умолчанию) точно сохраняет цвета, но некоторые форматы поддерживают толькоyuv420p; -
--crop ширина:высота:x:yдля обрезки видео; -
--scale 2xдля масштабирования обрезанного видео (без сглаживания); -
--beginи--endзадют относительные пути к первому и последнему кадрам, чтобы не кодировать весь таймлапс целиком.
Опция
--input-fps(-ir) задаёт частоту кадров входящего видео, а опция--output-fps(-or) изменяет его путём дублирования или выкидывания лишних картинок, сохраняя исходную скорость; таким образом-irпозволяет управлять длительностью получаемого видео.Пример кодирования всего таймлапса в Lossless H.264 RGB (в процессе сжатия ни один пиксель не пострадает):
python -m pixel_battle img2video --format h264 \ ./img/ pixel_battle_2018.mp4 --list pixel_battle_2018.txtСделать таймлапс для старых и немощных устройств и подправить длины некоторых кадров файлом 2018.json (используя картинки с датами, нарисованными скриптом img2video_prepare):
python -m pixel_battle img2video --format h264-main -p yuv420p -crf 21 \ --list pixel_battle_2018.txt --extra 2018.json \ ./my/src/ pixel_battle_2018_compressed.mp4Разглядеть Дерпи поближе и сделать видео для закидывания в телеграм-чатик:
python -m pixel_battle img2video \ --begin 2018-10-12_04/2018-10-12_04-20-00.png \ --end 2018-10-12_07/2018-10-12_07-10-00.png \ --format h264-baseline -p yuv420p -crf 31 --crop 59:47:100:300 \ --scale=2x -ir 60 -or 30 ./img/ ./derpy.mp4 -
pixel_battle.video2imgвыполняет обратную операцию: читает видеофайл и сохраняет кадры в файлы в соответствии с файликом, который был создан с аргументом--listпредыдущим скриптом:python -m pixel_battle video2img --use-symlinks --size 1590x424 \ pixel_battle_2018.txt pixel_battle_2018.mp4 ./restored_img/Если на видео есть часы внизу, то их можно обрезать опцией
--crop 1590:400:0:0. Обратите внимание, что обрезка работает как фильтр ffmpeg, поэтому при установке нестандартного размера (не 1590x400) вам также нужно указать этот размер в опции--size 666x777по техническим причинам, иначе картинка съедет. -
pixel_battle.filelistпросто печатает отсортированный список картинок с учётом опций--beginи--endи может использоваться для отладки или в шелл-скриптах:python -m pixel_battle filelist \ --begin 2018-10-12_04/2018-10-12_04-20-00.png \ --end 2018-10-12_07/2018-10-12_07-10-00.png -
make_timelapse.shиmake_fast_timelapse.sh— с помощью ffmpeg собирают кадры изmy/srcв H.264 RGB видеоtimelapse.mp4иtimelapse_fast.mp4соответственно. Для файлаtimelapse.mp4создаётся файлtimelapse.txtс названиями кадров, что позволяет разобрать видео обратно на исходные картинки с помощьюvideo2img(без потери качества!). Это просто обёртки над скриптамиimg2video_prepareиimg2video. -
make_preview.shпринимаетbeginиend(можно указать пустые строки в кавычках) и создаёт сжатый видеофайлpreview.mp4, который потом можно закинуть в какой-нибудь телеграм. Тоже обёртка надimg2video. -
last.htmlотдаёт самую свежую картинку, сохранённую первым скриптом. (Осторожно, лютейший тяп-ляп и jQuery внутри) -
rgb_sha256sum.py— вспомогательный отладочный скрипт, который используется аналогично стандартной линуксовой утилитеsha256sum, только читает RGB-картинки и считает хэши от значений пикселей.