Как устроена композиция HyperFrames и как задать, когда элемент появляется на экране?
- Как сделать видео из HTML в HyperFrames?
Композиция HyperFrames — обычная HTML-страница: корневой элемент с data-composition-id и размерами кадра, внутри — клипы с временем начала, длительностью и дорожкой.
data-start,data-duration; слои — CSSz-index- Видео, картинки, текст,
<audio>сdata-volume— обязательно сid, иначе в рендере тишина - Анимация — GSAP-таймлиния
paused: true, записанная вwindow.__timelines
А ещё Рендер «перематывает» таймлинию на каждый кадр — поэтому анимация должна быть перематываемой
Подробно
HyperFrames — открытый (Apache 2.0) фреймворк HeyGen: HTML, CSS и медиа превращаются в MP4. Безголовый Chromium открывает страницу, переводит анимацию на нужный момент для каждого кадра, а FFmpeg кодирует кадры в видео. Нужны Node.js 22+ и FFmpeg.
Корень композиции задаёт id, длительность и размер кадра: data-width="1080" data-height="1920" — вертикаль. Каждый элемент, который живёт на таймлайне, получает атрибуты времени в секундах; класс clip растягивает его на весь кадр. Порядок слоёв — обычный CSS z-index: data-track-index — только дорожка в Studio, на рендер он не влияет.
Движение описывают GSAP: таймлиния создаётся остановленной, а рендер сам выставляет её время. Её регистрируют под id композиции, чтобы рендер нашёл, чем управлять.
Команды: npx hyperframes init — новый проект, preview — просмотр с живой перезагрузкой, check — линтер и проверка вёрстки, render — MP4, add <блок> — готовый блок из каталога (переходы, титры, графики).
Пример
<div id="stage" data-composition-id="promo" data-start="0" data-duration="6"
data-width="1080" data-height="1920">
<video class="clip" data-start="0" data-duration="6"
data-track-index="0" src="bg.mp4" muted playsinline></video>
<h1 id="title" class="clip" data-start="1" data-duration="4"
data-track-index="1">Скидка 20%</h1>
<audio id="music" data-start="0" data-duration="6" data-track-index="2"
data-volume="0.4" src="music.wav"></audio>
<script src="https://cdn.jsdelivr.net/npm/gsap@3/dist/gsap.min.js"></script>
<script>
const tl = gsap.timeline({ paused: true });
tl.from("#title", { opacity: 0, y: 40, duration: 0.8 }, 1);
window.__timelines = window.__timelines || {};
window.__timelines.promo = tl;
</script>
</div>Что хотят услышать
- Корень с id, длительностью и размером; клипы с data-start/data-duration; слои — z-index.
- GSAP-таймлиния на паузе в window.__timelines.
- Рендер: Chromium перематывает кадры, FFmpeg кодирует.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Время задаётся атрибутами data-start и data-duration, слои — CSS z-index, анимация — остановленная GSAP-таймлиния, зарегистрированная в window.__timelines
- ✗Видео пишут на React-компонентах, а время считают от номера кадра через хук
- ✗Элементы появляются по setTimeout, а рендер записывает экран в реальном времени
- ✗Композицию описывают в JSON, HTML не используется
Что спросят дальше
Связанные вопросы
sotto — ассистент для живых разговоров
Помогает вести занятия, лекции и рабочие созвоны: на одном экране показывает подсказки по материалу, которые не видит аудитория, и помогает точнее отвечать на вопросы.