
System Szablonów Rendervid - Szablony JSON, Zmienne, Animacje i Przejścia
Kompletny przewodnik po systemie szablonów Rendervid. Dowiedz się, jak tworzyć szablony wideo JSON, używać dynamicznych zmiennych ze składnią {{zmienna}}, konfi...

Wdróż Rendervid wszędzie: renderowanie w przeglądarce do podglądów, Node.js do serwerowego przetwarzania wsadowego lub renderowanie w chmurze na AWS Lambda, Azure Functions, GCP i Dockerze dla 10-50x szybszego renderowania równoległego.
Rendervid został zaprojektowany do renderowania wszędzie tam, gdzie wymaga tego Twój workflow. Niezależnie od tego, czy potrzebujesz natychmiastowych podglądów w przeglądarce, kodowania wideo klasy produkcyjnej na serwerze, czy masowo równoległego renderowania w infrastrukturze chmurowej, Rendervid zapewnia dedykowany pakiet dla każdego środowiska. Każdy cel wdrożenia współdzieli ten sam system szablonów i bibliotekę komponentów , więc szablon działający w przeglądarce działa identycznie na AWS Lambda lub w kontenerze Docker.
Ten przewodnik obejmuje wszystkie cztery środowiska wdrożeniowe, opcje renderowania dostępne w każdym z nich oraz zaawansowane funkcje takie jak rozmycie ruchu, eksport GIF i optymalizacja wydajności. Pod koniec będziesz dokładnie wiedzieć, która ścieżka wdrożenia pasuje do Twojego projektu i jak ją skonfigurować.
+---------------------+
| Szablon JSON |
+----------+----------+
|
+--------------------+--------------------+
| | |
+--------v--------+ +-------v--------+ +-------v---------+
| Przeglądarka | | Node.js | | Chmura |
| @rendervid/ | | @rendervid/ | | @rendervid/ |
| renderer-browser | | renderer-node | | cloud-rendering |
+---------+--------+ +-------+--------+ +-------+---------+
| | |
Canvas / WebM FFmpeg / Playwright Równoległe Workery
| | |
+---------v--------+ +------v---------+ +-------v---------+
| MP4, WebM, PNG, | | MP4, WebM, MOV,| | AWS Lambda |
| JPEG, WebP | | GIF, H.265 | | Azure Functions |
+------------------+ +----------------+ | GCP Functions |
| Docker |
+-----------------+
Pakiet @rendervid/renderer-browser obsługuje renderowanie po stronie klienta całkowicie w przeglądarce użytkownika. Nie jest wymagana żadna infrastruktura serwerowa. To najszybsza ścieżka od szablonu do podglądu.
npm install @rendervid/renderer-browser
Renderowanie w przeglądarce wykorzystuje HTML Canvas API do rysowania każdej klatki szablonu. Renderer przechodzi przez każdą scenę i warstwę, stosuje animacje i funkcje wygładzania, komponuje wynik na elemencie canvas i przechwytuje każdą klatkę. Dla wyjścia wideo klatki są kodowane przy użyciu wbudowanego w przeglądarkę API MediaRecorder (WebM) lub kodera MP4 opartego na WebAssembly.
| Format | Rozszerzenie | Uwagi |
|---|---|---|
| MP4 | .mp4 | H.264 przez koder WebAssembly |
| WebM | .webm | VP8/VP9 przez MediaRecorder API |
| PNG | .png | Pojedyncza klatka lub sekwencja obrazów |
| JPEG | .jpeg | Pojedyncza klatka, konfigurowalna jakość |
| WebP | .webp | Pojedyncza klatka, mniejszy rozmiar pliku |
import { BrowserRenderer } from "@rendervid/renderer-browser";
const renderer = new BrowserRenderer();
const template = {
width: 1920,
height: 1080,
fps: 30,
scenes: [
{
duration: 5,
layers: [
{
type: "text",
text: "Witaj z przeglądarki",
fontSize: 72,
color: "#ffffff",
position: { x: 960, y: 540 },
animation: {
entrance: { type: "fadeIn", duration: 1 },
},
},
],
},
],
};
// Renderuj do elementu canvas dla podglądu
const canvas = document.getElementById("preview") as HTMLCanvasElement;
await renderer.preview(template, canvas);
// Eksportuj jako MP4
const mp4Blob = await renderer.render(template, {
format: "mp4",
quality: "standard",
});
// Eksportuj pojedynczą klatkę jako PNG
const pngBlob = await renderer.renderFrame(template, {
format: "png",
frameNumber: 0,
});
Pakiet @rendervid/renderer-node zapewnia renderowanie po stronie serwera z pełną integracją FFmpeg. Wykorzystuje Playwright lub Puppeteer do renderowania każdej klatki w przeglądarce headless, a następnie przekazuje klatki do FFmpeg w celu profesjonalnego kodowania wideo.
# Zainstaluj renderer
npm install @rendervid/renderer-node
# Zainstaluj Playwright (zawiera pliki binarne przeglądarki)
npx playwright install chromium
# Zainstaluj FFmpeg (wymagane do kodowania wideo)
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# Windows (przez Chocolatey)
choco install ffmpeg
| Format | Rozszerzenie | Kodek | Uwagi |
|---|---|---|---|
| MP4 | .mp4 | H.264 | Uniwersalna kompatybilność |
| MP4 | .mp4 | H.265/HEVC | 50% mniejsze pliki, nowsze urządzenia |
| WebM | .webm | VP8/VP9 | Zoptymalizowane dla sieci |
| MOV | .mov | ProRes | Profesjonalne workflow edycyjne |
| GIF | .gif | Oparte na palecie | Animowane z optymalizacją |
| PNG | .png | Bezstratne | Sekwencja obrazów lub pojedyncza klatka |
| JPEG | .jpeg | Stratne | Konfigurowalna jakość |
| WebP | .webp | Stratne/Bezstratne | Nowoczesny format webowy |
Rendervid zapewnia cztery presety jakości, które kontrolują parametry kodowania:
| Preset | Bitrate | Przypadek użycia |
|---|---|---|
draft | Niski | Szybkie podglądy podczas rozwoju |
standard | Średni | Ogólnego przeznaczenia, dobra jakość/rozmiar |
high | Wysoki | Materiały marketingowe, finalne produkty |
lossless | Maksymalny | Archiwalne, dalsza edycja, bez utraty jakości |
Renderer Node.js obsługuje akcelerację sprzętową, aby przenieść kodowanie na GPU. To znacznie skraca czas renderowania dla złożonych szablonów z wieloma warstwami, wysokimi rozdzielczościami i efektami.
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/video.mp4",
hardwareAcceleration: true,
});
Akceleracja GPU jest dostępna w systemach z kompatybilnym sprzętem NVIDIA (NVENC), AMD (AMF) lub Intel (Quick Sync). FFmpeg musi być skompilowany z obsługą odpowiedniego kodera.
import { NodeRenderer } from "@rendervid/renderer-node";
const renderer = new NodeRenderer();
const template = {
width: 1920,
height: 1080,
fps: 60,
scenes: [
{
duration: 10,
layers: [
{
type: "video",
src: "/assets/background.mp4",
fit: "cover",
},
{
type: "text",
text: "{{headline}}",
fontSize: 64,
color: "#ffffff",
fontFamily: "Inter",
position: { x: 960, y: 540 },
animation: {
entrance: { type: "slideInUp", duration: 0.8 },
exit: { type: "fadeOut", duration: 0.5 },
},
},
],
},
],
inputs: {
headline: {
type: "text",
label: "Nagłówek",
default: "Twój produkt, wyniesiony na wyższy poziom",
},
},
};
// Renderuj z niestandardowymi danymi wejściowymi
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/promo.mp4",
renderWaitTime: 2000, // Czekaj 2s na załadowanie mediów
inputs: {
headline: "Letnia wyprzedaż — 50% zniżki na wszystko",
},
});
console.log(`Wyrenderowano: ${result.outputPath}`);
console.log(`Czas trwania: ${result.duration}s`);
console.log(`Rozmiar pliku: ${(result.fileSize / 1024 / 1024).toFixed(2)} MB`);
Do przetwarzania wielu szablonów w sekwencji użyj API wsadowego:
import { NodeRenderer } from "@rendervid/renderer-node";
const renderer = new NodeRenderer();
const templates = [
{ template: socialTemplate, inputs: { name: "Alicja" }, output: "alicja.mp4" },
{ template: socialTemplate, inputs: { name: "Bob" }, output: "bob.mp4" },
{ template: socialTemplate, inputs: { name: "Karol" }, output: "karol.mp4" },
];
for (const job of templates) {
await renderer.render(job.template, {
format: "mp4",
quality: "standard",
outputPath: `/output/${job.output}`,
inputs: job.inputs,
});
}
Dla prawdziwego równoległego renderowania na pojedynczej maszynie, zobacz sekcję Renderowanie lokalne Docker poniżej.
Pakiet @rendervid/cloud-rendering umożliwia rozproszone, równoległe renderowanie w infrastrukturze chmurowej. Zamiast renderować klatki sekwencyjnie na jednej maszynie, renderowanie w chmurze dzieli pracę na wiele funkcji roboczych, które renderują klatki jednocześnie, a następnie łączy je w końcowe wyjście.
+------------------+
| Twoja aplikacja |
| (Koordynator) |
+--------+---------+
|
| 1. Podziel wideo na fragmenty klatek
v
+--------+---------+
| Dzielnik fragmentów |
+--------+---------+
|
| 2. Dystrybuuj fragmenty do workerów
v
+--------+---+---+---+---+--------+
| Worker 1 | Worker 2 | Worker N |
| (Lambda/ | (Lambda/ | (Lambda/ |
| Azure/ | Azure/ | Azure/ |
| GCP) | GCP) | GCP) |
+-----+------+----+------+----+----+
| | |
| 3. Każdy worker renderuje swoje klatki
v v v
+-----+------+----+------+----+----+
| Klatki | Klatki | Klatki |
| 001-030 | 031-060 | 061-090|
+-----+------+----+------+----+----+
| | |
+------+-----+-----+----+
|
v
+-------+--------+
| Merger |
| (FFmpeg concat) |
+-------+---------+
|
| 4. Połącz w końcowe wideo
v
+-------+---------+
| Magazyn obiektów |
| S3 / Blob / GCS |
+------------------+
|
| 5. Pobierz lub serwuj
v
+-------+---------+
| Końcowe wyjście |
| video.mp4 |
+------------------+
Jak to działa krok po kroku:
import { CloudRenderer } from "@rendervid/cloud-rendering";
const cloudRenderer = new CloudRenderer({
provider: "aws", // "aws" | "azure" | "gcp" | "docker"
quality: "standard", // "draft" | "standard" | "high"
downloadToLocal: true,
outputPath: "/output/final.mp4",
});
Pełny interfejs konfiguracji:
interface CloudRenderConfig {
provider: "aws" | "azure" | "gcp" | "docker";
quality: "draft" | "standard" | "high";
downloadToLocal: boolean;
outputPath: string;
awsConfig?: {
region: string;
s3Bucket: string;
s3Prefix: string;
};
azureConfig?: {
resourceGroup: string;
storageAccount: string;
containerName: string;
};
gcpConfig?: {
projectId: string;
bucketName: string;
region: string;
};
dockerConfig?: {
volumePath: string;
workersCount: number;
};
}
AWS Lambda to najpopularniejszy cel wdrożenia w chmurze. Każda funkcja robocza działa w oddzielnym wywołaniu Lambda, umożliwiając masową równoległość.
Wymagania wstępne:
Konfiguracja:
import { CloudRenderer } from "@rendervid/cloud-rendering";
const renderer = new CloudRenderer({
provider: "aws",
quality: "high",
downloadToLocal: true,
outputPath: "/output/video.mp4",
awsConfig: {
region: "us-east-1",
s3Bucket: "my-rendervid-output",
s3Prefix: "renders/",
},
});
const result = await renderer.render(template);
console.log(`Wyrenderowano w ${result.renderTime}ms`);
console.log(`Użyto workerów: ${result.workersUsed}`);
console.log(`Wyjście: ${result.outputUrl}`);
Typowa konfiguracja AWS Lambda:
const renderer = new CloudRenderer({
provider: "azure",
quality: "standard",
downloadToLocal: true,
outputPath: "/output/video.mp4",
azureConfig: {
resourceGroup: "rendervid-rg",
storageAccount: "rendervidstore",
containerName: "renders",
},
});
const result = await renderer.render(template);
const renderer = new CloudRenderer({
provider: "gcp",
quality: "standard",
downloadToLocal: true,
outputPath: "/output/video.mp4",
gcpConfig: {
projectId: "my-project-id",
bucketName: "rendervid-output",
region: "us-central1",
},
});
const result = await renderer.render(template);
| Dostawca | Koszt za minutę | Koszt za godzinę | Uwagi |
|---|---|---|---|
| AWS Lambda | ~$0.02 | ~$1.00 | Płać za 1ms obliczeń |
| Azure Functions | ~$0.02 | ~$1.00 | Cennik planu konsumpcyjnego |
| Google Cloud Functions | ~$0.02 | ~$1.00 | Płać za 100ms obliczeń |
| Docker (lokalny) | Bezpłatnie | Bezpłatnie | Używa własnego sprzętu |
Wszyscy dostawcy chmury oferują bezpłatne poziomy, które pokrywają znaczące obciążenia renderowania podczas rozwoju i produkcji o niskim wolumenie.
Renderowanie w chmurze osiąga przyspieszenie 10-50x w porównaniu do sekwencyjnego renderowania na pojedynczej maszynie. Dokładne przyspieszenie zależy od liczby workerów, złożoności szablonu i czasu trwania wideo.
| Czas trwania wideo | Sekwencyjnie (1 maszyna) | Chmura (50 workerów) | Przyspieszenie |
|---|---|---|---|
| 30 sekund | ~90 sekund | ~5 sekund | 18x |
| 2 minuty | ~6 minut | ~15 sekund | 24x |
| 10 minut | ~30 minut | ~45 sekund | 40x |
| 30 minut | ~90 minut | ~2 minuty | 45x |
Dłuższe filmy bardziej korzystają z równoległości, ponieważ narzut uruchamiania workerów i łączenia klatek jest amortyzowany na większej liczbie klatek.
Renderowanie oparte na Dockerze daje tę samą architekturę renderowania równoległego co renderowanie w chmurze, ale działa całkowicie na lokalnej maszynie. Jest całkowicie bezpłatne, nie wymaga kont w chmurze i jest idealne dla konfiguracji self-hosted, rozwoju i zespołów, które chcą renderowania równoległego bez kosztów chmury.
# Upewnij się, że Docker jest zainstalowany i uruchomiony
docker --version
# Zainstaluj pakiet renderowania w chmurze
npm install @rendervid/cloud-rendering
import { CloudRenderer } from "@rendervid/cloud-rendering";
const renderer = new CloudRenderer({
provider: "docker",
quality: "high",
downloadToLocal: true,
outputPath: "/output/video.mp4",
dockerConfig: {
volumePath: "/tmp/rendervid-work",
workersCount: 8, // Liczba kontenerów Docker do uruchomienia równolegle
},
});
const result = await renderer.render(template);
console.log(`Wyrenderowano w ${result.renderTime}ms używając ${result.workersUsed} workerów`);
Wybór workersCount: Ustaw to na liczbę rdzeni CPU dostępnych na Twojej maszynie. Na przykład maszyna z 8 rdzeniami dobrze działa z 8 workerami. Przekroczenie liczby rdzeni dodaje narzut z przełączania kontekstu bez poprawy przepustowości.
+------------------+
| Koordynator |
| (twój proces) |
+--------+---------+
|
+-----+-----+-----+-----+
| | | | |
+--v--+ +--v-+ +-v--+ +-v--+
| C1 | | C2 | | C3 | | C4 | ... kontenery Docker
+--+--+ +--+-+ +-+--+ +-+--+
| | | |
v v v v
+--+------+-----+------+--+
| Współdzielony wolumen |
| /tmp/rendervid-work |
+-------------+-------------+
|
v
+-------+--------+
| Merger |
+-------+---------+
|
v
+-------+---------+
| /output/video |
+-----------------+
Każdy kontener Docker to samodzielny worker z preinstalowanym Node.js, Playwright i FFmpeg. Workery odczytują swoje przypisania klatek ze współdzielonego wolumenu, renderują klatki i zapisują wyniki z powrotem. Koordynator następnie łączy wszystkie segmenty w końcowe wyjście.
Rendervid obsługuje rozmycie ruchu poprzez temporalne supersampleowanie. Zamiast renderować pojedynczy moment na klatkę, renderer przechwytuje wiele pod-klatek w nieznacznie różnych punktach czasowych i miesza je razem. To tworzy naturalne rozmycie, które kamery tworzą, gdy obiekty poruszają się podczas naświetlania.
| Preset | Próbek na klatkę | Mnożnik czasu renderowania | Jakość wizualna |
|---|---|---|---|
low | 5 | 5x | Subtelne wygładzanie |
medium | 10 | 10x | Zauważalne rozmycie przy szybkim ruchu |
high | 16 | 16x | Kinematograficzne rozmycie ruchu |
ultra | 32 | 32x | Filmowe, silne rozmycie |
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/cinematic.mp4",
motionBlur: {
enabled: true,
quality: "high", // 16 próbek na klatkę
},
});
Klatka N (bez rozmycia ruchu): Klatka N (z rozmyciem ruchu, 5 próbek):
Pojedynczy moment: 5 pod-klatek zmieszanych:
+--------+ +--------+ +--------+ +--------+
| O | | O | + | O | + | O | ...
+--------+ +--------+ +--------+ +--------+
|
v
+--------+
| ~O~ | <- Zmieszany wynik
+--------+
Każda pod-klatka przesuwa oś czasu animacji o mały przyrost (1/fps podzielone przez liczbę próbek). Pod-klatki są następnie mieszane z alfa-blendingiem, aby utworzyć końcową klatkę. Obiekty, które poruszyły się między pod-klatkami, wyglądają rozmyte wzdłuż ścieżki ruchu, podczas gdy elementy nieruchome pozostają ostre.
Rozmycie ruchu mnoży czas renderowania proporcjonalnie do liczby próbek. 10-sekundowe wideo przy 30fps ma 300 klatek. Przy jakości high (16 próbek) renderer musi wygenerować 4800 pod-klatek zamiast 300. Używaj jakości draft podczas rozwoju i przełączaj na high lub ultra tylko dla końcowych eksportów.
Renderowanie w chmurze i równoległe renderowanie Docker dobrze współpracują z rozmyciem ruchu, ponieważ koszt na klatkę jest rozłożony na workery. 16x wzrost na klatkę podzielony na 16 workerów skutkuje mniej więcej takim samym całkowitym czasem renderowania jak render bez rozmycia na jednej maszynie.
Eksport GIF w Rendervid wykracza daleko poza prostą konwersję klatka-do-GIF. Wykorzystuje pipeline generowania palety FFmpeg do tworzenia zoptymalizowanych, wysokiej jakości animowanych GIF-ów z konfigurowalnym ditheringiem, liczbą kolorów i ograniczeniami rozmiaru pliku.
Standardowe kodowanie GIF używa pojedynczej globalnej palety 256 kolorów, co często skutkuje pasmowaniem i słabą reprodukcją kolorów. Rendervid wykorzystuje podejście dwuprzebiegowe:
| Preset | Rozdzielczość | Maks. kolorów | Docelowy przypadek użycia |
|---|---|---|---|
social | 480x480 | 256 | Instagram, Twitter, Slack |
web | 640x480 | 256 | Posty blogowe, dokumentacja |
email | 320x240 | 128 | Kampanie emailowe, newslettery |
| Algorytm | Jakość | Rozmiar pliku | Opis |
|---|---|---|---|
floyd_steinberg | Najlepsza | Największy | Dithering z dyfuzją błędu, gładkie gradienty |
bayer | Dobra | Średni | Uporządkowany dithering, spójny wzór |
none | Najniższa | Najmniejszy | Bez ditheringu, płaskie obszary kolorów |
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/animation.gif",
gif: {
preset: "social", // rozdzielczość 480x480
colors: 256, // paleta 2-256 kolorów
dithering: "floyd_steinberg",
targetSizeKB: 5000, // Auto-optymalizuj, aby pozostać poniżej 5MB
fps: 15, // Niższe FPS = mniejszy plik
},
});
console.log(`Rozmiar GIF: ${(result.fileSize / 1024).toFixed(0)} KB`);
console.log(`Szacowany rozmiar wynosił: ${result.estimatedSizeKB} KB`);
Gdy ustawisz targetSizeKB, Rendervid szacuje rozmiar pliku wyjściowego przed renderowaniem i automatycznie dostosowuje parametry (liczba kolorów, rozdzielczość, FPS), aby osiągnąć cel. Jest to szczególnie przydatne dla platform z limitami rozmiaru pliku (np. limit 50 MB Slacka, typowe ograniczenie 10 MB dla emaili).
// Auto-optymalizuj, aby zmieścić się w ograniczeniu 2MB dla emaila
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/email-banner.gif",
gif: {
preset: "email",
targetSizeKB: 2000,
},
});
Rendervid jest zorganizowany jako monorepo z 13 pakietami. Każdy pakiet ma skoncentrowaną odpowiedzialność i komponują się razem, aby obsługiwać każdy scenariusz wdrożenia.
@rendervid/
├── core Silnik, typy, walidacja, system animacji
│ ├── Parser i walidator szablonów (AJV + JSON Schema)
│ ├── Silnik animacji (40+ presetów, 30+ funkcji wygładzania)
│ ├── System warstw (text, image, video, shape, audio, group, lottie, custom)
│ └── Zarządzanie scenami i przejściami (17 typów)
│
├── renderer-browser Renderowanie po stronie klienta
│ ├── Renderowanie klatek oparte na Canvas
│ ├── MediaRecorder dla eksportu WebM
│ └── Koder MP4 WebAssembly
│
├── renderer-node Renderowanie po stronie serwera
│ ├── Przeglądarka headless Playwright/Puppeteer
│ ├── Integracja FFmpeg (fluent-ffmpeg)
│ ├── Akceleracja GPU
│ └── Pipeline optymalizacji GIF
│
├── cloud-rendering Orkiestracja multi-cloud
│ ├── Dostawca AWS Lambda
│ ├── Dostawca Azure Functions
│ ├── Dostawca Google Cloud Functions
│ ├── Dostawca lokalny Docker
│ ├── Dzielnik fragmentów i merger
│ └── Adaptery magazynu obiektów (S3, Blob, GCS)
│
├── player Komponent odtwarzacza wideo/szablonu
├── editor Wizualny edytor szablonów (stan Zustand)
├── components Wbudowane komponenty React
│ ├── AnimatedLineChart
│ ├── AuroraBackground
│ ├── WaveBackground
│ ├── SceneTransition
│ └── TypewriterEffect
│
├── templates Definicje szablonów i przykłady (100+)
├── testing Narzędzia testowe
│ ├── Niestandardowe matchery Vitest
│ ├── Helpery testów snapshot
│ └── Narzędzia regresji wizualnej
│
├── editor-playground Środowisko rozwojowe edytora
├── player-playground Środowisko rozwojowe odtwarzacza
├── mcp Serwer Model Context Protocol
└── docs Strona dokumentacji VitePress
renderer-node i dystrybuuje jego pracę na funkcje chmurowe lub kontenery Docker.Rendervid jest zbudowany na nowoczesnym stosie TypeScript wybranym dla niezawodności, wydajności i doświadczenia programisty.
| Warstwa | Technologia | Cel |
|---|---|---|
| Język | TypeScript | Bezpieczeństwo typów we wszystkich 13 pakietach |
| Build | tsup, Vite | Szybkie buildy, tree-shaking, wyjście ESM/CJS |
| Testowanie | Vitest | Testy jednostkowe, testy snapshot, niestandardowe matchery |
| Framework UI | React 18.3.1 | Renderowanie komponentów, kompozycja szablonów |
| Zarządzanie stanem | Zustand | Stan edytora (lekki, bez boilerplate) |
| Stylizacja | Tailwind CSS | UI edytora i odtwarzacza |
| Walidacja | AJV z JSON Schema | Walidacja szablonów przed renderowaniem |
| Renderowanie w przeglądarce | HTML Canvas API | Rysowanie klatka po klatce w przeglądarce |
| Przeglądarka headless | Playwright, Puppeteer | Przechwytywanie klatek po stronie serwera |
| Kodowanie wideo | FFmpeg (fluent-ffmpeg) | Kodowanie H.264, H.265, VP9, ProRes, GIF |
| Grafika 3D | Three.js (opcjonalnie), CSS 3D | Sceny 3D i transformacje perspektywiczne |
| Dokumentacja | VitePress | Strona dokumentacji pakietu |
Rendervid zawiera dedykowany pakiet testowy (@rendervid/testing), który zapewnia niestandardowe matchery Vitest, helpery testów snapshot i narzędzia regresji wizualnej do walidacji szablonów.
import { describe, it, expect } from "vitest";
import "@rendervid/testing/matchers";
describe("Szablon prezentacji produktu", () => {
it("powinien być prawidłowym szablonem", () => {
expect(template).toBeValidTemplate();
});
it("powinien mieć prawidłowe wymiary", () => {
expect(template).toHaveResolution(1920, 1080);
});
it("powinien zawierać przynajmniej jedną warstwę tekstową", () => {
expect(template).toContainLayerOfType("text");
});
it("powinien mieć animacje na nagłówku", () => {
expect(template.scenes[0].layers[0]).toHaveAnimation("entrance");
});
});
Testowanie snapshot renderuje szablon do obrazu i porównuje go z przechowywaną referencją. Każda zmiana wizualna powoduje niepowodzenie testu, co ułatwia wychwytywanie niezamierzonych regresji.
import { describe, it } from "vitest";
import { renderSnapshot } from "@rendervid/testing";
describe("Regresja wizualna szablonu", () => {
it("powinien pasować do referencyjnego snapshota w klatce 0", async () => {
const snapshot = await renderSnapshot(template, { frame: 0 });
expect(snapshot).toMatchImageSnapshot();
});
it("powinien pasować do referencyjnego snapshota w połowie", async () => {
const totalFrames = template.fps * template.scenes[0].duration;
const snapshot = await renderSnapshot(template, {
frame: Math.floor(totalFrames / 2),
});
expect(snapshot).toMatchImageSnapshot();
});
});
Zintegruj testy regresji wizualnej w swoim pipeline CI/CD, aby wychwycić zmiany renderowania przed wejściem do produkcji:
# .github/workflows/visual-regression.yml
name: Testy regresji wizualnej
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npx playwright install chromium
- run: npm ci
- run: npm run test:visual
Uzyskanie jak najszybszych czasów renderowania wymaga zrozumienia, gdzie spędzany jest czas i jakie dźwignie można pociągnąć. Oto najbardziej wpływowe strategie optymalizacji.
| Scenariusz | Najlepszy cel |
|---|---|
| Szybki podgląd podczas edycji | Przeglądarka |
| Pojedyncze wideo, jakość produkcyjna | Node.js |
| Partia 10-100 filmów | Node.js lub Docker |
| Partia 100+ filmów lub czasochłonne | Chmura (AWS/Azure/GCP) |
draft podczas rozwoju i testowania. Przełącz na high lub lossless tylko dla końcowych eksportów.renderWaitTimeOpcja renderWaitTime wstrzymuje renderowanie, aby umożliwić załadowanie zewnętrznych mediów (obrazy, filmy, czcionki). Ustaw to na minimalną wartość, która zapewnia załadowanie wszystkich zasobów. Wartość 500-2000ms jest typowa. Ustawienie zbyt wysokiej wartości marnuje czas na każdej klatce.
await renderer.render(template, {
renderWaitTime: 1000, // 1 sekunda jest zwykle wystarczająca
});
Dla każdego wideo dłuższego niż 10 sekund renderowanie równoległe (Docker lub chmura) będzie szybsze niż renderowanie sekwencyjne. Punkt równowagi zależy od Twojego sprzętu i konfiguracji chmury, ale jako ogólna zasada:
GIF-y są z natury duże. Aby utrzymać rozmiary plików w rozsądnych granicach:
social, web, email).targetSizeKB, aby pozwolić Rendervid auto-optymalizować parametry.none), jeśli rozmiar pliku ma większe znaczenie niż jakość gradientu.Na maszynach z kompatybilnymi GPU kodowanie z akceleracją sprzętową może zmniejszyć czasy renderowania o 2-5x dla kroku kodowania. Jest to najbardziej wpływowe dla wysokich rozdzielczości (4K+) i wyjść o wysokim bitrate.
Jeśli Twój szablon odwołuje się do zewnętrznych obrazów lub filmów, pobierz je wcześniej do lokalnego magazynu przed renderowaniem. Opóźnienie sieci podczas renderowania jest najczęstszą przyczyną wolnych lub nieudanych renderów.
Rendervid obsługuje cztery opcje wdrożenia: renderowanie w przeglądarce dla podglądów po stronie klienta i aplikacji webowych, renderowanie Node.js dla serwerowego przetwarzania wsadowego z FFmpeg, renderowanie w chmurze na AWS Lambda/Azure Functions/GCP dla 10-50x przyspieszenia równoległego oraz Docker dla bezpłatnego lokalnego renderowania równoległego.
Renderowanie w chmurze kosztuje około $0.02 za minutę na AWS Lambda, Azure Functions lub Google Cloud Functions—w przybliżeniu $1 za godzinę renderowania. Lokalne renderowanie oparte na Dockerze jest całkowicie bezpłatne i zapewnia te same korzyści z renderowania równoległego.
Renderowanie w chmurze wykorzystuje koordynatora, który dzieli filmy na fragmenty klatek, dystrybuuje je do funkcji roboczych (Lambda/Azure/GCP), każdy worker renderuje przypisane klatki, merger łączy wszystkie klatki w końcowe wideo, a wynik jest przechowywany w magazynie obiektów (S3/Azure Blob/GCS).
Do renderowania w przeglądarce wystarczy każda nowoczesna przeglądarka z obsługą Canvas. Do renderowania Node.js potrzebujesz Node.js 18+, Playwright lub Puppeteer oraz zainstalowanego FFmpeg. Do renderowania w chmurze potrzebujesz konta AWS/Azure/GCP lub lokalnie zainstalowanego Dockera.
Tak, renderer Node.js obsługuje akcelerację sprzętową dla szybszego renderowania. Akceleracja GPU może znacznie przyspieszyć renderowanie, szczególnie dla złożonych szablonów z wieloma warstwami, efektami i wysokimi rozdzielczościami.
Rendervid implementuje rozmycie ruchu za pomocą temporalnego supersampleowania, renderując wiele pod-klatek na klatki wyjściowe i mieszając je razem. Presety jakości wahają się od niskiego (5 próbek, 5x czas renderowania) do ultra (32 próbki, 32x czas renderowania), tworząc kinematograficzną płynność.
Pomagamy firmom takim jak Twoja rozwijać inteligentne chatboty, serwery MCP, narzędzia AI lub inne rodzaje automatyzacji AI, aby zastąpić człowieka w powtarzalnych zadaniach w Twojej organizacji.

Kompletny przewodnik po systemie szablonów Rendervid. Dowiedz się, jak tworzyć szablony wideo JSON, używać dynamicznych zmiennych ze składnią {{zmienna}}, konfi...

Poznaj wszystkie komponenty Rendervid: 8 wbudowanych typów warstw (tekst, obraz, wideo, kształt, dźwięk, grupa, lottie, niestandardowy), gotowe komponenty React...

Poznaj Rendervid, darmową alternatywę open-source dla Remotion do programowego generowania wideo. Projekt zorientowany na AI z integracją MCP, szablonami JSON, ...