Skip to main content

Lambda渲染现在更快了

· 6 min read
Jonny Burger
Remotion首席黑客

通过Remotion v4.0.130,Remotion Lambda渲染现在完成得更快!
视频越长,加速效果越明显。

28.3s64.8s264.2s31.8s134.7s582.6s1 Minute video1 Minute video10 Minute video40 Minute videov4.0.129v4.0.126v4.0.129v4.0.129v4.0.126v4.0.126

使用<OffthreadVideo>标签渲染1920x1080px视频, 加载一个15MB的全高清视频并循环播放。Lambda函数已分配3000MB内存。



感谢我们与WistiaMax Schnur合作实施的创新音频串联策略,我们可以跳过最后的音频重新编码步骤。

音频是慢的部分

Remotion Lambda并行渲染视频的部分,并在最后将它们连接起来。
慢的部分实际上不是视频,而是音频渲染!

虽然其他编解码器也是可能的,但.mp4文件通常包含AAC音频。

通常在不创建任何伪影的情况下无法串联AAC块。

AAC的工作原理

AAC音频流包含许多数据包。每个数据包包含确切的1024个样本。

0102420483072409651206144716881929216102401126412288

音频的持续时间必须是1024个样本的整数倍。如果您的音频不符合,您必须用静音填充最后一个数据包!

0102420483072409651206144716881929216102401126412288

在串联AAC音频时,这种填充的静音是明显的,并且可以听到爆裂声:



为了避免这种问题,整个音频需要在最后重新编码。音频越长,问题就越严重!

一个包有依赖关系

让问题更加棘手的是,AAC 包并不是自包含的。波形还取决于前一个和后一个包!

0102420483072409651206144716881929216102401126412288

这意味着我们不能创建大小为包的音频片段并将它们连接起来,因为我们还需要包括它们的填充。

谁能解决这个问题?

在线资源如 Stack Overflow 很快就被耗尽了。

我参加了 RTC.on 多媒体会议,并在我的演讲中谈到了这个问题。

几位听众在演讲结束后走到我面前,给了我一些想法。我和 Software MansionMichał Śledź 进行了一次会话,所有这些都帮助我更好地理解我们面临的问题。

虽然没有找到立即的解决方案,但当我们意识到 libfdk-aac 编码器比 FFmpeg 的原生编码器快两倍时,问题暂时得到缓解。

连接 AAC 的创新方法

突然间,WistiaMax Schnur 提出了一个解决方案,并在 Remotion Discord 上发布了!

为了无缝连接 AAC:

  • 每个音频片段的样本数必须是 1024 的倍数
  • 每个片段的开头和结尾都应该有额外的包,以避免丢失关键帧。
  • 在连接它们时将删除额外的填充。
010242048307240965120614471688192921610240112641228801024204830724096512061447168819292161024011264122880102420483072409651206144716881929216102401126412288

要正确实现这一点有许多棘手的方面:

  • 每个音频片段需要比以前长一点,它们需要稍微重叠。需要评估额外的帧,但不需要截图。
  • 视频块不应包含填充,因此音频和视频需要分开。
  • 根据四舍五入和音频中的位置,需要 1 到 3 个额外的包。
  • inpointoutpoint FFmpeg 滤镜需要纳秒精确以进行正确的修剪。
  • 所有音频层应重新采样为相同的采样率(我们决定使用 48000 Hz)
  • 我们的时间轴定位、音量曲线、音高校正、播放速率功能需要继续工作。
  • 仅渲染时间轴的一部分将会改变起始时间戳,这会改变每个块的数学计算。
  • 视频帧率(通常为 30fps)和音频采样率(通常为 48000Hz)很少对齐。通过捕获额外的帧,我们会得到太多的填充,需要再次修剪掉每个块。
  • FFmpeg 的 atempo 滤镜不精确:例如,将 80,000 个音频样本加速 2 倍将导致 40,014 个音频样本。微小的不完美会导致无法无缝连接。为了解决这个问题,我们不得不颠倒修剪和加速音频的顺序。
  • 上面没有显示,每个 AAC 文件在文件开头有 512 个样本的静音。这会稍微延迟所有音频,但通过向 MP4 容器添加负偏移,通常可以平衡这一点。

如果考虑了所有这些因素,连接AAC块将会完全无缝!

0102420483072409651206144716881929216102401126412288

升级到 Remotion 4.0.130 或更高版本,以从 Lambda 上更快的渲染中受益。
我们期待未来为降低成本和提升用户体验而进一步改进性能!

现在您可以部署 Remotion Studio

· 4 min read
Jonny Burger
Remotion 首席黑客

现在我们可以将 Remotion Studio 导出为静态网站,并部署到任何托管提供商。

您可以与团队、客户或朋友分享生成的 URL。他们可以预览视频,并更改参数以自定义视频。

您还可以将 URL 传递给任何 Remotion 渲染 API,例如 npx remotion renderrenderMedia(),而无需克隆代码。

watercolor-map.vercel.app (模板)

作为静态网站部署

使用 npx remotion bundle 将 Remotion Studio 导出为静态网站。在 Vercel、Netlify 或其他提供商上输入此构建命令以持续部署 Studio。

在 15 秒内将模板部署到 Vercel

从 URL 渲染

您可以使用 URL 进行渲染:

bash
npx remotion render https://watercolor-map.vercel.app
bash
npx remotion render https://watercolor-map.vercel.app

您可以使用 --props 来为视频设置参数。

所有渲染 API 都支持此功能:renderMedia(), renderStill(), getCompositions(), renderMediaOnLambda(), renderFrames(), renderStillOnLambda(), getCompositionsOnLambda(), renderMediaOnCloudRun(), renderStillOnCloudRun(), npx remotion render, npx remotion still, npx remotion compositions, npx remotion lambda render, npx remotion lambda still, npx remotion lambda compositions, npx remotion cloudrun rendernpx remotion cloudrun still.

通过可视化探索代码

将序列映射回原始源代码。在部署的 Studio 中点击它们以跳转到 GitHub.com 上的源代码!

watercolor-map.vercel.app (模板)

已部署的模板

我们的模板和示例已部署为 Studio:

已部署的示例

将 Studio 部署到服务器

您还可以将 Remotion Studio 部署为长期运行的服务器,例如在 Fly.io 或 Render.com 上。
优点是 Render 按钮保持活动状态,这意味着您可以渲染和下载视频!

点击此处阅读如何将 Remotion Studio 部署到服务器.

Remotion 4.0

· 9 min read
Jonny Burger
Remotion首席黑客

欢迎来到迄今为止最大的 Remotion 更新!
通过 Remotion 4.0,我们为每个工作流程提供了显著的改进。



在每天的新视频中发现 Remotion 4.0 的新功能。

介绍 Remotion Studio

我们为 Remotion 预览添加了方便的功能 - 因此,它不仅仅是一个预览!因此,我们将其重命名为:欢迎使用 Remotion Studio。

交互式编辑 props

现在可以将合成的 props 定义为 Zod 模式。
这样做不仅会使您的 defaultProps 具有类型安全性,还可以让您在 Remotion Studio 中编辑它们。

使用图形界面直接编辑数字、字符串、数组、对象、枚举和日期。甚至可以可视化和编辑嵌套数据结构。

一旦您对所做的更改满意,甚至可以将 props 保存回您的项目。这适用于任意 JSON 数据。

阅读更多可视化编辑

渲染按钮

现在,您可以通过按下按钮来渲染资源,而不是输入 CLI 命令。

图形界面允许您发现和调整渲染的所有选项。您可以在 Remotion Studio 中跟踪渲染的进度,排队多个渲染,并在文件资源管理器中查看输出。

通过 UI 触发的每个渲染也可以像往常一样在 CLI 中进行跟踪,并与 Remotion Studio 的其他实例同步。
失败的渲染会显示堆栈跟踪,并允许使用相同配置重试。

在 Remotion Studio 中编辑的属性也可以用于使用渲染按钮渲染视频 - 这意味着您现在可以通过填写表单而不必触碰任何代码来渲染参数化视频。

了解更多:7 月 5 日:渲染按钮

由 Rust 驱动的架构

Remotion 4.0 配备了一个 Rust 二进制文件,可以加速当前和未来的功能。

内置 FFmpeg

现在安装 FFmpeg 已经不再必要,因为每个 Remotion 项目都附带了一个微小版本的 FFmpeg。

我们消除了支持多个版本的 FFmpeg 的负担,您也不必再担心安装它了。

我们提供了一个自定义构建的 FFmpeg 6.0,比您下载的版本要小得多。在 Lambda 上,它可以减少函数的冷启动时间。

我们还可以访问低级别的 C API,使我们能够做以前不可能的事情。

更快的 <OffthreadVideo>

<OffthreadVideo> 组件是将现有视频嵌入到 Remotion 项目中的首选方式。

以前,使用 FFmpeg CLI 提取帧,现在我们使用 FFmpeg C API 提取帧。因为我们可以在提取之间保持视频打开,所以这比以前快得多。

现在可以跳过不必要的冗余解码工作,这使得在渲染过程中该组件的速度提高了两倍

支持 WebP 和 PDF 生成

以前您可以使用 Remotion 生成 PNG 和 JPEG - 现在我们还支持 WebP 和 PDF!

有很多方法可以渲染静态图像:新的 渲染按钮npx remotion still 命令,renderStill() Node.JS API,在 Lambda 上渲染使用 renderStillOnLambda(),或者在 Google Cloud Run 上使用 renderStillOnCloudrun()

更易于数据驱动的视频

我们为 <Composition> 组件引入了一个新的 calculateMetadata() API。如果您想要:

根据 React 组件的 props 调整持续时间或分辨率
2
在视频渲染之前执行数据获取
3
在挂载 React 组件之前预先计算 props


为了展示新 API 的可能性,我们在文档中专门添加了一个完全专注于数据驱动视频的新部分。请参阅:参数化渲染

升级的模板

我们所有的 模板 都已升级为使用 Remotion 4.0。其中许多模板利用了新功能,例如流行的 文本转语音 模板允许您自定义文本和语音,模板将自动调整视频的持续时间以匹配。

我们还推出了两个新模板:文本转语音 (Google) 是 Azure TTS 模板的替代品,以及 [https://www.remotion.dev/templates/stargazer] 是一个用于庆祝 GitHub 星标里程碑的热门模板,现在可以使用 npm init video 进行初始化。

更多功能

在 v3.3 和 v4.0 之间添加的这些功能值得强调:

@remotion/rive

Rive 是 Lottie 的更快速更小的替代品。
通过新的 @remotion/rive 包,您可以在项目中包含 Rive 动画。

@remotion/shapes

@remotion/shapes 是一个方便的包,用于在您的组件中包含几何形状,如 <Triangle><Star><Pie>

这些组件易于动画化,纯净,无依赖,并且与 @remotion/paths 配合良好。

每个形状都可以作为一个 React 组件 <Star>,或作为一个返回 SVG 路径的纯函数 makeStar()

@remotion/tailwind

新的 Tailwind 包使您可以更轻松地在任何 Remotion 项目中安装 Tailwind。

细调音频编解码器

现在,音频编解码器不再与视频编解码器绑定,您现在可以独立选择音频编解码器

Lambda 改进

播放器改进

ES 模块支持

现在,所有可以在浏览器中导入的 API 都有一个 ES 模块版本。

字体选择器

在您的应用中,您现在可以显示一个 字体选择器,并且只在需要时动态加载字体。

新核心 API

remotion 包已经有了以下改进:

加入 Cloud Run Alpha

作为 Lambda 的对应物,我们正在开发一个 Google Cloud Run 包。
alpha 版本现已可用,通过成为早期采用者来帮助我们测试

完整变更日志

查看 GitHub 发布以查看 完整变更日志

重大变更

查看 迁移指南 以获取完整的重大变更列表。

Remotion 3.3

· 17 min read
Jonny Burger
Remotion首席黑客

不再需要安装FFmpeg!

现在,当您渲染视频且没有安装FFmpeg时,Remotion将为您下载一份副本。 以前,在Windows上安装FFmpeg需要7个步骤,在macOS上使用Homebrew时需要几分钟。

在服务器上部署Remotion时,您现在还可以让Remotion为您安装FFmpeg,使用ensureFfmpeg() API或npx remotion install ffmpeg命令。在这里了解更多关于FFmpeg自动安装的信息。

新的@remotion/google-fonts

现在很容易将Google Fonts导入到Remotion中!@remotion/google-fonts负责正确加载,并且完全类型安全!

新的@remotion/motion-blur

此包包含两个组件:<Trail><CameraMotionBlur>,帮助您实现令人惊叹的运动模糊效果!

快速演示现在称为<Trail>的内容:

新的@remotion/noise

此包提供了易于使用、类型安全的纯函数,可让您在噪音方面发挥创意。查看我们的游乐场以了解您可以做些什么!

一个展示如何使用噪声创建有趣效果的视频演示:

新的 @remotion/paths

该包提供了用于动画化和操作 SVG 路径的实用工具!通过 9 个纯净、类型安全的函数,我们涵盖了许多在处理 SVG 路径时常见的需求:

快速切换器

通过按下 Cmd+K,您可以触发一个新的快速切换器。它具有三个功能:

  • 模糊搜索一个合成以跳转到该合成。
  • 在菜单栏中输入 > ,然后跟随一个项目以触发该操作。
  • 输入 ? ,然后跟随一个搜索词来查询文档。

Remotion 核心

<Sequence> 现在使 from 可选,接受样式和引用

<Sequence from={0}> 现在可以缩短为 <Sequence>。我们的 ESLint 插件已更新,建议自动进行此重构。

如果您没有传递 layout="none",现在也可以为序列添加 style

可以将 ref 附加到 <Sequence><AbsoluteFill>

视频和音频支持 loop 属性

<Video><Audio> 组件现在支持 loop 属性。

预览

新的 CLI 输出

启动 Remotion 预览时,现在会显示预览正在运行的 URL。Webpack 输出现在也更清晰。

捏合缩放

如果您的设备支持多点触控,现在可以捏合缩放合成。或者,您可以按住 Ctrl/Cmd 并使用滚轮来缩放。

使用两根手指,您可以移动画布,按下 0 将重置画布。对于后者,在右上角还有一个按钮,您可以单击。

从 Remotion 预览中搜索文档

按下 ? 键现在有一个次要功能:您可以输入任何术语来搜索 Remotion 文档!

更短的命令

以前,Remotion CLI 命令看起来像这样:

bash
npx remotion render src/index.tsx my-comp output.mp4
bash
npx remotion render src/index.tsx my-comp output.mp4

现在,您可以跳过输出名称,此时渲染将默认保存在 out/my-comp.mp4 中:

bash
npx remotion render src/index.tsx my-comp
bash
npx remotion render src/index.tsx my-comp

您还可以省略组合名称,Remotion 将询问要渲染哪个组合:

bash
npx remotion render src/index.tsx
bash
npx remotion render src/index.tsx
note

实验性功能:我们可能会在未来更改为渲染所有组合的行为。

最后,您还可以省略入口点,Remotion 将会做出一个合理的猜测!

bash
npx remotion render
bash
npx remotion render

如果您偏离了我们模板的默认设置,您可以在配置文件中设置一个入口点,并在 Remotion 命令中省略它。

自动重新加载环境变量

如果您更改了.env文件中的值,Remotion 预览将重新加载并接收到这些值,而无需重新启动。

表示 Remotion 预览已断开连接

当使用 Ctrl+C 退出 Remotion 预览,例如渲染视频时,将会弹出一个新的弹窗,表示 Fast Refresh 将不再起作用。

渲染

--muted 渲染

可以将此新标志传递给渲染以忽略音频。如果您知道您的视频没有音频,这可以加快渲染速度。

--enforce-audio-track

如果在您的视频中未检测到音频,则现在将删除音频(除了 Lambda)。使用此新标志,您可以强制添加一个静音音轨。

--audio-bitrate--video-bitrate

这些标志允许您为音频或视频设置目标比特率。不过不建议使用这些标志,而是使用 --crf

--height--width 标志

使用这些标志,您可以忽略为输出定义的宽度和高度,并覆盖它们。与 --scale 的区别在于视口和因此布局可能实际上会发生变化。

获取最慢的帧

如果添加 --log=verbose,将按顺序显示最慢的帧,以便您可以对其进行优化。使用 renderMedia() 时,也可以通过 onSlowestFrames 回调来获取最慢的帧。

渲染静止画时出现负数

在渲染静止画时,现在可以传递负帧数来引用视频的后面帧。-1 是视频的最后一帧,-2 是倒数第二帧,依此类推。

覆盖 FFmpeg 命令

Remotion 在后台执行的 FFmpeg 命令现在可以 以 reducer 风格进行覆盖

服务器端渲染

如果渲染崩溃,恢复渲染

如果由于资源密集型而导致渲染崩溃(参见:目标关闭),Remotion 现在将重试每个失败的帧一次,以防止在资源不足的机器上长时间渲染失败。

renderMedia() 获取整体进度

以前,渲染和编码的进度是分别报告的。现在,在 onProgress 回调中有一个名为 progress 的新字段,您可以使用它来显示进度,而无需自行计算。

更简单的 bundle() 函数签名

以前,bundle() 接受三个参数:entryPointonProgressoptions

旧的 bundle() 签名
ts
import { bundle } from "@remotion/bundler";
 
bundle("./src/index.ts", (progress) => console.log(progress), {
publicDir: process.cwd() + "/public",
});
旧的 bundle() 签名
ts
import { bundle } from "@remotion/bundler";
 
bundle("./src/index.ts", (progress) => console.log(progress), {
publicDir: process.cwd() + "/public",
});

由于获取进度不如某些选项重要,现在 bundle() 接受一个包含选项、进度回调和 entryPoint 的对象:

新的 bundle() 签名
ts
import { bundle } from "@remotion/bundler";
 
bundle({
entryPoint: "./src/index.ts",
onProgress: (progress) => console.log(progress),
publicDir: process.cwd() + "/public",
});
新的 bundle() 签名
ts
import { bundle } from "@remotion/bundler";
 
bundle({
entryPoint: "./src/index.ts",
onProgress: (progress) => console.log(progress),
publicDir: process.cwd() + "/public",
});

仍支持以前的签名。

播放器

<Thumbnail> 组件

新的 <Thumbnail> 组件类似于 <Player>,但用于渲染静止画的预览。您可以使用它来显示视频的特定帧,而无需进行渲染。

tsx
import { Thumbnail } from "@remotion/player";
 
const MyApp: React.FC = () => {
return (
<Thumbnail
component={MyComp}
compositionWidth={1920}
compositionHeight={1080}
frameToDisplay={30}
durationInFrames={120}
fps={30}
style={{
width: 200,
}}
/>
);
};
tsx
import { Thumbnail } from "@remotion/player";
 
const MyApp: React.FC = () => {
return (
<Thumbnail
component={MyComp}
compositionWidth={1920}
compositionHeight={1080}
frameToDisplay={30}
durationInFrames={120}
fps={30}
style={{
width: 200,
}}
/>
);
};

播放器 frameupdate 事件

除了 timeupdate 之外,您还可以订阅 frameupdate,它会在当前帧更改时触发。您可以使用它来渲染自定义的帧精确时间显示。

播放器音量滑块具有响应性

如果播放器显示在一个狭窄的容器中,音量控制现在会向上移动,而不是向右移动,以节省一些空间。

获取播放器的比例

使用命令式的 getScale() 方法,您现在可以看到显示大小与组件画布宽度的比较。

控件最初显示

在 YouTube 上,视频始终以显示控件的状态开始,然后在几秒钟后淡出。我们也将这种行为作为 Remotion 的默认行为,因为用户经常意识不到播放器是可交互的。您可以使用 initiallyShowControls 控制这种行为。

播放视频的某个部分

使用 inFrameoutFrame 属性,您可以强制 Remotion 播放器仅播放视频的某个部分。其余的寻找栏将变为灰色。

自定义播放按钮和全屏按钮

使用 renderPlayPauseButtonrenderFullscreenButton,您可以更细粒度地自定义播放器的外观。

从偏移开始播放器

您可以定义组件挂载时的 initialFrame。这将是视频的默认位置,但不会像 inFrame 属性那样限制播放范围。```

新的 prefetch() API

除了Preload APIs之外,prefetch()提供了另一种预加载资源的方式,以便在 Remotion Player 中应该显示时准备好显示。

Prefetching API
tsx
import { prefetch } from "remotion";
 
const { free, waitUntilDone } = prefetch("https://example.com/video.mp4");
 
waitUntilDone().then(() => {
console.log("Video has finished loading");
free(); // Free up memory
});
Prefetching API
tsx
import { prefetch } from "remotion";
 
const { free, waitUntilDone } = prefetch("https://example.com/video.mp4");
 
waitUntilDone().then(() => {
console.log("Video has finished loading");
free(); // Free up memory
});

如果可用,视频和音频标签将自动使用预取的资源。查看@remotion/preload vs. prefetch()进行比较。

Remix 模板

Remix 模板是我们的第一个 SaaS 模板!它包括 Remotion 预览、播放器和 Remotion Lambda,可立即为您提供所需的一切,以创建提供定制视频生成的应用程序。



通过运行以下命令开始:

bash
npx create-video --remix
bash
npx create-video --remix

Lambda 改进

Webhook 支持

现在,您可以在 Lambda 渲染完成或失败时发送和接收 Webhook。我们已添加了 Next.js 和 Express 应用程序的示例,并且我们的文档页面提供了发送测试 Webhook 的方法。

提高的负载限制

以前,传递给 Lambda 渲染的输入属性在序列化时不能超过 256KB。现在,由于负载较大,此限制已被取消,因为如果负载较大,它将被存储到 S3 中,而不是直接传递给 Lambda 函数。

Lambda 生成物件可以保存到其他云端

Lambda 生成的输出视频现在可以保存到其他兼容 S3 协议的云端,例如 DigitalOcean Spaces 或 Cloudflare R2。

从 Lambda 删除渲染

新的deleteRender() API 将从 S3 存储桶中删除输出视频,以前您必须通过控制台或使用 AWS SDK 执行此操作。

使 renderMediaOnLambda() 参数可选

以下选项现在是可选的:

基准命令

新的 npx remotion benchmark 命令帮助您比较不同的渲染配置,并找出哪个是最快的。目前,您可以比较不同的编解码器、组合和并发值。为了增加结果的可信度,每个配置都会运行多次。

新指南

我们添加了新的指南,记录了 Remotion 的有趣工作流程:

我们尽量避免术语,但我们还创建了一个 Remotion 术语表 页面,以定义一些常用术语。在使用这些术语时,我们将从现在开始链接到术语页面,让您了解更多。

模板中的更好结构和命名

在模板中之前称为 src/Video.tsx 的文件现在称为 src/Root.tsx,因为它不包含视频,而是包含一组组合。该组件也从 RemotionVideo 重命名为 RemotionRoot。新的命名更有意义,因为该组件被传递到 registerRoot() 中。

显著改进

获取 GIF 的持续时间

新函数 getGifDurationInSeconds() 允许您获取 GIF 的持续时间。

Lottie动画方向

使用新的direction属性,您可以将Lottie动画向后播放。

Lottie嵌入式图像

如果Lottie动画包含嵌入式图像,现在将正确等待。

临时目录清理

Remotion创建的临时目录现在在每次渲染后完全清理。

如果内存不足,则关闭并行编码

当机器的可用RAM较少时,将不使用并行编码。您还可以使用disallowParallelEncoding强制禁用它。

谢谢

感谢这些贡献者实现了这些出色的功能:

许多贡献是在 Hacktoberfest 期间进行的,我们在 GitHub 问题上设置了赏金。我们还要感谢 CodeChem 赞助了部分赏金!

我们筹集了18万瑞士法郎,以简化程序化视频!

· 4 min read
Jonny Burger
Remotion首席黑客

我们很高兴地宣布,我们从Remotion用户和客户那里筹集了18万瑞士法郎!

通过我们的首次融资,我们将使您更轻松地以编程方式创建视频和视频应用程序。我们将推出新的组件、模板和工具,帮助您用更少的代码构建更多内容。

我们的投资者使用Remotion

我们的投资者阵容包括使用Remotion进行娱乐或构建业务的公司和个人。

我们很高兴与理解我们愿景并能帮助我们建立相关联系的投资者合作。

For One Red

Design Studio

Heiko Hubertz

Founder & CEO, Oxolo

Simon Schmid

Product, iubenda

William Candillon

Can it be done in React Native?

Sébastien Lorber

This Week in React, Docusaurus

Nick Dima

Senior Engineering Manager, Musixmatch

Stephen Sullivan

Founder, Middy.com

Dominic Monn

Founder, MentorCruise

Jeremy Toeman

Founder, augxlabs.com

Robbie Zhang-Smitheran

Cameo.com

Ilya Lyamkin

Senior Software Engineer, Spotify

Lucas Pelloni

Co-Founder, Axelra

Michiel Westerbeek

Co-Founder, Tella

David Salib

Co-Founder, Momento

使Remotion更易于创意人士使用

我们收到的头等反馈是,在React中编写视频是强大的,但简单的事情可能很难。幸运的是,几乎任何React中的复杂性都可以抽象出来,打包,发布到NPM并与他人共享。

虽然我们的低级原语将永远存在,但我们还将开发解决人们面临的常见需求的更高级组件。这将使更多的开发人员,不仅仅是React专家,可以使用Remotion。

我们还鼓励我们的社区为Remotion创建构建块,并赞助开发人员以及帮助他们将其工作商业化。

实现新的商机

使用Remotion PlayerRemotion Lambda,我们提供了API,允许您构建为最终用户生成视频的应用程序。

我们有很多机会使使用Remotion构建应用程序变得更容易。我们将发布UI元素、SaaS模板,甚至支付集成的最佳实践,这样公司就可以更快地实现Remotion解决方案,并用更少的资源。

为什么我们“只”筹集了 180,000 瑞士法郎?

我们意识到初创公司通常在较早阶段筹集的资金比我们少。与此同时,他们面临由于资金耗尽而导致失败的高风险。

凭借我们筹集的资金,我们不仅能够继续,而且能够加速我们的运营,并增加我们的公司许可证收入,从而有信心长期留在这里。

Remotion是一个繁荣的社区,包括商业客户、创意编码人员、专业的Remotion自由职业者和独立黑客,他们的利益是我们的长期成功。我们的目标是与我们的社区一起健康成长!

谢谢…

感谢所有尝试过Remotion的人,发送了拉取请求,发推文或提交了错误报告的人。看到人们相信我们提出的想法是一种巨大的激动,我们非常荣幸能够继续致力于这些想法。

Remotion 3.2

· 6 min read
Jonny Burger
Remotion首席黑客

在这个版本中:创建视频的方式更多,工作流程更好!

Lottie支持

宣布官方 @remotion/lottie 包,包括 类型安全组件 和详尽的 文档。 使用 Lottie,您可以从 LottieFiles 导入成千上万的预制动画,我们甚至制作了一个指南,介绍了 如何导入在After Effects中创建的动画

在Remotion中嵌入的Lottiefiles动画:1, 2, 3

要开始,请将 @remotion/lottie 安装到您的Remotion项目中,并导入 <Lottie> 组件:

bash
npm i @remotion/lottie
bash
npm i @remotion/lottie

感谢 Arthur Denner 实现了这个功能!

React Native Skia支持

使用 @remotion/skia 包,您现在可以在Remotion中使用 React Native Skia!感谢我们的合作者 William CandillonChristian Falch,Remotion现在是React Native Skia的一流目标。

查看史诗公告视频阅读文档 并使用以下内容制作您的第一个视频:

bash
npx create-video --skia
bash
npx create-video --skia

可缩放的时间轴

我们的时间轴具有一些新功能,使其更像传统视频编辑器。您现在可以放大和缩小时间轴,以更好地专注于视频的某个部分。播放视频时,时间轴会随着光标移动。使用光标或键盘进行快进也会滚动时间轴,使光标始终在视口内。

另一个新的时间轴功能是现在每秒会出现刻度线,当放大时,会出现表示单帧位置的较小刻度线。这应该有助于您确定自己在视频的哪个时间点。

音频和视频渲染的改进

现在,您可以通过在渲染中传递 --muted 来明确删除视频的音频。现在,不包含音频的视频渲染速度更快,因为我们不再包含静音音轨(使用 --enforce-audio-track 来获得旧行为)。

现在,仅音频渲染速度更快,因为 Remotion 不会等待视频标签进行定位。

现在,仅视频渲染速度更快,因为不需要下载任何资产以包含在音频轨道中。

便捷功能

  • 现在,预览中的后退和前进按钮可以正常工作。
  • Remotion Lambda 现在可用 Chrome 104,这意味着您可以使用便捷的转换快捷方式
  • 您现在可以在 Remotion Lambda 上渲染 ProRes。
  • 如果您正在渲染到禁用 ACL 功能的存储桶,则 Remotion Lambda 现在具有 privacy: "no-acl" 选项。
  • Remotion Lambda 现在支持 downloadBehavior 属性,使得在浏览器中单击输出文件链接时,它将下载而不是在浏览器中播放。
  • 不再需要向 npx remotion render 命令添加输出文件名,现在默认为 out/{composition-id}.{extension}
  • <Player> 现在具有新的 moveToBeginningWhenEnded 属性,确定视频到达结尾且不循环时播放器是否返回到开头。
  • <Player> 现在具有新的 fullscreenchange 事件,允许您
  • 您现在可以为 <Player> 分配一个 className

开发者体验

  • 新的 ESLint 规则,如果您将相对路径或远程 URL 传递给 staticFile,则会发出警告:staticFile("../my-file.png")staticFile("https://example.com")
  • 在 Remotion Lambda 上更好的错误消息,当您渲染到的存储桶缺少 s3:ListBucket 权限时。
  • 当将以 .gif 结尾的文件传递给 <Img> 组件时,ESLint 会发出警告。
  • 更好的错误消息和帮助页面,当在另一个无服务器函数中调用 renderMediaOnLambda() 且 AWS 凭证发生冲突时。
  • 更好的错误消息和帮助页面,当渲染到一个 ACL 已禁用但您将隐私设置为 publicprivate 的存储桶时。

显著的错误修复

  • <Player> 现在在 React 18 严格模式下可以正常工作。
  • 预览服务器不应再在任何情况下崩溃。
  • Remotion 现在会清理任何临时创建的文件,不会污染硬盘。
  • 在项目根目录之外执行 npx remotion 命令现在可以正常工作。
  • 如果未安装 code 命令,则 Open in VS Code 现在可以正常工作。
  • 当使用 <Video> 时,Remotion Lambda 现在使用的内存更少,更不容易崩溃。

内部

  • CLI 配置代码已从 remotion 移动到 @remotion/cli,使 remotion 包减小了 30%。
  • 我们从某些包中的 jest 迁移到了 vitest
  • puppeteer-corechalk 依赖已内联。
  • 我们采用了 Node.JS Corepack。

Remotion 3.1

· 7 min read
Jonny Burger
Remotion首席黑客

此版本支持将GIF作为输出格式,官方支持Tailwind,并使弹簧和序列更容易!此外,我们回顾了从v3.0.1到v3.0.31的最佳功能!🎉

作为GIF渲染

要渲染为GIF而不是视频,在渲染过程中传递--codec=gif标志。我们调整了Remotion的渲染过程,以适应GIF的特殊性:

  • 通常,GIF的帧速率在10-15范围内,因此您无需重构视频,可以使用--every-nth-frame标志。

  • GIF可以循环播放 - 使用--number-of-gif-loops标志,您可以控制GIF的循环行为!

  • 您甚至可以使用Remotion Lambda在许多小VM上分布式渲染您的GIF!

您可以在GIF中放置

TailwindCSS支持

在一段时间内出现问题后,TailwindCSS支持现在已经稳定,我们甚至为其制作了一个起始模板!要开始,请访问我们的主页,从模板生成GitHub存储库,通过StackBlitz在线尝试,或在终端中键入以下内容:

bash
npx create-video --tailwind
bash
npx create-video --tailwind

是的,现在您可以使用Tailwind编写GIF。

持续时间的弹簧

现在您可以这样做:

tsx
const fps = 30;
 
const value = spring({
fps,
frame,
config: {
damping: 200,
},
durationInFrames: 300,
});
tsx
const fps = 30;
 
const value = spring({
fps,
frame,
config: {
damping: 200,
},
durationInFrames: 300,
});

结果将是一个持续10秒的弹簧动画!

为什么这是一个如此重要的变革?通常,弹簧动画曲线不是由时间定义的,而是由物理参数定义的。这使得规划变得相当复杂,因为弹簧的持续时间并不明确定义。从理论上讲,弹簧动画永远不会结束,它会永远持续下去(尽管一段时间后,移动几乎是不可察觉的)。

我们之前引入了measureSpring(),它允许您通过设置阈值来计算弹簧的持续时间。

但是要更改弹簧的持续时间,您必须更改物理参数,这将进而改变动画曲线!

直到现在 - 如果将持续时间传递给弹簧,我们将检测曲线的轨迹并拉伸它,使其适合您的持续时间。

<OffthreadVideo> 组件

此组件 是一个替代<Video> 组件的组件,它使用FFMPEG提取帧并在<Img> 标签内呈现它们。

我们制作了<OffthreadVideo> 组件,以解决用户在<Video> 标签中报告的寻找和限制问题。新的方式提高了可靠性,但也有其权衡之处 - 阅读<OffthreadVideo> vs <Video> 或查看我们在Instagram上的视觉解释

在Instagram上关注我们,我们会用视觉方式解释概念!

renderMedia() 返回一个缓冲区

以前,只能在使用 renderMedia()stitchFramesToVideo() API 时将视频保存到文件中。现在它还可以返回一个 Node.JS Buffer

@remotion/preload

这个新包提供了三个 API,非常方便地在它们出现在 <Player> 中之前预加载资源:resolveRedirect()preloadAudio()preloadVideo()

侧边栏改进

如果您的屏幕空间有限,现在您也可以隐藏左侧的侧边栏了!

内置颜色选择器

在预览中,转到 Tools -> Color picker 来触发一个取色器,允许您从屏幕中选择任何颜色!目前只有 Chrome 启用了这个功能。

高级用户

  • 以前,您不能将 <Composition> 包装在 React 上下文(例如 Redux)中,但现在支持了!
  • 如果在 Lambda 渲染中添加 --log=verbose,您将看到哪些帧渲染时间最长。
  • 如果在预览中为 --props 提供一个文件,现在如果属性发生变化,预览将重新加载。
  • 在预览中按 A 跳转到视频的开头,按 E 跳转到结尾。
  • 在预览中播放视频,然后按 Enter 暂停视频并返回到视频开始播放的位置。
  • 如果 layout="none" 未设置,<Sequence> 现在可以有一个 style 属性!
  • 您可以自定义 Remotion Lambda 渲染的二进制文件,例如切换使用的 Emoji 字体。
  • 现在可以使用 delayRender() 推迟 registerRoot() 调用,以便首先完成异步加载任务。

幕后

我们欢迎帕特里克加入我们的实习生团队!正如您在我们的新团队页面上所看到的,我们现在是一个由三人组成的团队,并且正在为我们的第一轮筹款做准备。

帕特里克的第一个 Remotion 视频!

Remotion 在 React Summit 上赢得了“最令人兴奋的技术应用奖” - 我们归功于您!

未来,我们希望通过新工具、模板和提示使 Remotion 更易于使用!

如果 Remotion 更快会不会更好 - 我正在探索多种选项,从替代并发模型到基于 C++ 的渲染解决方案 - 敬请关注即将到来的内容 🚀

Remotion 3.0

· 7 min read
Jonny Burger
Remotion首席黑客

经过超过10个月的开发和1400次提交,很高兴地宣布Remotion 3.0!

我相信Remotion Lambda是我编写过的最好的软件。这是完成我们愿景所需的最后一块拼图:用于开发视频应用程序的全栈!享受更新日志,如果还没有,请查看Remotion 3.0预告片

宣布Remotion Lambda

Remotion Lambda是基于AWS Lambda的分布式视频渲染器。它适用于自托管,因此您可以将其部署到您的AWS帐户中。一旦您的Lambda函数启动,您可以为其提供渲染任务,它将将其拆分为许多小工作单元,并通过多次生成自身并行处理这些任务。

Lambda是所有世界的最佳选择:

  • 快速:Lambda可以比最快的消费者计算机快多次渲染视频。视频越长,速度增益越高。Remotion Lambda预告片的渲染时间从60秒缩短到15秒,一部2小时的视频仅需12分钟[1]

  • 便宜:您只在渲染时支付费用。Lambda函数使用ARM架构,具有最佳的价格性能效率。

  • 可扩展:您可以同时渲染多个视频。Lambda的并发限制适用,但可以增加。

  • 简单:Chromium和FFMPEG已经预安装,我们处理了所有边缘情况。您只需要编写您的视频,按照部署函数和调用渲染的步骤即可。

所有功能均可通过CLI命令和Node.JS函数使用。我们编写了45页的文档,向测试人员发布了50多个alpha版本,并编写了许多从单元测试到端到端测试的测试。Lambda已经成熟,并且被像ComboJupitrr这样的公司用于生产。

并行渲染和编码

以前,渲染帧并将它们拼接成视频是一个顺序过程,其中一个步骤只能在另一个步骤完成后开始。在 Remotion 3.0 中,拼接可以在渲染仍在进行中时开始!这将平均加快速度10-15%。

此外,现在下载音频资产的时间点提前到了渲染管道中,如果您依赖远程音频,您也应该看到一个明显的加速。

新的 renderMedia() API

@remotion/renderer 中添加了一个新函数叫做 renderMedia()。它结合了已经存在的函数 renderFrames()stitchFramesToVideo(),并利用了新的并行渲染管道。它可以渲染视频和音频,并且需要更少的参数,因此在速度和易用性上都是一个胜利!

新的 openBrowser() API

由于打开和关闭浏览器实例可能需要时间,我们引入了一个名为 openBrowser() 的新 API,用于打开一个 Puppeteer 实例,您可以在 SSR API 中使用:renderMedia()renderStill()getCompositions()renderFrames()

更好的错误报告

我们正在采取措施使错误更易于理解。尽管到目前为止,大部分错误处理都是由第三方库处理的,但我们已经内联了逻辑,使我们能够简化它。缩小的错误正在被符号化,我们实现了一个新的错误叠加层,超时错误更具描述性。请告诉我们您的想法!

在远程 Lambda 函数内部的 Chrome 浏览器中发生的缩小错误显示了正确的堆栈跟踪!

我们的自定义错误叠加层可以打开有问题的文件,查找类似的 GitHub 问题。

配置文件现在可以导入其他文件。

remotion.config.ts 文件中,您现在可以导入其他文件。在底层,我们使用 ESBuild 而不是 Typescript 来读取文件。这是一个痛点:Node.JS API 不会从配置文件中读取,并要求您明确指定选项。迄今为止,CLI 和 Node.JS 渲染之间无法以良好的方式共享配置,例如 Webpack 配置覆盖,我们通过这个更改来解决这个问题。

支持 React 18

现在支持 React 18,并建议您升级到它。请查看我们的 React 18 升级指南 以了解如何进行升级!

Node 14,ESLint 8

保持我们的堆栈现代化可以让我们更快地前进,同时也消除依赖关系。

在 Remotion 3.0 中,不再支持 Node 12,并且我们正式支持 Node 18。 我们的 ESLint 配置已更新以利用 ESLint 8,这也是官方支持的。

如何更新

阅读 迁移指南 以更新到 Remotion 3.0。最严重的破坏性更改围绕着服务器端渲染,旨在使其更快速和更简单。除了 SSR 更改和 Node 14 要求之外,不应该出现其他破坏性更改。


[1] 请查看 预告片存储库 以获取如何复制的说明。

[2] 在 us-east-1 地区的温暖 Lambda 上,使用 --frames-per-lambda=1080 在 Remotion 存储库的 example 文件夹中渲染 2hrvideo 组合,Lambda 函数在 arm64 架构上运行,内存为 2048MB。

Remotion 2.6

· 5 min read
Jonny Burger
Remotion 创始人

这个版本的最大公告是@remotion/player包现在已经普遍可用 - 但不仅如此,我们还有一些其他很棒的新功能!

<Player/> 稳定了



使用 <Player/> 组件,您可以在 React 应用程序中嵌入 Remotion 视频,而无需渲染视频。API 的设计模仿了许多开发人员已经熟悉的原生 HTML <video> 标签。

该 API 允许您使用我们预定义的控件,或者构建您自己的控件。熟悉的 UI 模式,如音量滑块、全屏按钮,以及手势机制,如单击播放/暂停都得到支持。

您可以在运行时动态更新视频的属性,从而创造出一个令用户惊叹的体验:视频会根据用户输入做出反应!

在移动设备上,限制性政策阻止自动播放音频内容。我们帮助您设计您的播放器,以便在尽可能多的情况下播放音频,同时仍然遵守浏览器政策。这包括选项来挂载静音音频标签,当用户与页面交互时激活它们,并稍后使用它们来播放音频。

在这个版本中,我们添加了一个新的 renderLoading 属性,并编写了关于如何扩展您的播放器在 Remotion 和 Create React App/Next.JS 之间共享代码以及预加载资源的文档。

查看 @remotion/player 的首页
演示和文档

新的错误叠加

最近,我们破坏了当您的代码包含错误时弹出的错误叠加层。现在已经修复,而且我们比以往更深入地进行了修复!



现在,快速刷新和错误叠加已经内联到我们的代码库中,并允许进行适合 Remotion 的自定义。叠加现在与 Remotion 预览的深色主题相匹配,并包含方便的链接,例如在编辑器中打开文件,查找错误在我们的 GitHub 问题中以及我们的 Discord 社区。

/public 文件夹的支持

您现在可以将静态文件放在 Remotion 项目中的 /public 文件夹中,并使用新的 staticFile() API 加载它。 如果在 Create React App 或 Next.JS 项目中包含新的 <Player /> 组件,则该文件夹可以在 Remotion 和您正在使用的框架之间共享。

<Audio /><Video /> 现在支持 data: URL

数据 URL 现在是 <Audio /><Video /> 标签的有效来源。例如,这对于以编程方式生成的音调非常有用。为了帮助开发这类项目,@remotion/media-utils 项目中添加了一个新的 API:audioBufferToDataUrl()。请查看我们节日版的 Tone.js 示例项目!

新的音频图模板

运行 npm init video 时,现在有一个新模板可供选择:"音频图"!这个模板允许您将播客片段转换为干净的可视化效果,您可以在社交媒体上发布。

getCompositions() 现在返回 defaultProps

已更新 getCompositions() API,以返回每个组合的一个新字段:您为该组合指定的 defaultProps

其他

  • 修复了在应该结束后继续播放在 <Player /> 中的视频。
  • 修复了 <Player />ended 事件未正确触发的问题。
  • 修复了在安装过程中可能出现的某些漏洞消息。
  • 更新了 @remotion/three,以使用 React Three Fiber v7。

接下来

下一个版本终于将是我们的新主要版本,其中包含我们的渲染管道和无服务器渲染支持的重构。请密切关注,因为我们发布我们的程序化视频愿景中缺失的最后一块拼图!

I'm ready to translate the Markdown content into Chinese. Please go ahead and paste the content for translation.

Remotion 2.5

· 8 min read
Jonny Burger
Remotion 创始人

我们很高兴地宣布 10 月份的版本发布!我们在许多领域进行了工作,这些改进肯定会提高您的生产力!

In/Out 标记

您可能已经从类似 After Effects 和 Davinci Resolve 的程序中了解到此功能。它就像它的用途一样简单:您可以设置“In”标记和“Out”标记,预览将仅播放这两个时间戳之间的内容。这使得在不必观看整个视频的情况下,更容易地通过视觉方式“调试”视频的某个部分。

感谢 Ankesh 实现了此功能!

<Loop> 组件

以前,为了重复内容,您必须手动创建一堆序列并自行计算时间戳。我们添加了一个名为 <Loop /> 的辅助程序,它将无限次或固定次数重复其子元素。 另一个好处是我们在时间轴中清晰地显示循环组件。

感谢 Brian Pederson 实现了此功能!

支持不同的播放速率

您现在可以在编辑器中更改播放速率,并以慢动作、快进甚至倒放的方式播放视频!我们支持 -4x 到 4x 之间的速度。这使得调试看起来不流畅的动画变得更加容易。

它还适用于 <Player />!查看新的 playbackRate 属性,我们还添加了一个 ratechange 事件 - 就像原生的 HTML5 Video 元素一样。

感谢Brian Pederson实现了这个功能!

支持 J, K, L 键盘快捷键

这些新的快捷键对于在时间轴中导航非常方便。使用 L 键,您可以像平常一样播放视频。再次按下 L 键将加快速度到 2x,总共按下 L 三次将以 4x 播放视频。

J 键的功能相同,但是会倒放视频。现在,即使视频正在播放,您也可以使用这两个键轻松到达视频的任何点,而无需使用鼠标。

一旦到达想要暂停视频并继续编码的点,K 键将重置播放速率为 1x 并暂停视频。

一旦学会使用 JKL 键进行导航,您将再也不需要使用鼠标来快进了!

感谢Brian Pederson实现了这个功能!

tip

按下 ? 按钮了解所有键盘快捷键!

durationInFrames={Infinity} 现在是可选的

如果您想要延迟一个元素但不限制其持续时间,您必须显式指定 durationInFrames={Infinity}。不再需要了!这现在是默认值,可以省略。 如果您升级了 @remotion/eslint-config 包,我们甚至会在启用自动修复时自动删除该属性!

感谢Khalid Ansari实现了这个功能!

Fig 自动补全

如果您不了解Fig,它是一个为终端提供自动补全的免费 macOS 应用程序。听起来像是个噱头,但实际上效果出奇的好,如果没有它,我个人会感到很遗憾!您可以使用 npx remotion 调用的 Remotion CLI 现在在 Fig 中完全支持自动补全!您只需安装 Fig 即可。

感谢 Mattèo Gauthier 实现了这个功能!

Node.JS 17 支持

这个版本最近发布,破坏了几乎所有的 Webpack 项目,因为传统的加密功能被移除了。

我们对我们的默认 Webpack 配置进行了必要的修改,并且甚至向 Webpack 贡献了一个拉取请求来修复最后剩下的一个会导致 Remotion 在 Node 17 下崩溃的 bug!如果你正在升级 Node,请务必获取 Remotion 的这个新版本。

Monorepo 迁移到 pnpm

对 Remotion 的贡献者们来说,以前经常很难正确设置我们的 monorepo。确实很难正确地链接所有的包,而且很容易搞砸并遇到错误消息。

这就是为什么我们很高兴迁移到了 pnpm,它消除了链接问题,同时也显著加快了安装速度。在你的 CI 系统中,我们看到构建时间减少了 40%,这使得迭代速度更快。

感谢 Sergio Moreno 实现了这次迁移!

“空”模板

npm init video / yarn create video 添加了一个新模板:空模板。 这个模板只包含最基本的 Remotion 样板和一个完全空白的画布。对于那些已经熟悉 Remotion 并希望每次都跳过删除 Hello World 项目的人来说,这是特别有用的。

感谢 Aneesh Relan 创建了这个模板!

将视频渲染到 out 文件夹

以前,默认情况下,视频会被渲染到项目根目录的 out.mp4 中。这也意味着为了在 Git 中忽略它,我们默认有一个复杂的 .gitignore,它会忽略根目录中的视频文件,但会反向忽略其他视频文件。 现在是简化的时候了:从现在开始,默认情况下我们将文件渲染到一个 out 文件夹中,并简单地忽略该文件夹。

感谢ahmadrosid实现了这个功能!

@remotion/three 的更新

对于使用 @remotion/three 的用户来说,有一些有趣的更新:

  • Three Canvas 现在被包裹在 <Suspense> 中,并且在内容加载完成后(解除悬挂)才进行渲染。这与 React Three.JS 生态系统更好地配合,现在像 drei<Environment /> 组件将可以直接使用。
  • 我们现在默认使用 angle OpenGL 引擎来适配 Google Chrome,在经验测试中发现它在各个平台上对 Three.JS 内容有最佳的整体支持。

更多更新

  • 增加了对 OTF 字体的支持 - 感谢William Candillon
  • 增加了自定义 <Player> 错误消息的可能性 - 感谢AudreyKj
  • 修复了 Windows Node.JS 14 清理错误 - 感谢Raznov
  • 将 Docusaurus 升级到最新版本,获取最新功能和布局

Hacktoberfest 总结

我们选择参加 Hacktoberfest,并在11个问题上设置了 100 美元的赏金作为额外激励! 每一个问题都已被解决!每位贡献者都做得很好,许多人远远超出了我们的期望!

感谢所有参与并贡献于此版本的人!