Rendervid 部署 - 浏览器、Node.js、云端和 Docker 渲染

Rendervid Deployment Cloud Rendering Docker

简介

Rendervid 旨在在您的工作流程需要的任何地方进行渲染。无论您需要浏览器中的即时预览、服务器上的专业级视频编码,还是跨云基础设施的大规模并行渲染,Rendervid 都为每个环境提供了专用的包。每个部署目标都共享相同的模板系统组件库 ,因此在浏览器中工作的模板在 AWS Lambda 或 Docker 容器中的工作方式完全相同。

本指南涵盖所有四种部署环境、每种环境中可用的渲染选项以及运动模糊、GIF 导出和性能优化等高级功能。最后,您将确切了解哪种部署路径适合您的项目以及如何配置它。

                        +---------------------+
                        |   JSON 模板         |
                        +----------+----------+
                                   |
              +--------------------+--------------------+
              |                    |                    |
     +--------v--------+  +-------v--------+  +-------v---------+
     |     浏览器       |  |    Node.js     |  |     云端        |
     | @rendervid/      |  | @rendervid/    |  | @rendervid/     |
     | renderer-browser |  | renderer-node  |  | cloud-rendering |
     +---------+--------+  +-------+--------+  +-------+---------+
               |                   |                    |
        Canvas / WebM         FFmpeg / Playwright   并行工作器
               |                   |                    |
     +---------v--------+  +------v---------+  +-------v---------+
     | MP4, WebM, PNG,  |  | MP4, WebM, MOV,|  | AWS Lambda      |
     | JPEG, WebP       |  | GIF, H.265     |  | Azure Functions |
     +------------------+  +----------------+  | GCP Functions   |
                                               | Docker          |
                                               +-----------------+

浏览器渲染

@rendervid/renderer-browser 包完全在用户的浏览器中处理客户端渲染。不需要服务器基础设施。这使其成为从模板到预览的最快路径。

何时使用浏览器渲染

  • 可视化编辑器 中编辑模板期间的实时预览
  • 需要动态生成视频或图像资源的 Web 应用程序
  • 在提交到服务器端渲染之前原型化新模板
  • 轻量级导出,其中 MP4、WebM、PNG、JPEG 或 WebP 输出就足够了

安装

npm install @rendervid/renderer-browser

工作原理

浏览器渲染使用 HTML Canvas API 绘制模板的每一帧。渲染器遍历每个场景和图层,应用动画和缓动函数,将结果合成到画布元素上,并捕获每一帧。对于视频输出,使用浏览器内置的 MediaRecorder API(WebM)或基于 WebAssembly 的 MP4 编码器对帧进行编码。

支持的输出格式

格式扩展名注释
MP4.mp4通过 WebAssembly 编码器的 H.264
WebM.webm通过 MediaRecorder API 的 VP8/VP9
PNG.png单帧或图像序列
JPEG.jpeg单帧,可配置质量
WebP.webp单帧,文件大小更小

代码示例

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: "来自浏览器的问候",
          fontSize: 72,
          color: "#ffffff",
          position: { x: 960, y: 540 },
          animation: {
            entrance: { type: "fadeIn", duration: 1 },
          },
        },
      ],
    },
  ],
};

// 渲染到画布元素以进行预览
const canvas = document.getElementById("preview") as HTMLCanvasElement;
await renderer.preview(template, canvas);

// 导出为 MP4
const mp4Blob = await renderer.render(template, {
  format: "mp4",
  quality: "standard",
});

// 将单帧导出为 PNG
const pngBlob = await renderer.renderFrame(template, {
  format: "png",
  frameNumber: 0,
});

浏览器渲染限制

  • 无法访问 FFmpeg,因此 H.265/HEVC 和 MOV 不可用
  • GIF 导出需要 Node.js 渲染器进行调色板优化
  • 最大分辨率取决于浏览器的 Canvas 大小限制(通常为 4096x4096 或 8192x8192)
  • 渲染速度取决于客户端设备的 CPU 和 GPU

Node.js 渲染

@rendervid/renderer-node 包提供具有完整 FFmpeg 集成的服务器端渲染。它使用 Playwright 或 Puppeteer 在无头浏览器中渲染每一帧,然后将帧传输到 FFmpeg 进行专业级视频编码。

何时使用 Node.js 渲染

  • 具有完整编解码器支持(H.264、H.265、VP9)的生产视频编码
  • 在自动化管道中批量处理数百或数千个模板
  • 接受模板 JSON 并返回渲染视频的 REST API
  • 用于自动内容生成的 CI/CD 管道
  • 具有调色板优化和抖动控制的 GIF 导出

安装

# 安装渲染器
npm install @rendervid/renderer-node

# 安装 Playwright(包括浏览器二进制文件)
npx playwright install chromium

# 安装 FFmpeg(视频编码所需)
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt-get install ffmpeg

# Windows(通过 Chocolatey)
choco install ffmpeg

支持的输出格式

格式扩展名编解码器注释
MP4.mp4H.264通用兼容性
MP4.mp4H.265/HEVC文件小 50%,较新设备
WebM.webmVP8/VP9Web 优化
MOV.movProRes专业编辑工作流程
GIF.gif基于调色板带优化的动画
PNG.png无损图像序列或单帧
JPEG.jpeg有损可配置质量
WebP.webp有损/无损现代 Web 格式

渲染质量预设

Rendervid 提供四种控制编码参数的质量预设:

预设比特率用例
draft开发期间的快速预览
standard中等通用输出,良好的质量/大小
high营销材料,最终交付成果
lossless最大存档,进一步编辑,无质量损失

GPU 加速

Node.js 渲染器支持硬件加速,将编码卸载到 GPU。这显著减少了具有多层、高分辨率和效果的复杂模板的渲染时间。

const result = await renderer.render(template, {
  format: "mp4",
  quality: "high",
  outputPath: "/output/video.mp4",
  hardwareAcceleration: true,
});

GPU 加速适用于具有兼容的 NVIDIA(NVENC)、AMD(AMF)或 Intel(Quick Sync)硬件的系统。FFmpeg 必须使用相应的编码器支持进行编译。

代码示例

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: "标题",
      default: "您的产品,提升",
    },
  },
};

// 使用自定义输入进行渲染
const result = await renderer.render(template, {
  format: "mp4",
  quality: "high",
  outputPath: "/output/promo.mp4",
  renderWaitTime: 2000, // 等待 2 秒以加载媒体
  inputs: {
    headline: "夏季促销 — 全场 5 折",
  },
});

console.log(`已渲染:${result.outputPath}`);
console.log(`时长:${result.duration}秒`);
console.log(`文件大小:${(result.fileSize / 1024 / 1024).toFixed(2)} MB`);

批量处理

对于按顺序处理多个模板,请使用批处理 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,
  });
}

对于在单台机器上的真正并行渲染,请参阅下面的 Docker 本地渲染部分。


云端渲染

@rendervid/cloud-rendering 包支持跨云基础设施的分布式并行渲染。云端渲染不是在一台机器上按顺序渲染帧,而是将工作分配到同时渲染帧的许多工作函数中,然后将它们合并到最终输出中。

何时使用云端渲染

  • 每小时处理数百个视频的高吞吐量管道
  • 顺序渲染太慢的长篇内容
  • 10-50 倍加速很重要的时间敏感工作负载
  • 自动扩展以处理不可预测的需求高峰

架构

+------------------+
|   您的应用       |
|  (协调器)        |
+--------+---------+
         |
         | 1. 将视频分割成帧块
         v
+--------+---------+
|   块分割器       |
+--------+---------+
         |
         |  2. 将块分发给工作器
         v
+--------+---+---+---+---+--------+
|  工作器 1  | 工作器 2  | 工作器 N |
|  (Lambda/  | (Lambda/  | (Lambda/ |
|   Azure/   |  Azure/   |  Azure/  |
|   GCP)     |  GCP)     |  GCP)    |
+-----+------+----+------+----+----+
      |            |           |
      | 3. 每个工作器渲染其帧
      v            v           v
+-----+------+----+------+----+----+
|  帧        |  帧       |  帧     |
|  001-030   |  031-060  |  061-090|
+-----+------+----+------+----+----+
      |            |           |
      +------+-----+-----+----+
             |
             v
     +-------+--------+
     |     合并器      |
     | (FFmpeg concat) |
     +-------+---------+
             |
             | 4. 合并成最终视频
             v
     +-------+---------+
     |  对象存储        |
     |  S3 / Blob / GCS |
     +------------------+
             |
             | 5. 下载或提供服务
             v
     +-------+---------+
     |   最终输出       |
     |   video.mp4      |
     +------------------+

工作原理逐步说明:

  1. 协调器分析模板并根据总时长和 FPS 确定需要渲染多少帧。
  2. 块分割器将总帧数划分为块(例如,对于 30fps 视频,每块 30 帧 = 每块 1 秒)。
  3. 每个工作函数接收块分配(起始帧、结束帧),使用 Node.js 渲染器渲染这些帧,并将渲染的片段上传到对象存储。
  4. 合并器下载所有片段并使用 FFmpeg 将它们连接成最终视频。
  5. 最终输出存储在云提供商的对象存储(S3、Azure Blob 或 GCS)中,并可选择下载到本地文件系统。

云端配置

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 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 设置

AWS Lambda 是最常见的云端部署目标。每个工作函数在单独的 Lambda 调用中运行,实现大规模并行性。

先决条件:

  • 具有 Lambda 和 S3 访问权限的 AWS 账户
  • 配置的 AWS CLI
  • Node.js 18+ Lambda 运行时

配置:

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(`在 ${result.renderTime}ms 内渲染`);
console.log(`使用的工作器:${result.workersUsed}`);
console.log(`输出:${result.outputUrl}`);

典型的 AWS Lambda 配置:

  • 内存:1024-3008 MB(更多内存 = 更多 CPU = 更快渲染)
  • 超时:300 秒(5 分钟)
  • 临时存储:512 MB - 10 GB
  • 并发:100-1000(根据工作负载调整)

Azure Functions 设置

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);

Google Cloud Functions 设置

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);

成本比较

提供商每分钟成本每小时成本注释
AWS Lambda~$0.02~$1.00按 1ms 计算付费
Azure Functions~$0.02~$1.00消费计划定价
Google Cloud Functions~$0.02~$1.00按 100ms 计算付费
Docker(本地)免费免费使用您自己的硬件

所有云提供商都提供免费层,在开发和低容量生产期间覆盖大量渲染工作负载。

性能基准

与单机顺序渲染相比,云端渲染实现了 10-50 倍加速。确切的加速取决于工作器数量、模板复杂性和视频时长。

视频时长顺序(1 台机器)云端(50 个工作器)加速
30 秒~90 秒~5 秒18 倍
2 分钟~6 分钟~15 秒24 倍
10 分钟~30 分钟~45 秒40 倍
30 分钟~90 分钟~2 分钟45 倍

较长的视频从并行性中受益更多,因为工作器启动和帧合并的开销分摊到更多帧上。


Docker 本地渲染

基于 Docker 的渲染为您提供与云端渲染相同的并行渲染架构,但完全在本地机器上运行。它完全免费,不使用云账户,非常适合自托管设置、开发以及希望在没有云成本的情况下进行并行渲染的团队。

何时使用 Docker 渲染

  • 无需云提供商账户的免费并行渲染
  • 防火墙后的自托管基础设施
  • 云端渲染工作流程的开发和测试在本地进行
  • 受益于并行性但不需要自动扩展的中小型工作负载

安装

# 确保 Docker 已安装并运行
docker --version

# 安装云端渲染包
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, // 并行运行的 Docker 容器数量
  },
});

const result = await renderer.render(template);
console.log(`使用 ${result.workersUsed} 个工作器在 ${result.renderTime}ms 内渲染`);

选择 workersCount 将其设置为机器上可用的 CPU 核心数。例如,8 核机器与 8 个工作器配合良好。超出核心数会增加上下文切换的开销,而不会提高吞吐量。

Docker 架构

+------------------+
|   协调器         |
|  (您的进程)      |
+--------+---------+
         |
   +-----+-----+-----+-----+
   |     |     |     |     |
+--v--+ +--v-+ +-v--+ +-v--+
| C1  | | C2 | | C3 | | C4 |  ... Docker 容器
+--+--+ +--+-+ +-+--+ +-+--+
   |      |     |      |
   v      v     v      v
+--+------+-----+------+--+
|    共享卷                |
|    /tmp/rendervid-work   |
+-------------+-------------+
              |
              v
      +-------+--------+
      |     合并器      |
      +-------+---------+
              |
              v
      +-------+---------+
      |  /output/video  |
      +-----------------+

每个 Docker 容器都是一个自包含的工作器,预装了 Node.js、Playwright 和 FFmpeg。工作器从共享卷读取其帧分配,渲染帧,并将结果写回。然后协调器将所有片段合并到最终输出中。


运动模糊

Rendervid 通过时间超采样支持运动模糊。渲染器不是为每帧渲染单个瞬间,而是在稍微不同的时间点捕获多个子帧并将它们混合在一起。这产生了当物体在曝光期间移动时相机产生的自然模糊。

质量预设

预设每帧样本数渲染时间乘数视觉质量
low55 倍细微平滑
medium1010 倍快速运动上的明显模糊
high1616 倍电影运动模糊
ultra3232 倍电影级,重度模糊

配置

const result = await renderer.render(template, {
  format: "mp4",
  quality: "high",
  outputPath: "/output/cinematic.mp4",
  motionBlur: {
    enabled: true,
    quality: "high", // 每帧 16 个样本
  },
});

时间超采样的工作原理

帧 N(无运动模糊):          帧 N(有运动模糊,5 个样本):

  单个瞬间:                    5 个子帧混合:

  +--------+                         +--------+   +--------+   +--------+
  |    O   |                         |   O    | + |    O   | + |     O  |  ...
  +--------+                         +--------+   +--------+   +--------+
                                              |
                                              v
                                     +--------+
                                     |  ~O~   |  <- 混合结果
                                     +--------+

每个子帧将动画时间线推进一小段增量(1/fps 除以样本数)。然后将子帧进行 alpha 混合以产生最终帧。在子帧之间移动的物体沿其运动路径显得模糊,而静止元素保持清晰。

性能考虑

运动模糊使渲染时间与样本数成正比地增加。30fps 的 10 秒视频有 300 帧。使用 high 质量(16 个样本),渲染器必须生成 4,800 个子帧而不是 300 个。在开发期间使用 draft 质量,仅在最终导出时切换到 highultra

云端渲染和 Docker 并行渲染与运动模糊配合良好,因为每帧成本分布在工作器之间。16 倍的每帧增加除以 16 个工作器,结果与在一台机器上进行非模糊渲染的总渲染时间大致相同。


GIF 导出

Rendervid 的 GIF 导出远远超出了简单的帧到 GIF 转换。它使用 FFmpeg 的调色板生成管道来生成具有可配置抖动、颜色数和文件大小约束的优化高质量动画 GIF。

GIF 优化的工作原理

标准 GIF 编码使用 256 种颜色的单个全局调色板,这通常会导致条带和较差的颜色再现。Rendervid 使用两遍方法:

  1. 第 1 遍(palettegen): 分析所有帧以生成最能代表视频完整颜色范围的最佳 256 色调色板。
  2. 第 2 遍(paletteuse): 使用优化的调色板重新编码每一帧,可选择抖动以实现平滑渐变。

优化预设

预设分辨率最大颜色目标用例
social480x480256Instagram、Twitter、Slack
web640x480256博客文章、文档
email320x240128电子邮件营销活动、时事通讯

抖动选项

算法质量文件大小描述
floyd_steinberg最佳最大误差扩散抖动,平滑渐变
bayer良好中等有序抖动,一致的图案
none最低最小无抖动,平坦的颜色区域

配置

const result = await renderer.render(template, {
  format: "gif",
  outputPath: "/output/animation.gif",
  gif: {
    preset: "social",       // 480x480 分辨率
    colors: 256,            // 2-256 色调色板
    dithering: "floyd_steinberg",
    targetSizeKB: 5000,     // 自动优化以保持在 5MB 以下
    fps: 15,                // 较低的 FPS = 较小的文件
  },
});

console.log(`GIF 大小:${(result.fileSize / 1024).toFixed(0)} KB`);
console.log(`估计大小为:${result.estimatedSizeKB} KB`);

文件大小估计和自动优化

当您设置 targetSizeKB 时,Rendervid 会在渲染前估计输出文件大小,并自动调整参数(颜色数、分辨率、FPS)以满足目标。这对于具有文件大小限制的平台特别有用(例如,Slack 的 50 MB 限制,电子邮件的典型 10 MB 约束)。

// 自动优化以适应 2MB 电子邮件约束
const result = await renderer.render(template, {
  format: "gif",
  outputPath: "/output/email-banner.gif",
  gif: {
    preset: "email",
    targetSizeKB: 2000,
  },
});

包架构

Rendervid 组织为具有 13 个包的 monorepo。每个包都有专注的职责,它们组合在一起以支持每个部署场景。

@rendervid/
├── core                    引擎、类型、验证、动画系统
│   ├── 模板解析器和验证器(AJV + JSON Schema)
│   ├── 动画引擎(40+ 预设,30+ 缓动函数)
│   ├── 图层系统(文本、图像、视频、形状、音频、组、lottie、自定义)
│   └── 场景管理和过渡(17 种类型)
│
├── renderer-browser        客户端渲染
│   ├── 基于 Canvas 的帧渲染
│   ├── 用于 WebM 导出的 MediaRecorder
│   └── WebAssembly MP4 编码器
│
├── renderer-node           服务器端渲染
│   ├── Playwright/Puppeteer 无头浏览器
│   ├── FFmpeg 集成(fluent-ffmpeg)
│   ├── GPU 加速
│   └── GIF 优化管道
│
├── cloud-rendering         多云编排
│   ├── AWS Lambda 提供商
│   ├── Azure Functions 提供商
│   ├── Google Cloud Functions 提供商
│   ├── Docker 本地提供商
│   ├── 块分割器和合并器
│   └── 对象存储适配器(S3、Blob、GCS)
│
├── player                  视频/模板播放器组件
├── editor                  可视化模板编辑器(Zustand 状态)
├── components              预构建的 React 组件
│   ├── AnimatedLineChart
│   ├── AuroraBackground
│   ├── WaveBackground
│   ├── SceneTransition
│   └── TypewriterEffect
│
├── templates               模板定义和示例(100+)
├── testing                 测试实用程序
│   ├── Vitest 自定义匹配器
│   ├── 快照测试助手
│   └── 视觉回归实用程序
│
├── editor-playground       编辑器开发环境
├── player-playground       播放器开发环境
├── mcp                     模型上下文协议服务器
└── docs                    VitePress 文档站点

包如何连接

  • @rendervid/core 是基础。其他每个包都依赖它来获取模板类型、验证和动画系统。
  • @rendervid/renderer-browser@rendervid/renderer-node 都使用核心模板,但通过不同的管道输出(Canvas 与 FFmpeg)。
  • @rendervid/cloud-rendering 包装 renderer-node 并将其工作分布在云函数或 Docker 容器中。
  • @rendervid/player@rendervid/editor 是基于 React 的 UI 包,用于播放和可视化编辑。编辑器使用 Zustand 进行状态管理。
  • @rendervid/components 提供可在模板中使用的预构建 React 组件 (AnimatedLineChart、AuroraBackground 等)。
  • @rendervid/testing 提供 Vitest 匹配器和快照测试助手,用于验证模板。
  • mcpAI 集成 层,通过模型上下文协议向 AI 代理公开 Rendervid 的功能。

技术栈

Rendervid 构建在为可靠性、性能和开发人员体验而选择的现代 TypeScript 栈上。

技术目的
语言TypeScript所有 13 个包的类型安全
构建tsup、Vite快速构建、tree-shaking、ESM/CJS 输出
测试Vitest单元测试、快照测试、自定义匹配器
UI 框架React 18.3.1组件渲染、模板组合
状态管理Zustand编辑器状态(轻量级,无样板)
样式Tailwind CSS编辑器和播放器 UI
验证AJV 与 JSON Schema渲染前的模板验证
浏览器渲染HTML Canvas API浏览器中的逐帧绘制
无头浏览器Playwright、Puppeteer服务器端帧捕获
视频编码FFmpeg(fluent-ffmpeg)H.264、H.265、VP9、ProRes、GIF 编码
3D 图形Three.js(可选)、CSS 3D3D 场景和透视变换
文档VitePress包文档站点

测试

Rendervid 包含一个专用的测试包(@rendervid/testing),提供自定义 Vitest 匹配器、快照测试助手和用于验证模板的视觉回归实用程序。

Vitest 自定义匹配器

import { describe, it, expect } from "vitest";
import "@rendervid/testing/matchers";

describe("产品展示模板", () => {
  it("应该是有效的模板", () => {
    expect(template).toBeValidTemplate();
  });

  it("应该具有正确的尺寸", () => {
    expect(template).toHaveResolution(1920, 1080);
  });

  it("应该至少包含一个文本图层", () => {
    expect(template).toContainLayerOfType("text");
  });

  it("标题应该有动画", () => {
    expect(template.scenes[0].layers[0]).toHaveAnimation("entrance");
  });
});

快照测试

快照测试将模板渲染为图像并将其与存储的参考进行比较。任何视觉变化都会导致测试失败,从而轻松捕获意外的回归。

import { describe, it } from "vitest";
import { renderSnapshot } from "@rendervid/testing";

describe("模板视觉回归", () => {
  it("应该在帧 0 匹配参考快照", async () => {
    const snapshot = await renderSnapshot(template, { frame: 0 });
    expect(snapshot).toMatchImageSnapshot();
  });

  it("应该在中点匹配参考快照", async () => {
    const totalFrames = template.fps * template.scenes[0].duration;
    const snapshot = await renderSnapshot(template, {
      frame: Math.floor(totalFrames / 2),
    });
    expect(snapshot).toMatchImageSnapshot();
  });
});

CI 中的视觉回归测试

将视觉回归测试集成到您的 CI/CD 管道中,以在渲染更改到达生产之前捕获它们:

# .github/workflows/visual-regression.yml
name: 视觉回归测试
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

性能优化

获得尽可能快的渲染时间需要了解时间花在哪里以及您可以拉动哪些杠杆。以下是最有影响力的优化策略。

1. 选择正确的部署目标

场景最佳目标
编辑期间的快速预览浏览器
单个视频,生产质量Node.js
10-100 个视频的批处理Node.js 或 Docker
100+ 个视频的批处理或时间关键云端(AWS/Azure/GCP)

2. 优化模板复杂性

  • 减少图层数量。 每个图层都是独立渲染的。更少的图层意味着每帧更少的绘制操作。
  • 在开发和测试期间使用 draft 质量。仅在最终导出时切换到 highlossless
  • 在预览期间简化动画。具有许多缓动函数的复杂关键帧序列会增加每帧的计算量。

3. 明智地使用 renderWaitTime

renderWaitTime 选项暂停渲染以允许外部媒体(图像、视频、字体)加载。将其设置为确保所有资源加载的最小值。500-2000ms 的值是典型的。设置得太高会浪费每帧的时间。

await renderer.render(template, {
  renderWaitTime: 1000, // 1 秒通常就足够了
});

4. 利用并行渲染

对于任何超过 10 秒的视频,并行渲染(Docker 或云端)将比顺序渲染更快。盈亏平衡点取决于您的硬件和云配置,但根据经验:

  • < 10 秒: 单个 Node.js 渲染器就可以了
  • 10-60 秒: 使用 4-8 个工作器的 Docker
  • 1-10 分钟: 使用 8-16 个工作器的 Docker 或云端
  • > 10 分钟: 使用 50+ 个工作器的云端渲染

5. 优化 GIF 输出

GIF 本质上很大。要保持文件大小可管理:

  • 将 FPS 降低到 10-15。大多数 GIF 在降低帧率时看起来不错。
  • 使用预设降低分辨率socialwebemail)。
  • 将颜色限制为 128 或更少以用于简单动画。
  • 使用 targetSizeKB 让 Rendervid 自动优化参数。
  • 避免抖动none)如果文件大小比渐变质量更重要。

6. 启用 GPU 加速

在具有兼容 GPU 的机器上,硬件加速编码可以将编码步骤的渲染时间减少 2-5 倍。这对高分辨率(4K+)和高比特率输出影响最大。

7. 预加载资源

如果您的模板引用外部图像或视频,请在渲染之前将它们预下载到本地存储。渲染期间的网络延迟是渲染缓慢或失败的最常见原因。


下一步

  • 开始使用 Rendervid: 访问 Rendervid 概述 以获取安装和首次渲染
  • 学习模板系统: 阅读模板系统文档 以了解 JSON 模板结构、变量、场景、图层和动画
  • 探索组件: 浏览组件库 以获取预构建的 React 组件,如 AnimatedLineChart 和 AuroraBackground
  • 设置 AI 集成: 查看 AI 集成指南 以通过 MCP 将 Claude Code、Cursor 或 Windsurf 连接到 Rendervid
  • 查看源代码: 访问 Rendervid GitHub 仓库 以获取完整源代码和 100+ 示例模板

常见问题

Rendervid 有哪些不同的部署方式?

Rendervid 支持四种部署选项:基于浏览器的渲染用于客户端预览和 Web 应用,Node.js 渲染用于使用 FFmpeg 的服务器端批量处理,云端渲染在 AWS Lambda/Azure Functions/GCP 上实现 10-50 倍并行加速,以及 Docker 用于免费的本地并行渲染。

云端渲染的成本是多少?

云端渲染在 AWS Lambda、Azure Functions 或 Google Cloud Functions 上的成本约为每分钟 $0.02,大约每小时渲染 $1。基于 Docker 的本地渲染完全免费,并提供相同的并行渲染优势。

云端渲染架构是什么?

云端渲染使用协调器将视频分割成帧块,将它们分发到工作函数(Lambda/Azure/GCP),每个工作器渲染其分配的帧,合并器将所有帧组合成最终视频,输出存储在对象存储(S3/Azure Blob/GCS)中。

Rendervid 的系统要求是什么?

对于浏览器渲染,任何支持 Canvas 的现代浏览器都可以。对于 Node.js 渲染,您需要 Node.js 18+、Playwright 或 Puppeteer 以及已安装的 FFmpeg。对于云端渲染,您需要 AWS/Azure/GCP 账户或在本地安装 Docker。

Rendervid 支持 GPU 加速吗?

是的,Node.js 渲染器支持硬件加速以实现更快的渲染。GPU 加速可以显著加快渲染速度,特别是对于具有多层、效果和高分辨率的复杂模板。

Rendervid 中的运动模糊是如何工作的?

Rendervid 使用时间超采样实现运动模糊,为每个输出帧渲染多个子帧并将它们混合在一起。质量预设范围从低(5 个样本,5 倍渲染时间)到超高(32 个样本,32 倍渲染时间),产生电影般的流畅度。

让我们为您构建专属的AI团队

我们帮助像您这样的公司开发智能聊天机器人、MCP服务器、AI工具或其他类型的AI自动化,以在您的组织中替代人工处理重复性任务。

了解更多

Rendervid 模板系统 - JSON 模板、变量、动画与过渡效果
Rendervid 模板系统 - JSON 模板、变量、动画与过渡效果

Rendervid 模板系统 - JSON 模板、变量、动画与过渡效果

Rendervid 模板系统完整指南。学习如何创建 JSON 视频模板,使用 {{variable}} 语法的动态变量,配置 40 多种动画预设、17 种场景过渡效果和 30 多种缓动函数。...

12 分钟阅读
Rendervid Video Rendering +2
Rendervid 组件 - 图层类型、React 组件和可视化编辑器
Rendervid 组件 - 图层类型、React 组件和可视化编辑器

Rendervid 组件 - 图层类型、React 组件和可视化编辑器

探索所有 Rendervid 组件:8 种内置图层类型(文本、图像、视频、形状、音频、组、lottie、自定义),预构建的 React 组件,可视化模板编辑器和视频播放器。使用完整的 React 支持创建自定义组件。...

7 分钟阅读
Rendervid Components +3
Rendervid:免费的 Remotion 替代方案,用于 AI 驱动的视频生成
Rendervid:免费的 Remotion 替代方案,用于 AI 驱动的视频生成

Rendervid:免费的 Remotion 替代方案,用于 AI 驱动的视频生成

探索 Rendervid,这是一个免费的开源 Remotion 替代方案,用于程序化视频生成。AI 优先设计,集成 MCP,支持 JSON 模板、云端渲染,无需许可费用。非常适合 AI 代理、自动化和大规模内容生成。...

4 分钟阅读
Rendervid Video Rendering +3