@remotion/vercel:在 Vercel Sandbox 中渲染 Remotion 视频的完整技术解析

发布时间:2026/9/8 19:43:25

@remotion/vercel:在 Vercel Sandbox 中渲染 Remotion 视频的完整技术解析
remotion/vercel在 Vercel Sandbox 中渲染 Remotion 视频的完整技术解析【免费下载链接】remotion Make videos programmatically with React项目地址: https://gitcode.com/GitHub_Trending/re/remotion本文围绕 Remotion 仓库中的remotion/vercel包packages/vercel/README.md展开讲解如何在 Vercel Sandbox 中创建渲染环境、上传项目 Bundle、执行视频/静帧渲染、跟踪进度并把产物上传到 Vercel Blob 的完整链路所有结论均基于仓库内 packages/vercel/src/index.ts 等源码。包定位与公开 APIremotion/vercel的官方定位是“Render Remotion videos on Vercel Sandbox”在 Vercel Sandbox 上渲染 Remotion 视频当前仓库内版本为4.0.521License 为 Remotion License见 packages/vercel/package.json。它依赖remotion/renderer与remotion并以vercel/sandbox 1.0.0作为 peer dependency开发中固定使用1.6.0配套vercel/blob2.3.0。从 src/index.ts 的导出清单看该包对外暴露 6 个运行时 API 和一批类型导出类型作用createSandbox函数创建一个安装好系统依赖、JS 依赖、headless 浏览器与渲染脚本的沙箱addBundleToSandbox函数把本地remotion bundle产物递归上传进沙箱renderMediaOnVercel函数在沙箱内渲染视频支持常规与 detached 两种模式renderStillOnVercel函数在沙箱内渲染单帧静图getRenderProgress函数轮询 detached 渲染任务的文件式进度uploadToVercelBlob函数把沙箱内产物上传到 Vercel Blob返回 URL类型导出typeVercelSandbox、RenderProgress、VercelBlobUploadOptions、ChromiumOptions、Codec等大部分自 types.ts 与remotion/renderer再导出安装与版本约束README 给出的安装方式npm install remotion/vercel --save-exact两条必须遵守的版本约束来自 README 与 package.json所有remotion与remotion/*包必须对齐同一版本需去掉版本号前的^使用精确版本vercel/sandbox是 peer dependency调用方需自行安装1.0.0。另外从沙箱初始化逻辑看包内渲染脚本由构建产物generated/*-script注入包内部通过remotion/version读取版本号在沙箱内以精确版本安装remotion/rendererVERSION与remotion/compositor-linux-x64-gnuVERSION见 internals/install-js-dependencies.ts也就是说沙箱内的渲染器版本永远与本地remotion/vercel版本一致这也是“版本必须对齐”这条约束的底层原因。createSandbox一步准备一个可渲染沙箱createSandbox是整个流程的入口完整实现在 src/create-sandbox.ts。签名与默认值createSandbox({ onProgress?, // (update: {progress, message}) void | Promisevoid resources {vcpus: 4}, // Vercel Sandbox 的 resources 参数默认 4 vCPU timeoutInMilliseconds 5 * 60 * 1000, // 沙箱创建/初始化超时默认 5 分钟 } {})它返回VercelSandbox——即Sandbox AsyncDisposable定义见 types.ts意味着可以用await using语法自动停止沙箱创建时通过 internals/disposable.ts 给沙箱挂了[Symbol.asyncDispose]dispose 时调用sandbox.stop()。沙箱的准备工作按两个加权阶段推进onProgress的进度权重系统依赖 75%、下载浏览器 25%创建沙箱runtime: node24即 Node 24 运行时安装系统依赖75%通过sudo dnf install安装 headless Chromium 在 Amazon Linux 2023 上运行所需的一组库nss、atk、at-spi2-atk、cups-libs、libdrm、libXcomposite、libXdamage、libXrandr、mesa-libgbm、alsa-lib、pango、gtk3以及补丁工具链patchelf、zstd、binutils见 internals/install-system-dependencies.ts。进度是通过统计命令 stdout 行数源码注释说明经验值为 272 行线性估算的安装 JS 依赖在沙箱内执行pnpm i remotion/renderer remotion/compositor-linux-x64-gnu vercel/blob版本锁定为当前包版本修补 compositorVercel Sandbox 的 Amazon Linux 2023 自带 glibc 2.34而 Remotion 的 compositor 二进制要求 glibc 2.35。internals/patch-compositor.ts 会下载 Ubuntu 22.04 的libc6 2.35deb 包主源为 Launchpad备用源为 remotion.media解压后用patchelf把remotion二进制的动态链接指向捆绑的 glibc。源码注释明确指出Remotion 并不官方支持 glibc 2.34但可以通过这种方式打补丁且只有remotion二进制需要修补ffmpeg/ffprobe在 glibc 2.34 下工作正常下载 headless 浏览器25%写入并执行ensure-browser.mjs以 JSON 日志形式回报browser-progress百分比见 internals/install-browser.ts写入渲染脚本向沙箱写入package.json{type: module}以及render-video.mjs、render-still.mjs、upload-blob.mjs三个脚本后续渲染命令直接调用它们。addBundleToSandbox上传项目 Bundle渲染前需要把npx remotion bundle生成的静态产物传进沙箱。src/add-bundle-to-sandbox.ts 的addBundleToSandbox({sandbox, bundleDir})行为如下递归读取bundleDir下所有文件统一转成 POSIX 分隔路径先在沙箱内按祖先目录逐一mkDir再批量writeFiles上传所有文件统一放在沙箱内的remotion-bundle/目录下常量REMOTION_SANDBOX_BUNDLE_DIR见 internals/add-bundle.ts。渲染时浏览器加载的 URL 因此固定为/vercel/sandbox/remotion-bundle目录创建或文件上传失败时经由 internals/format-sandbox-error.ts 重新抛出带操作上下文如“upload N bundle file(s)”的错误便于定位。renderMediaOnVercel渲染视频完整实现在 src/render-media-on-vercel.ts。这是一个通过重载区分两种模式的函数常规模式detached缺省或false阻塞等待渲染结束返回{sandboxFilePath, contentType}产物留在沙箱文件系统中等待后续uploadToVercelBlobdetached 模式detached: true必须同时提供vercelBlob: {blobToken, access, blobPath?}立即返回{sandboxId, cmdId, outputFile}由沙箱后台继续渲染并用getRenderProgress轮询结果。完整参数与默认值以下参数表全部来自源码中解构默认值参数默认值说明sandbox必填createSandbox返回的沙箱实例compositionId必填目标 Composition 的 idinputProps必填传给 Composition 的 propsoutputFile/tmp/video.mp4沙箱内输出路径codech264视频编码类型Codec自remotion/renderer再导出crfnull恒定质量因子imageFormat/pixelFormatnull帧图像格式与像素格式envVariables{}注入渲染进程的环境变量frameRangenull只渲染指定帧区间everyNthFrame1抽帧渲染步长proResProfilenullProRes 档位chromiumOptions{}附加 Chromium 启动参数scale1输出缩放比例preferLosslessfalse偏好无损编码enforceAudioTrackfalse强制包含音轨disallowParallelEncodingfalse禁止并行编码concurrencynull并发帧数metadatanull写入容器的元数据licenseKeynullRemotion 企业授权密钥videoBitrate/audioBitrate/encodingMaxRate/encodingBufferSizenull码率相关类型Bitratemutedfalse静音输出numberOfGifLoopsnullGIF 循环次数x264Preset/gopSizenullH.264 预设与 GOP 大小colorSpacedefault色彩空间jpegQuality80JPEG 帧质量audioCodecnull音频编码logLevelinfo日志级别timeoutInMilliseconds30000浏览器/Composition 打开超时forSeamlessAacConcatenationfalseAAC 无缝拼接separateAudioTonull单独输出音频文件路径hardwareAccelerationdisable硬件加速开关沙箱环境默认关闭offthreadVideoCacheSizeInBytes/mediaCacheSizeInBytes/offthreadVideoThreadsnull离屏视频缓存与线程sampleRate48000音频采样率detachedfalse是否后台渲染detachedSandboxTimeoutInMilliseconds30 * 60 * 1000detached 模式下沙箱超时延长时长30 分钟底层执行方式函数把上述参数组装成renderConfig其中强制写死了几个与本地渲染不同的字段chromeMode: headless-shell、browserExecutable: null、binariesDirectory: null、repro: false以及serveUrl: /vercel/sandbox/remotion-bundle。随后const renderCmd await sandbox.runCommand({ cmd: node, args: [render-video.mjs, JSON.stringify(renderConfig)], detached: true, env: vercelBlob ? {BLOB_READ_WRITE_TOKEN: vercelBlob.blobToken} : undefined, });即把整个渲染配置作为 JSON 传给沙箱内的render-video.mjs脚本脚本内部再调用remotion/renderer完成渲染并以 JSON 行形式把进度打到 stdout。常规模式下客户端逐行解析stdout日志非 JSON 的行直接忽略把opening-browser、selecting-composition、render-progress三个阶段透传给onProgress最后wait()等待命令结束退出码非 0 时抛出Render failed: stderr stdout。detached 模式则先sandbox.extendTimeout(detachedSandboxTimeoutInMilliseconds)延长沙箱寿命然后立即返回{sandboxId, cmdId, outputFile}供后续轮询。renderStillOnVercel渲染静帧实现在 src/render-still-on-vercel.ts参数更精简参数默认值outputFile/tmp/still.pngframe0imageFormatpng类型StillImageFormatjpegQuality80scale1logLevelinfotimeoutInMilliseconds30000chromiumOptions/envVariables{}/{}offthreadVideoCacheSizeInBytes/mediaCacheSizeInBytes/offthreadVideoThreads/licenseKey均可选执行方式与视频渲染一致node render-still.mjs jsonConfig同样以 JSON 行协议回报opening-browser、selecting-composition、done携带size与contentType成功返回{sandboxFilePath, contentType}。getRenderProgress轮询 detached 任务detached 模式下的进度追踪实现在 src/get-render-progress.ts。它不依赖命令句柄而是按“文件 命令状态”双通道读取Sandbox.get({sandboxId})重新附着沙箱失败即返回{stage: expired}sandbox.getCommand(cmdId)获取渲染命令对象识别sandbox_stopped一类错误码同样归为expired读取沙箱内固定路径/vercel/sandbox/progress.json沙箱内渲染脚本把最新进度写在这里文件不存在且命令尚未退出时返回{stage: starting, overallProgress: 0}文件存在但命令退出码非 0 时收集stderr/stdout组装错误信息返回error。返回值是联合类型RenderProgresstypes.ts覆盖完整生命周期starting → opening-browser → selecting-composition → render-progress → (detached 时沙箱内自动) uploading → done | error | expired其中done携带{url, size, contentType, overallProgress}——detached 模式下沙箱内的渲染脚本会使用BLOB_READ_WRITE_TOKEN直接把产物上传到 Vercel Blob因此done里的url就是可直接下载的产物地址。uploadToVercelBlob上传产物到 Blob常规模式渲染完产物只存在于沙箱文件系统中需要显式上传。src/upload-to-vercel-blob.ts 的uploadToVercelBlob({sandbox, sandboxFilePath, blobPath?, contentType, blobToken, access})blobPath缺省时自动生成renders/{uuid}{原文件扩展名}在沙箱内执行node upload-blob.mjs jsonConfig沙箱内已装好vercel/blobSDK从 stdout 的type: doneJSON 消息中取回{url, size}access为public | private类型VercelBlobAccess。典型端到端工作流把上述 API 串起来一个完整的服务端渲染流程大致如下基于仓库内各函数的真实签名编写import { addBundleToSandbox, createSandbox, renderMediaOnVercel, uploadToVercelBlob, } from remotion/vercel; // 1. 创建并初始化沙箱可 await using 自动清理 await using sandbox await createSandbox({ onProgress: ({progress, message}) console.log(progress, message), resources: {vcpus: 4}, }); // 2. 上传 npx remotion bundle 的产物如 out/remotion await addBundleToSandbox({sandbox, bundleDir: out/remotion}); // 3. 渲染视频常规模式 const {sandboxFilePath, contentType} await renderMediaOnVercel({ sandbox, compositionId: MyComp, inputProps: {title: Hello}, codec: h264, scale: 1, onProgress: ({stage, overallProgress}) console.log(stage, overallProgress), }); // 4. 上传到 Vercel Blob 并拿到 URL const {url, size} await uploadToVercelBlob({ sandbox, sandboxFilePath, contentType, blobToken: process.env.BLOB_READ_WRITE_TOKEN!, access: public, }); console.log(url, size);长任务或需要跨进程追踪时改用 detached 模式const {sandboxId, cmdId, outputFile} await renderMediaOnVercel({ sandbox, compositionId: MyComp, inputProps: {title: Hello}, detached: true, vercelBlob: { blobToken: process.env.BLOB_READ_WRITE_TOKEN!, access: public, blobPath: renders/hello.mp4, }, }); // 在任意时机甚至另一个进程中轮询 const progress await getRenderProgress({sandboxId, cmdId}); // progress.stage: starting | opening-browser | ... | done | expired适用前提与限制综合源码可以归纳出该包的使用前提与限制部署前需要确认平台假设沙箱初始化脚本围绕node24运行时 Amazon Linux 2023dnf包管理、glibc 2.34 补丁路径编写compositor 修补逻辑只处理node_modules/remotion/compositor-linux-x64-gnu即当前实现面向 Linux x64 沙箱环境浏览器固定为 headless-shellrenderConfig中chromeMode被硬编码为headless-shell且browserExecutable、binariesDirectory恒为null无法指定自托管 Chromiumdetached 模式强依赖 Vercel Blobdetached: true时缺少vercelBlob会直接抛错The vercelBlob option is required when detached is set to true.且沙箱默认只自动延长 30 分钟超时DEFAULT_DETACHED_SANDBOX_TIMEOUT超长渲染需自行调大detachedSandboxTimeoutInMilliseconds版本一致性是硬约束沙箱内渲染器版本取自本地remotion/version本地remotion/remotion/*版本不一致会导致行为不确定因此 README 要求所有包使用--save-exact的同一版本。小结remotion/vercel把“打包 → 沙箱环境准备 → 渲染 → 产物分发”拆成了 6 个职责单一、可组合的 APIcreateSandbox负责一个开箱即用的 Node 24 渲染沙箱含系统依赖、glibc 2.35 补丁与 headless-shell 下载addBundleToSandbox负责 Bundle 分发renderMediaOnVercel/renderStillOnVercel负责以 JSON 配置驱动的无头渲染getRenderProgress与uploadToVercelBlob分别覆盖异步进度追踪与产物上传。对于需要在无状态云端按需生成视频的 Remotion 项目这是一条不依赖长期 GPU 实例的轻量渲染路径实现细节可直接在 packages/vercel/src/ 下按上述文件名查阅。【免费下载链接】remotion Make videos programmatically with React项目地址: https://gitcode.com/GitHub_Trending/re/remotion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

医学图像分割网络对比:FCN、U-Net与Transformer架构选型实证

医学图像分割网络对比:FCN、U-Net与Transformer架构选型实证

2026/9/8 19:43:24

简介:基于FCN、Unet、DenseUnet、TransUnet、SwinUnet、EfficientUnet的医学图像分割对比实验包,面向医学影像研究者与深度学习开发人员,采用医学细胞图像数据集构建了六大主流分割网络的统一训练与评估框架,配置灵活,…

前端html2canvas结合print-js打印页面,并解决多余空白页问题

前端html2canvas结合print-js打印页面,并解决多余空白页问题

2026/9/8 19:33:24

一、功能 前端html2canvas打印 HTML页面局部打印 二、代码 结合print-js打印页面 import html2canvas from html2canvas; import printJS from print-js;/** 打印*/const handleDownload async () > {console.log(inputRef.current.scrollWidth,inputRef.current.scrollWid…

基于Django的StockMing股票预测系统:从ORM建模到ECharts可视化全解析

基于Django的StockMing股票预测系统:从ORM建模到ECharts可视化全解析

2026/9/8 19:33:24

简介:StockMing股票预测系统是基于Django框架的完整设计源码,面向Python Web开发者、金融数据分析人员以及机器学习实践者,解决从股票数据获取、预处理到价格预测、可视化展示的一站式落地问题。资源共计646个文件,包含334个JavaS…

分清Agent Harness与Agent Runtime:职责边界与实战排查指南

分清Agent Harness与Agent Runtime:职责边界与实战排查指南

2026/9/8 20:33:27

1. 先搞清楚这俩“Runtime”为什么总被混为一谈Agent开发这两年热度一直没降过,尤其2026年前后,各个团队都在往“能自主决策、自主执行”的方向赶。只要你真正动手写过一个Agent项目,一定遇到过这种场景:代码里调一个循环执行函数…

边缘算力模组实战:从NPU选型到端侧AI部署与调优全解析

边缘算力模组实战:从NPU选型到端侧AI部署与调优全解析

2026/9/8 20:33:27

去年有个做工业质检的客户找到我,他们的检测工位装了三台工业相机,要求在200毫秒内完成缺陷识别并把结果写回PLC。一开始方案是拍图上传云端,模型跑在GPU服务器上,结果单张图传输加推理普遍超过600毫秒,网络一抖动直接…

RPCS3模拟器快速上手指南:5分钟跑通PS3游戏,附配置优化与排错方案

RPCS3模拟器快速上手指南:5分钟跑通PS3游戏,附配置优化与排错方案

2026/9/8 20:33:27

RPCS3模拟器快速上手指南:5分钟跑通PS3游戏,附配置优化与排错方案 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 RPCS3 是一款开源的 PlayStation 3 模拟器,让…

单片机毕业设计-基于 STM32 单片机的防干烧环境调控与声光报警系统设计 基于 STM32 的物联网环境监测与手机 APP 控制系统设计(011607)

单片机毕业设计-基于 STM32 单片机的防干烧环境调控与声光报警系统设计 基于 STM32 的物联网环境监测与手机 APP 控制系统设计(011607)

2026/9/8 20:33:27

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

树莓派Pico ADC实战:从原理到ISR定时采集与校准

树莓派Pico ADC实战:从原理到ISR定时采集与校准

2026/9/8 20:33:27

别的不说,单说树莓派 Pico 上这颗 ADC,真的是让人又爱又恨。爱的是它便宜大碗,RP2040 给了你 4 个外部模拟输入通道加 1 个内部温度通道,MicroPython 里 machine.ADC 几行代码就能读数;恨的是如果你只照着教程抄了个…

静态链接库与动态链接库 详解

静态链接库与动态链接库 详解

2026/9/8 20:23:26

前言:在软件开发中,库(Library)是预先编译好的可重用代码集合,开发者可以将其直接集成到自己的程序中,从而避免从零开始编写所有功能。据链接方式的不同,库主要分为静态库和动态库两大类。理解它…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…