Видео как код на Rust, которое рисует GPU

01 окт 2026
1,556
29
58
1 неделя

Представьте, что вы просите своего кодового агента собрать ролик. Не «напиши сценарий», а «сделай видео на 30 секунд с анимацией логотипа и звуком в такт». Агент уходит, возвращается через 48 минут и приносит готовый .mp4. Именно так родился 128-секундный рекламный ролик проекта fframes — его «вайбнули» за 48 минут, а отрендерили за 36 секунд.

Звучит как маркетинг? Возможно. Но за этим стоит конкретная инженерная идея, и она мне показалась интересной.

Что это вообще такое

fframes — фреймворк для программного рендеринга видео на Rust. Каждый кадр — это дерево SVG, которое возвращает функция на Rust. Фреймворк проигрывает это дерево через GPU (Skia поверх Metal на macOS или Vulkan на Linux и Windows), а кодирование отдаёт библиотекам ffmpeg.

fframes

Автор называет это «vibe coding framework для видео, который реально быстрый». И вот тут есть нюанс, который стоит unpack: fframes разрабатывался годами, но не выпускался. Почему? Потому что API намеренно многословный и явный. Писать такой код руками — утомительно. А вот агенту с хорошо описанным скиллом — в самый раз.

Реклама

Главная фишка — агент, который не может смотреть видео

Кодовый агент не умеет смотреть ролик или слушать дорожку. Он видит только текст. Разработчики fframes решили эту проблему радикально: каждая команда превращает видео в то, что агент способен прочитать — PNG, цифры, текст.

Подключить скилл можно одной командой:

npx skills add https://fframes.studio

Дальше вы описываете видео так, как брифовали бы моушн-дизайнера. Скилл ставит fframes, создаёт проект, проектирует движение, расставляет звук и проверяет результат перед отдачей.

Что именно агент может «посмотреть»:

  • inspect находит отсутствующие шрифты, обрезанный текстом canvas, невалидный SVG и паники — каждый случай с указанием времени и сцены. На ошибках возвращает код выхода 2.
  • strip <scene> -n 12 раскладывает равномерно взятые кадры на один контактный лист.
  • onion "<scene>@0..<scene>@1s" -n 6 смешивает кадры, чтобы показать траекторию и кривую сглаживания.
  • audio analyze --waveform w.png выдаёт отчёт по громкости (LUFS), true peak, клиппингу и тишине — отдельно по сценам.

Человеку же достаются preview (окно на GPU с воспроизведением, паузой и покадровым шагом) и render. Есть ещё редактор в браузере, который крутит скомпилированный в WebAssembly ролик с таймлайном.

Как выглядит код

Каждый кадр — это SVG-дерево из макроса svgr!. Вот сокращённый пример: квадрат едет по таймлайну, а строка текста печатает текущий кадр.

fn render_frame(&self, frame: Frame, ctx: &FFramesContext) -> fframes::Svgr<'_> {
    fframes::svgr!(
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
            <rect
                x="400" y="400" width="200" height="200" fill="blue"
                transform={frame.animate(fframes::timeline!(
                    at 0., animate Transform::translate(0, 0) => Transform::translate(200, 480), Easing::Linear,
                    at 2. => 6.0, animate Transform::translate(200, 480) => Transform::translate(750, -400), Easing::Linear,
                ))}
            />
            <text x="100" y="440" font-family="JetBrains Mono" font-size="74">
                {format!("This frame index: {}, second: {:.2}", frame.index, frame.seconds())}
            </text>
        </svg>
    )
}

Читается именно так, как выглядит: явно, многословно, но предсказуемо. Анимация задаётся через timeline! с временными точками, которые понимают разные форматы — 120 (кадр), 3.2s, 50%, <scene>@1.2s.

Почему оно рендерит быстро

Тут всё разложено по полочкам, и это как раз то, за что отвечает слово «fast» в описании.

Static-разметка кешируется. Части кадра без {expressions} хешируются на этапе компиляции и переиспользуются рендерерами. То есть всё, что не меняется между кадрами, не пересчитывается заново.

GPU действительно рисует. Бэкенд Skia работает на Metal или Vulkan, и это примерно в 10 раз быстрее встроенного CPU-бэкенда.

ffmpeg не вызывается как внешний процесс. fframes линкует его библиотеки libav напрямую.

Когда SVG мало — подключаются шейдеры. Можно запускать SkSL или вставленный GLSL из Shadertoy как слой любого кадра.

По мне, самый практичный трюк — это render --draft: кодирует одну сцену в половинном разрешении примерно за секунду. Удобно, когда нужно быстро проверить композицию, а не ждать полный рендер.

Кому это нужно на практике

В README есть галерея примеров, и по ней видно реальные сценарии:

  • conference-splash-screen — по одному сплэшу на каждый доклад, отрендеренные пакетно. Классика, где генерация видео кодом окупается на объёме.
  • podcast и audio-announce — визуализация звука с автоматическими субтитрами.
  • tiktok — вертикальное видео.
  • signal-lab — 24-секундная моушн-студия: продуктовый UI, сторителлинг по данным, технический эксплейнер.
  • low-poly-art — стресс-тест рендерера с большим количеством полигонов.

Есть даже pixel-memory — генератор памятного видео про собаку автора, полностью рандомизированный. Мелочь, но она хорошо показывает, что инструмент не только для маркетинга.

Что стоит учесть перед стартом

Проект живой: около 1500 звёзд, 5 открытых issue, лицензия MIT. Первый билд на macOS и Linux (arm64, x86_64) скачивает готовые библиотеки Skia и ffmpeg и занимает меньше минуты на быстрой машине. Для остальных платформ они собираются из исходников, а это уже до 20 минут.

Установка без агента выглядит привычно:

cargo install --locked cargo-fframes
cargo fframes new my-video
cd my-video && cargo run --release -- preview

Есть подводные камни. В README отдельно предупреждают: кеширование сборки ffmpeg с флагами -march=native на машине с другим CPU может привести к SIGILL. Для переносимых сборок предусмотрен флаг build-portable. На Windows ffmpeg не собирается из исходников, нужен готовый shared build FFmpeg 9.0 и LLVM для bindgen. Словом, окружение придётся настраивать внимательно.

Стоит ли пробовать

fframes зайдёт в первую очередь тем, кому нужно генерировать видео пакетно или из данных: сплэши для конференций, визуализация подкастов, автоматические субтитры, тикток-формат по шаблону. Если вы уже пишете на Rust и вам близок подход «разметка как код» (привет, кто работал с Remotion в JS-мире), тут та же идея, только на Rust и с упором на GPU.

Отдельный интерес вызывает агентский скилл. Даже если вы не планируете рендерить видео сами, стоит посмотреть, как авторы решили задачу «дать незрячему агенту способ проверять результат». Команды inspect, strip и audio analyze — это готовый паттерн для любого проекта, где агенту нужно оценивать визуальный вывод.

А вот если вам нужен простой редактор видео или разовая анимация без кода, фреймворк, скорее всего, покажется оверкиллом. Он явно не про это.

Начать проще всего с cargo fframes new и одного из примеров, скажем hello-world. А дальше — читать Markdown-гайды из папки skills/fframes-video: они написаны так, что понятны и человеку.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.