Увидел в ТГ видеокружок - винил-пластинку с аудио, и захотел также. И сделал своего бота
- Реальная история полета мысли и рождения продукта
- Примеры создания бота с нуля
- Готовый скрипт для рендера кружочков с музыкой (ну почти)
- Готовый бот с неприлично простым функционалом: t.me/Wjooh_bot
В одном телеграм канале с мемами увидел такой вот видео-нот, и так мне зашла эта идея что сразу захотелось сделать такой же. И делать вообще регулярно по настроению, когда наткнулся на подходящую картинку или захотел подсадить друга на топовую песню. Я начал прощупывать карманные ресурсы. Карманные — потому что делать по настроению значит делать с телефона
Мой фаворит в видео редакторах YouCut, который обычно позволяет создать кат по любой ситуативной идеи, и быстро, в этот раз немного подвел: всё что можно от него добиться это использовать эфект вращения с одной заданной скоростью, а эта скорость задана весьма выше чем у вайба винила.
=(
Второй кочкой, на которой споткнулся полет моей идеи, стала сама механика видеокружочков. Юзер не может загрузить их с устройства — только записать.. Тут я вспомнил что разрабатываю ботов на Python, и в сущностях сообщений явно видел поле VideoNote — видеокружок. И стало ясно что загружать их из галереи нельзя только в реализации приложения — само API телеграмма естественно не против.
Для надежности загуглил «как делают видео-сообщения из обычных видео», и нашел кучу примеров зреющей идеи — телеграмм боты на всяко-разных условиях предлагают сделать кружочек из любого вашего видео. А раз такое делает бот, почему бы боту и не закручивать его, и не накладывать аудио самому? Вот и ни почему.
Поехали
Начинаем с центральной функции — монтажа и рендера.
- Входные данные — картинка и аудио файл.
- На выходе нужно mp4 видео с вращающейся картинкой под музыку.
Сразу как то интуитивно было, что вращение проще оформить на этапе подготовки картинки. Использовать самый банальный инструмент, встроенный в Python — PIL Image, создать раскадровку будущего видео и сохранить на диске.
Делаем цикл, оставляем на перспективу множитель скорости(им также можно менять направление вращения знаком +-), поворачиваем картинку на шаг*скорость, и сохраняем в массив кадров
Сразу скажу, получится урод. Надо сначала сделать из картинки квадрат: считаем точки краев картинки и получаем новую
Готовый набор картинок собираем в контейнер видео-либы, накладываем аудио и го рендерить на старом офисном ноуте это дело адски долгое.
Сразу тестим на VPS с убунтой и 300mb ОЗУ: Процесс убивается еще на закручивании картинок
Оптимизируем
Ладно, если не торопиться, то во первых надо делать входные картинки одного небольшого размера, всё-таки в кружочке нет приоритета на ХайРес, а видео рендерится по размеру большего из слоев. Заодно внимательнее следим за закрытием ненужных файлов/потоков
Из любопытства глядим на нагрузку системы
Бедная озу, где то я не там свернул.
Немного вчитавшись в доки находим метод как раз для склейки картинок кадров в клип, в который надо только отправить адреса файлов, а он сам их по умному загрузит и склеит.
Ощутимая оптимизации. Надо больше читать доки
Где то в это время под тест попадет кейс когда входное аудио короче минуты, и хочется эту ситуацию быстро пусть топорно решить.
Применяем вуду-программирование:
С божей помощью оно работает с первого раза, едем дальше.
Друг (ссылка: Разработка кроссплатформенных приложений, интерактивных экскурсий, презентаций, AR, VR, MR для выставок, музеев, рекламы и веба) советует для оптимизации потыкаться в кодеки рендера и битрейт, так что мы снижаем битрейт аудио до 100k, меняем кодек на новомодный h264 видео до 200k (дефолт выдавал 400, дефолт х254 вобще 4500! sic), врубаем режим оптимизации ultrafast, и все ради бедной убунты-300-озу, дай ей бог сил.
Убунта справляется. Но такое качество даже в кружочке неприемлемо
Если использовать как посоветовал мой друг (ссылка: Разработка кроссплатформенных приложений, интерактивных экскурсий, презентаций, AR, VR, MR для выставок, музеев, рекламы и веба) кодек h265, который ещё более современный и оптимизированный, то результирующее видео вообще не воспроизводится на мобильном ТГ, на десктопе выглядит выразительно(скорее всего проблема в моем невежестве, но тратить на это время не целесообразно, ИДЕЯ ГОРИТ)
Молодец друг, если что он занимается Разработка кроссплатформенных приложений, интерактивных экскурсий, презентаций, AR, VR, MR для выставок, музеев, рекламы и веба и вот его профиль ссылка
Дальше начинаем подбирать разрешение и битрейт что бы железо тянуло, картинка удовлетворяла и самое интересное — какие критерии для видео существуют что бы ТГ его сделал кружочком. Дело в том что загрузка VideoNote работает загадочным образом, она отправляет на сервер ТГ любое твое видео, но они там его каким то образом оценивают и решают — выдать в чат каноничный кружок, или если что то не понравилось — вкинуть его как обычное видео. В документации написаны требования, только забыли упомянуть разрешение:
- Разрешение видео не более 640р
- Расширение файла .mp4
- Длинна не более минуты
- Квадратное
Кружок начинает выглядеть прекрасно уже на 600к битрейте
Наконец наложим сверху тестурку пластинки.
Конечный код скрипта доступен на
Я до последнего не верил что такого бота никто еще не делал, и недавно нашел одну реализацию такой идеи, можете найти его по слову винилайзер, у него я в итоге и подглядел макс разрешение для кружочка. Видеть чужую реализацию твоей тайной идеи конечно больно, но я сразу решил что у моего бота будет фича в простоте, так чик-хоп и готов кружок. А у конкурента фишка в сложности (:
Короче немного магии Aiogram, про него контента итак хватает, придумал социальный элемент — показывать юзерам чужие кружочки! и оценивать! и формировать топ!!! Добавил выбор маски-пластинки и запустил на копеечном VPS
Я назвал своего бота Вжух
upd: вышла статья про новую интересную фичу Вжуха в связке с другим крутым ботом