
Hệ thống Template Rendervid - Template JSON, Biến, Hoạt ảnh & Chuyển cảnh
Hướng dẫn đầy đủ về hệ thống template Rendervid. Học cách tạo template video JSON, sử dụng biến động với cú pháp {{variable}}, cấu hình hơn 40 preset hoạt ảnh, ...

Triển khai Rendervid ở bất kỳ đâu: render trên trình duyệt cho xem trước, Node.js cho xử lý hàng loạt phía máy chủ, hoặc render trên cloud với AWS Lambda, Azure Functions, GCP, và Docker để render song song nhanh hơn 10-50 lần.
Rendervid được thiết kế để render ở bất kỳ đâu mà quy trình làm việc của bạn yêu cầu. Cho dù bạn cần xem trước ngay lập tức trên trình duyệt, mã hóa video chất lượng sản xuất trên máy chủ, hoặc render song song quy mô lớn trên hạ tầng cloud, Rendervid cung cấp một package chuyên dụng cho từng môi trường. Mọi mục tiêu triển khai đều chia sẻ cùng hệ thống template và thư viện component , do đó một template hoạt động trên trình duyệt sẽ hoạt động tương tự trên AWS Lambda hoặc trong Docker container.
Hướng dẫn này bao gồm tất cả bốn môi trường triển khai, các tùy chọn render có sẵn trong mỗi môi trường, và các tính năng nâng cao như motion blur, xuất GIF, và tối ưu hóa hiệu suất. Khi kết thúc, bạn sẽ biết chính xác đường triển khai nào phù hợp với dự án của bạn và cách cấu hình nó.
+---------------------+
| JSON Template |
+----------+----------+
|
+--------------------+--------------------+
| | |
+--------v--------+ +-------v--------+ +-------v---------+
| Browser | | Node.js | | Cloud |
| @rendervid/ | | @rendervid/ | | @rendervid/ |
| renderer-browser | | renderer-node | | cloud-rendering |
+---------+--------+ +-------+--------+ +-------+---------+
| | |
Canvas / WebM FFmpeg / Playwright Parallel Workers
| | |
+---------v--------+ +------v---------+ +-------v---------+
| MP4, WebM, PNG, | | MP4, WebM, MOV,| | AWS Lambda |
| JPEG, WebP | | GIF, H.265 | | Azure Functions |
+------------------+ +----------------+ | GCP Functions |
| Docker |
+-----------------+
Package @rendervid/renderer-browser xử lý render phía client hoàn toàn trong trình duyệt của người dùng. Không cần hạ tầng máy chủ. Điều này làm cho nó trở thành con đường nhanh nhất từ template đến xem trước.
npm install @rendervid/renderer-browser
Render trên trình duyệt sử dụng HTML Canvas API để vẽ từng khung hình của template. Renderer duyệt qua mọi scene và layer, áp dụng animation và easing function, tổng hợp kết quả lên canvas element, và chụp từng khung hình. Đối với đầu ra video, các khung hình được mã hóa bằng MediaRecorder API tích hợp sẵn của trình duyệt (WebM) hoặc bộ mã hóa MP4 dựa trên WebAssembly.
| Định dạng | Phần mở rộng | Ghi chú |
|---|---|---|
| MP4 | .mp4 | H.264 qua bộ mã hóa WebAssembly |
| WebM | .webm | VP8/VP9 qua MediaRecorder API |
| PNG | .png | Khung hình đơn hoặc chuỗi hình ảnh |
| JPEG | .jpeg | Khung hình đơn, chất lượng có thể cấu hình |
| WebP | .webp | Khung hình đơn, kích thước file nhỏ hơn |
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: "Hello from the Browser",
fontSize: 72,
color: "#ffffff",
position: { x: 960, y: 540 },
animation: {
entrance: { type: "fadeIn", duration: 1 },
},
},
],
},
],
};
// Render lên canvas element để xem trước
const canvas = document.getElementById("preview") as HTMLCanvasElement;
await renderer.preview(template, canvas);
// Xuất dưới dạng MP4
const mp4Blob = await renderer.render(template, {
format: "mp4",
quality: "standard",
});
// Xuất một khung hình đơn dưới dạng PNG
const pngBlob = await renderer.renderFrame(template, {
format: "png",
frameNumber: 0,
});
Package @rendervid/renderer-node cung cấp render phía máy chủ với tích hợp FFmpeg đầy đủ. Nó sử dụng Playwright hoặc Puppeteer để render từng khung hình trong trình duyệt headless, sau đó chuyển các khung hình đến FFmpeg để mã hóa video chất lượng chuyên nghiệp.
# Cài đặt renderer
npm install @rendervid/renderer-node
# Cài đặt Playwright (bao gồm các binary trình duyệt)
npx playwright install chromium
# Cài đặt FFmpeg (bắt buộc cho mã hóa video)
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt-get install ffmpeg
# Windows (qua Chocolatey)
choco install ffmpeg
| Định dạng | Phần mở rộng | Codec | Ghi chú |
|---|---|---|---|
| MP4 | .mp4 | H.264 | Tương thích phổ biến |
| MP4 | .mp4 | H.265/HEVC | File nhỏ hơn 50%, thiết bị mới hơn |
| WebM | .webm | VP8/VP9 | Tối ưu cho web |
| MOV | .mov | ProRes | Quy trình chỉnh sửa chuyên nghiệp |
| GIF | .gif | Dựa trên bảng màu | Hoạt hình với tối ưu hóa |
| PNG | .png | Không mất dữ liệu | Chuỗi hình ảnh hoặc khung hình đơn |
| JPEG | .jpeg | Mất dữ liệu | Chất lượng có thể cấu hình |
| WebP | .webp | Mất dữ liệu/Không mất dữ liệu | Định dạng web hiện đại |
Rendervid cung cấp bốn preset chất lượng kiểm soát các tham số mã hóa:
| Preset | Bitrate | Trường hợp sử dụng |
|---|---|---|
draft | Thấp | Xem trước nhanh trong quá trình phát triển |
standard | Trung bình | Đầu ra đa mục đích, chất lượng/kích thước tốt |
high | Cao | Tài liệu marketing, sản phẩm cuối cùng |
lossless | Tối đa | Lưu trữ, chỉnh sửa thêm, không mất chất lượng |
Renderer Node.js hỗ trợ tăng tốc phần cứng để giảm tải mã hóa cho GPU. Điều này giảm đáng kể thời gian render cho các template phức tạp với nhiều lớp, độ phân giải cao và hiệu ứng.
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/video.mp4",
hardwareAcceleration: true,
});
Tăng tốc GPU có sẵn trên các hệ thống với phần cứng NVIDIA (NVENC), AMD (AMF), hoặc Intel (Quick Sync) tương thích. FFmpeg phải được biên dịch với hỗ trợ bộ mã hóa tương ứng.
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: "Headline",
default: "Your Product, Elevated",
},
},
};
// Render với input tùy chỉnh
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/promo.mp4",
renderWaitTime: 2000, // Đợi 2s để media tải
inputs: {
headline: "Summer Sale — 50% Off Everything",
},
});
console.log(`Đã render: ${result.outputPath}`);
console.log(`Thời lượng: ${result.duration}s`);
console.log(`Kích thước file: ${(result.fileSize / 1024 / 1024).toFixed(2)} MB`);
Để xử lý nhiều template theo trình tự, sử dụng batch API:
import { NodeRenderer } from "@rendervid/renderer-node";
const renderer = new NodeRenderer();
const templates = [
{ template: socialTemplate, inputs: { name: "Alice" }, output: "alice.mp4" },
{ template: socialTemplate, inputs: { name: "Bob" }, output: "bob.mp4" },
{ template: socialTemplate, inputs: { name: "Carol" }, output: "carol.mp4" },
];
for (const job of templates) {
await renderer.render(job.template, {
format: "mp4",
quality: "standard",
outputPath: `/output/${job.output}`,
inputs: job.inputs,
});
}
Để render song song thực sự trên một máy đơn, xem phần Render cục bộ Docker bên dưới.
Package @rendervid/cloud-rendering cho phép render phân tán, song song trên hạ tầng cloud. Thay vì render các khung hình tuần tự trên một máy, render trên cloud chia công việc cho nhiều worker function render các khung hình đồng thời, sau đó hợp nhất chúng thành đầu ra cuối cùng.
+------------------+
| Your App |
| (Coordinator) |
+--------+---------+
|
| 1. Chia video thành các khối khung hình
v
+--------+---------+
| Chunk Splitter |
+--------+---------+
|
| 2. Phân phối các khối cho worker
v
+--------+---+---+---+---+--------+
| Worker 1 | Worker 2 | Worker N |
| (Lambda/ | (Lambda/ | (Lambda/ |
| Azure/ | Azure/ | Azure/ |
| GCP) | GCP) | GCP) |
+-----+------+----+------+----+----+
| | |
| 3. Mỗi worker render các khung hình của nó
v v v
+-----+------+----+------+----+----+
| Frames | Frames | Frames |
| 001-030 | 031-060 | 061-090|
+-----+------+----+------+----+----+
| | |
+------+-----+-----+----+
|
v
+-------+--------+
| Merger |
| (FFmpeg concat) |
+-------+---------+
|
| 4. Kết hợp thành video cuối cùng
v
+-------+---------+
| Object Storage |
| S3 / Blob / GCS |
+------------------+
|
| 5. Tải xuống hoặc phục vụ
v
+-------+---------+
| Final Output |
| video.mp4 |
+------------------+
Cách hoạt động từng bước:
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",
});
Interface cấu hình đầy đủ:
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 là mục tiêu triển khai cloud phổ biến nhất. Mỗi worker function chạy trong một Lambda invocation riêng biệt, cho phép song song hóa quy mô lớn.
Yêu cầu trước:
Cấu hình:
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(`Đã render trong ${result.renderTime}ms`);
console.log(`Worker đã sử dụng: ${result.workersUsed}`);
console.log(`Đầu ra: ${result.outputUrl}`);
Cấu hình AWS Lambda điển hình:
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);
| Nhà cung cấp | Chi phí mỗi Phút | Chi phí mỗi Giờ | Ghi chú |
|---|---|---|---|
| AWS Lambda | ~$0.02 | ~$1.00 | Trả tiền theo 1ms tính toán |
| Azure Functions | ~$0.02 | ~$1.00 | Giá gói tiêu thụ |
| Google Cloud Functions | ~$0.02 | ~$1.00 | Trả tiền theo 100ms tính toán |
| Docker (cục bộ) | Miễn phí | Miễn phí | Sử dụng phần cứng của bạn |
Tất cả các nhà cung cấp cloud đều cung cấp các gói miễn phí bao gồm khối lượng công việc render đáng kể trong quá trình phát triển và sản xuất khối lượng thấp.
Render trên cloud đạt được tăng tốc 10-50 lần so với render tuần tự trên một máy đơn. Mức tăng tốc chính xác phụ thuộc vào số lượng worker, độ phức tạp của template và thời lượng video.
| Thời lượng Video | Tuần tự (1 máy) | Cloud (50 worker) | Tăng tốc |
|---|---|---|---|
| 30 giây | ~90 giây | ~5 giây | 18x |
| 2 phút | ~6 phút | ~15 giây | 24x |
| 10 phút | ~30 phút | ~45 giây | 40x |
| 30 phút | ~90 phút | ~2 phút | 45x |
Video dài hơn hưởng lợi nhiều hơn từ song song hóa vì chi phí khởi động worker và hợp nhất khung hình được phân bổ trên nhiều khung hình hơn.
Render dựa trên Docker cung cấp cho bạn cùng kiến trúc render song song như render trên cloud, nhưng chạy hoàn toàn trên máy cục bộ của bạn. Nó hoàn toàn miễn phí, không sử dụng tài khoản cloud, và lý tưởng cho các thiết lập tự lưu trữ, phát triển, và các nhóm muốn render song song mà không có chi phí cloud.
# Đảm bảo Docker đã cài đặt và đang chạy
docker --version
# Cài đặt package cloud rendering
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, // Số lượng Docker container chạy song song
},
});
const result = await renderer.render(template);
console.log(`Đã render trong ${result.renderTime}ms sử dụng ${result.workersUsed} worker`);
Chọn workersCount: Đặt giá trị này bằng số lượng lõi CPU có sẵn trên máy của bạn. Ví dụ, một máy 8 lõi hoạt động tốt với 8 worker. Vượt quá số lượng lõi của bạn sẽ thêm chi phí từ chuyển đổi ngữ cảnh mà không cải thiện thông lượng.
+------------------+
| Coordinator |
| (your process) |
+--------+---------+
|
+-----+-----+-----+-----+
| | | | |
+--v--+ +--v-+ +-v--+ +-v--+
| C1 | | C2 | | C3 | | C4 | ... Docker containers
+--+--+ +--+-+ +-+--+ +-+--+
| | | |
v v v v
+--+------+-----+------+--+
| Shared Volume |
| /tmp/rendervid-work |
+-------------+-------------+
|
v
+-------+--------+
| Merger |
+-------+---------+
|
v
+-------+---------+
| /output/video |
+-----------------+
Mỗi Docker container là một worker độc lập với Node.js, Playwright, và FFmpeg được cài đặt sẵn. Worker đọc các nhiệm vụ khung hình của họ từ volume dùng chung, render các khung hình, và ghi kết quả trở lại. Coordinator sau đó hợp nhất tất cả các đoạn thành đầu ra cuối cùng.
Rendervid hỗ trợ motion blur thông qua temporal supersampling. Thay vì render một khoảnh khắc đơn cho mỗi khung hình, renderer chụp nhiều sub-frame tại các điểm thời gian hơi khác nhau và pha trộn chúng lại với nhau. Điều này tạo ra hiệu ứng mờ tự nhiên mà máy ảnh tạo ra khi các đối tượng di chuyển trong quá trình phơi sáng.
| Preset | Mẫu mỗi Khung hình | Hệ số Nhân Thời gian Render | Chất lượng Hình ảnh |
|---|---|---|---|
low | 5 | 5x | Làm mịn tinh tế |
medium | 10 | 10x | Mờ đáng chú ý trên chuyển động nhanh |
high | 16 | 16x | Motion blur điện ảnh |
ultra | 32 | 32x | Chất lượng phim, mờ nặng |
const result = await renderer.render(template, {
format: "mp4",
quality: "high",
outputPath: "/output/cinematic.mp4",
motionBlur: {
enabled: true,
quality: "high", // 16 mẫu mỗi khung hình
},
});
Khung hình N (không có motion blur): Khung hình N (có motion blur, 5 mẫu):
Khoảnh khắc đơn: 5 sub-frame được pha trộn:
+--------+ +--------+ +--------+ +--------+
| O | | O | + | O | + | O | ...
+--------+ +--------+ +--------+ +--------+
|
v
+--------+
| ~O~ | <- Kết quả đã pha trộn
+--------+
Mỗi sub-frame tiến timeline animation một khoảng nhỏ (1/fps chia cho số lượng mẫu). Các sub-frame sau đó được alpha-blend để tạo ra khung hình cuối cùng. Các đối tượng di chuyển giữa các sub-frame xuất hiện mờ dọc theo đường đi chuyển động của chúng, trong khi các phần tử tĩnh vẫn sắc nét.
Motion blur nhân thời gian render tỷ lệ thuận với số lượng mẫu. Một video 10 giây ở 30fps có 300 khung hình. Với chất lượng high (16 mẫu), renderer phải tạo 4,800 sub-frame thay vì 300. Sử dụng chất lượng draft trong quá trình phát triển và chuyển sang high hoặc ultra chỉ cho xuất cuối cùng.
Render trên cloud và render song song Docker hoạt động tốt với motion blur vì chi phí mỗi khung hình được phân phối trên các worker. Tăng 16 lần mỗi khung hình chia cho 16 worker dẫn đến tổng thời gian render xấp xỉ như render không có blur trên một máy.
Xuất GIF của Rendervid vượt xa việc chuyển đổi khung hình thành GIF đơn giản. Nó sử dụng quy trình tạo bảng màu của FFmpeg để tạo ra GIF hoạt hình được tối ưu hóa, chất lượng cao với dithering, số lượng màu và ràng buộc kích thước file có thể cấu hình.
Mã hóa GIF tiêu chuẩn sử dụng một bảng màu toàn cục đơn của 256 màu, thường dẫn đến banding và tái tạo màu kém. Rendervid sử dụng phương pháp hai lượt:
| Preset | Độ phân giải | Màu tối đa | Trường hợp sử dụng mục tiêu |
|---|---|---|---|
social | 480x480 | 256 | Instagram, Twitter, Slack |
web | 640x480 | 256 | Bài đăng blog, tài liệu |
email | 320x240 | 128 | Chiến dịch email, bản tin |
| Thuật toán | Chất lượng | Kích thước File | Mô tả |
|---|---|---|---|
floyd_steinberg | Tốt nhất | Lớn nhất | Error-diffusion dithering, gradient mượt mà |
bayer | Tốt | Trung bình | Ordered dithering, mẫu nhất quán |
none | Thấp nhất | Nhỏ nhất | Không dithering, vùng màu phẳng |
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/animation.gif",
gif: {
preset: "social", // Độ phân giải 480x480
colors: 256, // Bảng màu 2-256
dithering: "floyd_steinberg",
targetSizeKB: 5000, // Tự động tối ưu hóa để giữ dưới 5MB
fps: 15, // FPS thấp hơn = file nhỏ hơn
},
});
console.log(`Kích thước GIF: ${(result.fileSize / 1024).toFixed(0)} KB`);
console.log(`Kích thước ước tính là: ${result.estimatedSizeKB} KB`);
Khi bạn đặt targetSizeKB, Rendervid ước tính kích thước file đầu ra trước khi render và tự động điều chỉnh các tham số (số lượng màu, độ phân giải, FPS) để đáp ứng mục tiêu. Điều này đặc biệt hữu ích cho các nền tảng có giới hạn kích thước file (ví dụ: giới hạn 50 MB của Slack, ràng buộc 10 MB điển hình của email).
// Tự động tối ưu hóa để phù hợp với ràng buộc email 2MB
const result = await renderer.render(template, {
format: "gif",
outputPath: "/output/email-banner.gif",
gif: {
preset: "email",
targetSizeKB: 2000,
},
});
Rendervid được tổ chức như một monorepo với 13 package. Mỗi package có một trách nhiệm tập trung, và chúng kết hợp với nhau để hỗ trợ mọi kịch bản triển khai.
@rendervid/
├── core Engine, types, validation, animation system
│ ├── Template parser và validator (AJV + JSON Schema)
│ ├── Animation engine (40+ preset, 30+ easing function)
│ ├── Layer system (text, image, video, shape, audio, group, lottie, custom)
│ └── Scene management và transitions (17 loại)
│
├── renderer-browser Render phía client
│ ├── Render khung hình dựa trên Canvas
│ ├── MediaRecorder cho xuất WebM
│ └── Bộ mã hóa MP4 WebAssembly
│
├── renderer-node Render phía máy chủ
│ ├── Trình duyệt headless Playwright/Puppeteer
│ ├── Tích hợp FFmpeg (fluent-ffmpeg)
│ ├── Tăng tốc GPU
│ └── Quy trình tối ưu hóa GIF
│
├── cloud-rendering Điều phối đa cloud
│ ├── AWS Lambda provider
│ ├── Azure Functions provider
│ ├── Google Cloud Functions provider
│ ├── Docker local provider
│ ├── Chunk splitter và merger
│ └── Object storage adapter (S3, Blob, GCS)
│
├── player Component player video/template
├── editor Trình chỉnh sửa template trực quan (Zustand state)
├── components Component React được xây dựng sẵn
│ ├── AnimatedLineChart
│ ├── AuroraBackground
│ ├── WaveBackground
│ ├── SceneTransition
│ └── TypewriterEffect
│
├── templates Định nghĩa template và ví dụ (100+)
├── testing Tiện ích kiểm tra
│ ├── Vitest custom matcher
│ ├── Snapshot testing helper
│ └── Visual regression utility
│
├── editor-playground Môi trường phát triển editor
├── player-playground Môi trường phát triển player
├── mcp Model Context Protocol server
└── docs Trang tài liệu VitePress
renderer-node và phân phối công việc của nó trên các cloud function hoặc Docker container.Rendervid được xây dựng trên một stack TypeScript hiện đại được chọn cho độ tin cậy, hiệu suất và trải nghiệm nhà phát triển.
| Lớp | Công nghệ | Mục đích |
|---|---|---|
| Ngôn ngữ | TypeScript | Type safety trên tất cả 13 package |
| Build | tsup, Vite | Build nhanh, tree-shaking, đầu ra ESM/CJS |
| Testing | Vitest | Unit test, snapshot test, custom matcher |
| UI Framework | React 18.3.1 | Render component, tổng hợp template |
| State Management | Zustand | Editor state (nhẹ, không boilerplate) |
| Styling | Tailwind CSS | Editor và player UI |
| Validation | AJV với JSON Schema | Validation template trước khi render |
| Browser Rendering | HTML Canvas API | Vẽ từng khung hình trong trình duyệt |
| Headless Browser | Playwright, Puppeteer | Chụp khung hình phía máy chủ |
| Video Encoding | FFmpeg (fluent-ffmpeg) | Mã hóa H.264, H.265, VP9, ProRes, GIF |
| 3D Graphics | Three.js (tùy chọn), CSS 3D | Scene 3D và perspective transform |
| Documentation | VitePress | Trang tài liệu package |
Rendervid bao gồm một package testing chuyên dụng (@rendervid/testing) cung cấp Vitest matcher tùy chỉnh, snapshot testing helper, và visual regression utility để xác thực template.
import { describe, it, expect } from "vitest";
import "@rendervid/testing/matchers";
describe("Product Showcase Template", () => {
it("nên là một template hợp lệ", () => {
expect(template).toBeValidTemplate();
});
it("nên có kích thước chính xác", () => {
expect(template).toHaveResolution(1920, 1080);
});
it("nên chứa ít nhất một text layer", () => {
expect(template).toContainLayerOfType("text");
});
it("nên có animation trên headline", () => {
expect(template.scenes[0].layers[0]).toHaveAnimation("entrance");
});
});
Snapshot testing render một template thành hình ảnh và so sánh nó với tham chiếu được lưu trữ. Bất kỳ thay đổi hình ảnh nào cũng khiến test thất bại, giúp dễ dàng phát hiện các regression không mong muốn.
import { describe, it } from "vitest";
import { renderSnapshot } from "@rendervid/testing";
describe("Template Visual Regression", () => {
it("nên khớp với snapshot tham chiếu tại khung hình 0", async () => {
const snapshot = await renderSnapshot(template, { frame: 0 });
expect(snapshot).toMatchImageSnapshot();
});
it("nên khớp với snapshot tham chiếu tại điểm giữa", async () => {
const totalFrames = template.fps * template.scenes[0].duration;
const snapshot = await renderSnapshot(template, {
frame: Math.floor(totalFrames / 2),
});
expect(snapshot).toMatchImageSnapshot();
});
});
Tích hợp visual regression test vào quy trình CI/CD của bạn để phát hiện các thay đổi render trước khi chúng đến production:
# .github/workflows/visual-regression.yml
name: Visual Regression Tests
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
Để có thời gian render nhanh nhất có thể, cần hiểu thời gian được dành ở đâu và bạn có thể kéo đòn bẩy nào. Dưới đây là các chiến lược tối ưu hóa có tác động nhất.
| Kịch bản | Mục tiêu tốt nhất |
|---|---|
| Xem trước nhanh trong quá trình chỉnh sửa | Browser |
| Video đơn, chất lượng sản xuất | Node.js |
| Lô 10-100 video | Node.js hoặc Docker |
| Lô 100+ video hoặc nhạy cảm về thời gian | Cloud (AWS/Azure/GCP) |
draft trong quá trình phát triển và kiểm tra. Chuyển sang high hoặc lossless chỉ cho xuất cuối cùng.renderWaitTime một cách khôn ngoanTùy chọn renderWaitTime tạm dừng render để cho phép media bên ngoài (hình ảnh, video, font) tải. Đặt giá trị này ở mức tối thiểu đảm bảo tất cả tài sản được tải. Giá trị 500-2000ms là điển hình. Đặt quá cao sẽ lãng phí thời gian trên mỗi khung hình.
await renderer.render(template, {
renderWaitTime: 1000, // 1 giây thường là đủ
});
Đối với bất kỳ video nào dài hơn 10 giây, render song song (Docker hoặc cloud) sẽ nhanh hơn render tuần tự. Điểm hòa vốn phụ thuộc vào phần cứng và cấu hình cloud của bạn, nhưng theo nguyên tắc chung:
GIF vốn dĩ lớn. Để giữ kích thước file có thể quản lý:
social, web, email).targetSizeKB để cho Rendervid tự động tối ưu hóa tham số.none) nếu kích thước file quan trọng hơn chất lượng gradient.Trên các máy có GPU tương thích, mã hóa tăng tốc phần cứng có thể giảm thời gian render 2-5 lần cho bước mã hóa. Điều này có tác động nhất đối với đầu ra độ phân giải cao (4K+) và bitrate cao.
Nếu template của bạn tham chiếu hình ảnh hoặc video bên ngoài, hãy tải trước chúng xuống bộ nhớ cục bộ trước khi render. Độ trễ mạng trong quá trình render là nguyên nhân phổ biến nhất của render chậm hoặc thất bại.
Rendervid hỗ trợ bốn tùy chọn triển khai: render trên trình duyệt cho xem trước phía client và ứng dụng web, render Node.js cho xử lý hàng loạt phía máy chủ với FFmpeg, render trên cloud với AWS Lambda/Azure Functions/GCP để tăng tốc song song 10-50 lần, và Docker cho render song song miễn phí trên máy cục bộ.
Chi phí render trên cloud khoảng $0.02 mỗi phút trên AWS Lambda, Azure Functions, hoặc Google Cloud Functions—tương đương $1 mỗi giờ render. Render cục bộ dựa trên Docker hoàn toàn miễn phí và cung cấp cùng lợi ích render song song.
Render trên cloud sử dụng một coordinator chia video thành các khối khung hình, phân phối chúng cho các worker function (Lambda/Azure/GCP), mỗi worker render các khung hình được gán, một merger kết hợp tất cả khung hình thành video cuối cùng, và đầu ra được lưu trữ trong object storage (S3/Azure Blob/GCS).
Đối với render trên trình duyệt, bất kỳ trình duyệt hiện đại nào có hỗ trợ Canvas đều hoạt động. Đối với render Node.js, bạn cần Node.js 18+, Playwright hoặc Puppeteer, và FFmpeg đã cài đặt. Đối với render trên cloud, bạn cần tài khoản AWS/Azure/GCP hoặc Docker đã cài đặt cục bộ.
Có, renderer Node.js hỗ trợ tăng tốc phần cứng để render nhanh hơn. Tăng tốc GPU có thể tăng tốc đáng kể quá trình render, đặc biệt cho các template phức tạp với nhiều lớp, hiệu ứng và độ phân giải cao.
Rendervid triển khai motion blur sử dụng temporal supersampling, render nhiều sub-frame cho mỗi khung hình đầu ra và pha trộn chúng lại với nhau. Các preset chất lượng từ low (5 mẫu, thời gian render 5x) đến ultra (32 mẫu, thời gian render 32x), tạo ra độ mượt mà như điện ảnh.
Chúng tôi giúp các công ty như của bạn phát triển chatbot thông minh, Máy chủ MCP, công cụ AI hoặc các loại tự động hóa AI khác để thay thế con người trong các tác vụ lặp đi lặp lại trong tổ chức của bạn.

Hướng dẫn đầy đủ về hệ thống template Rendervid. Học cách tạo template video JSON, sử dụng biến động với cú pháp {{variable}}, cấu hình hơn 40 preset hoạt ảnh, ...

Khám phá tất cả các thành phần Rendervid: 8 loại lớp tích hợp sẵn (text, image, video, shape, audio, group, lottie, custom), các thành phần React được xây dựng ...

Khám phá Rendervid, phần mềm mã nguồn mở miễn phí thay thế Remotion để tạo video theo chương trình. Thiết kế tối ưu cho AI với tích hợp MCP, mẫu JSON, render đá...