Skip to content
Techno911Public

About

Подготовка карусели Instagram из макетов Фигмы и видео с iPhone: кадр 4:5 глазами, обрезка по времени, наложение макета, сборка всей карусели. Локально, без зависимостей, только Node и ffmpeg.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Кадр

Карусель Instagram из макетов Фигмы и видео с iPhone. Кадрирует под 4:5 так, что видно, что именно обрежется, режет по времени, кладёт макет сверху и отдаёт готовые файлы 1080 × 1350 с теми же именами, что у макетов.

Работает целиком на вашей машине: видео никуда не загружается и не покидает компьютер.

Рабочий экран

Зачем это нужно

Обычный путь такой. Макеты карусели верстаются в Фигме и экспортируются пачкой (1.png, 2.png, 3.png): сверху прозрачно, снизу градиент и белый текст. Дальше их надо положить поверх видео с телефона, и начинается возня.

Видео другого разрешения и другого соотношения сторон. Резать вслепую нельзя: легко срезать голову. Каждый ролик надо ещё подрезать по времени, совместить с нужным макетом, а потом переименовать файлы, чтобы карусель собралась в правильном порядке.

«Кадр» закрывает ровно этот шаг между Фигмой и публикацией.

Как это работает

1. Бросаете всё разом. Видео и макеты, сколько угодно, в любом порядке и в любое место окна. Внизу появляется лента слайдов: видео узнаётся по первому кадру, макет по шахматке под прозрачной частью.

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

2. Пересобираете связки, как удобно. У готового слайда внизу карточки широкая полоса макет. Нажали на неё, нажали на другой слайд, макет переехал. Или потянули её мышью, если привычнее тащить. Мелких мишеней в интерфейсе нет намеренно.

Перенос макета

3. Выбираете кадр глазами. Светлая рамка это то, что останется, всё за ней затемнено и будет обрезано. Макет виден прямо в предпросмотре, поэтому сразу понятно, не наедет ли текст на лицо. Рядом честная оценка: сколько точек оригинала попадёт в кадр и не превратится ли картинка в мыло при сильном приближении.

Настроили рамку на одном слайде, на следующем она уже там. Есть кнопка «кадр всем слайдам».

4. Режете по времени по ленте кадров, мышью или с клавиатуры.

5. Собираете карусель одной кнопкой. Все слайды с видео идут подряд, по два одновременно, чтобы машина оставалась живой. Имя готового файла берётся от макета: 3 польза.png даёт 3 польза.mp4, поэтому названия из Фигмы переносятся как есть. Когда всё готово, папка с результатом открывается сама.

Что ещё умеет

  • Правильно работает с видео iPhone: HEVC, 10 бит, HDR, поворот в метаданных, 4K, 60 кадров.
  • Не теряет работу при перезагрузке страницы: лента, связки, кадр и обрезка возвращаются.
  • Открывается с телефона по локальной сети, тогда видео заливается прямо с iPhone, без переброса на компьютер.
  • Отличает готовые слайды от наложений по фактической прозрачности пикселей: макет с глухим верхом это готовая картинка, видео под неё не подложить.
  • Предупреждает, если макеты в карусели разного формата.
  • Пишет результат атомарно: в папке никогда не лежит недописанное видео.

Установка

Нужны Node.js 18 или новее и ffmpeg. Больше ничего: зависимостей у инструмента нет вовсе.

brew install node ffmpeg
git clone https://github.com/Techno911/kadr.git

Запуск

На macOS: двойной клик по файлу ▶ ЗАПУСТИТЬ Кадр.command, откроется браузер.

Из терминала на любой системе:

npm start

В консоли появится адрес с ключом доступа, например http://localhost:7788/?k=…. Ключ нужен потому, что сервис слушает локальную сеть (чтобы можно было залить видео с телефона), и случайный человек в том же Wi-Fi не должен получить доступ.

Подробная инструкция по работе: КАК ПОЛЬЗОВАТЬСЯ.md

Про цвет HDR

iPhone снимает в HDR. Если просто перекодировать такое видео, картинка выйдет вымытой: серое небо вместо синего. Приведение к обычному цвету делается тем, что умеет ваша сборка ffmpeg:

  1. scale_vt, аппаратно средствами Apple: лучший вариант, он же используется системой при показе HDR на обычном экране;
  2. zscale плюс tonemap: программный путь для сборок без Apple;
  3. если нет ни того, ни другого, сервис скажет об этом при старте, и HDR-видео выйдет тусклым.

Проверить, что есть у вас: ffmpeg -filters | grep -E "scale_vt|zscale". Аппаратный путь проверен замером на настоящем файле, программный собран по общей практике и подробно не тестировался.

Проверки

npm test         # сервис и файлы
npm run test:ui  # интерфейс настоящей мышью в настоящем Chrome
npm run test:all

npm test поднимает свой экземпляр сервиса и проходит полный путь на пяти типах видео (вертикальное HDR с поворотом, обычное SDR, горизонтальное, повёрнутое в другую сторону, без звука), плюс карусель целиком и разбор ошибок.

npm run test:ui открывает страницу в настоящем Chrome и работает настоящей мышью: нажимает на карточки, тащит макеты через десятки промежуточных точек, проверяет размер мишеней, собирает карусель, перезагружает страницу и смотрит узкий экран. Именно так ловятся дефекты, которых не видно ни в коде, ни в состоянии: доставка событий и попадание курсора. Нужен puppeteer-core (ищется в соседних проектах) и Chrome; без них прогон честно пропускается. KADR_UI_HEADED=1 покажет окно браузера.

Проверка, для которой не сложились условия, печатается как пропуск и роняет прогон: зелёный итог должен означать «всё проверено», а не «проверок не было».

Устройство

server/server.js    HTTP-сервер: приём файлов, очередь сборки, раздача, ключ доступа
server/media.js     всё про ffmpeg: разбор, предпросмотр, лента кадров, сборка
server/selftest.js  сквозной прогон сервиса
server/uitest.mjs   прогон интерфейса настоящей мышью
web/                интерфейс: один html, один js, один css
docs/make-media.mjs съёмка снимков для этого описания

Файл принимается потоком в теле PUT-запроса, поэтому не нужен ни разбор multipart, ни пакеты. Инструмент, который не сломается от обновления чужой библиотеки.

Рабочие файлы и готовые карусели лежат в ~/Library/Application Support/Kadr (на других системах в домашней папке), всё старше двух суток стирается само.

Ограничения

  • Работа живёт, пока запущен сервис: после его остановки файлы придётся перетащить заново.
  • Лучше всего работает на Apple: там есть аппаратные декодирование, тонмаппинг и кодирование. На других системах всё работает, но медленнее.
  • Инструмент делался под конкретную задачу и вкус автора. Если он полезен вам как есть, берите; правки под свой процесс проще внести самому, файлов немного.

Лицензия

MIT

About

Подготовка карусели Instagram из макетов Фигмы и видео с iPhone: кадр 4:5 глазами, обрезка по времени, наложение макета, сборка всей карусели. Локально, без зависимостей, только Node и ffmpeg.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages