remotion-1-4
markdown
---slug: 1-4title: Remotion 1.4author: Jonny Burgerauthor_title: 独立开发者author_url: https://github.com/JonnyBurgerauthor_image_url: https://avatars2.githubusercontent.com/u/1629785?s=460&u=12eb94da6070d00fc924761ce06e3a428d01b7e9&v=4---import {TransparentVideoDemo} from '../components/TransparentVideoDemo';欢迎阅读 Remotion 1.4 的发布说明!这是一个重要的版本,增加了对更多用例的支持,使 Remotion 更加稳定、直观和强大。## 支持 HEVC 和 WebM 编解码器现在不仅支持 H.264,您还可以将视频编码为 H.265(HEVC)或 WebM(使用 VP8 或 VP9 编解码器)。这些编解码器将导致更小的文件大小,但也有一些权衡。为了帮助您决定使用哪种编解码器,现在文档中有一个 [编码指南](/docs/encoding)。还请参阅[配置文件中更改编解码器](/docs/config#setcodec)以及[CLI 中的编解码器](/docs/cli/render#--jpeg-quality)的文档。## 透明视频您知道 Chrome 和 Firefox 支持带 Alpha 通道的视频吗?播放视频并单击下面的按钮以动态更改背景。<TransparentVideoDemo />Remotion 现在具有足够的可配置性,使您能够渲染透明视频。有一个[新的文档页面](/docs/transparent-videos)介绍了这一点,还为您提供了如何为不受支持的浏览器渲染备用视频的指导。## 新的 `random()` API假设您想在视频中渲染 100 个随机粒子。一个常见的错误是生成随机值并将其存储在状态中。以下是 Remotion 中的反模式:```tsx {5-6}export const MyComp = () => {// ⚠️ Bug! Random values will change during renderconst [particles] = useState(() => {return new Array(100).fill(true).map(() => ({x: Math.random(),y: Math.random(),}));});};
markdown
---slug: 1-4title: Remotion 1.4author: Jonny Burgerauthor_title: 独立开发者author_url: https://github.com/JonnyBurgerauthor_image_url: https://avatars2.githubusercontent.com/u/1629785?s=460&u=12eb94da6070d00fc924761ce06e3a428d01b7e9&v=4---import {TransparentVideoDemo} from '../components/TransparentVideoDemo';欢迎阅读 Remotion 1.4 的发布说明!这是一个重要的版本,增加了对更多用例的支持,使 Remotion 更加稳定、直观和强大。## 支持 HEVC 和 WebM 编解码器现在不仅支持 H.264,您还可以将视频编码为 H.265(HEVC)或 WebM(使用 VP8 或 VP9 编解码器)。这些编解码器将导致更小的文件大小,但也有一些权衡。为了帮助您决定使用哪种编解码器,现在文档中有一个 [编码指南](/docs/encoding)。还请参阅[配置文件中更改编解码器](/docs/config#setcodec)以及[CLI 中的编解码器](/docs/cli/render#--jpeg-quality)的文档。## 透明视频您知道 Chrome 和 Firefox 支持带 Alpha 通道的视频吗?播放视频并单击下面的按钮以动态更改背景。<TransparentVideoDemo />Remotion 现在具有足够的可配置性,使您能够渲染透明视频。有一个[新的文档页面](/docs/transparent-videos)介绍了这一点,还为您提供了如何为不受支持的浏览器渲染备用视频的指导。## 新的 `random()` API假设您想在视频中渲染 100 个随机粒子。一个常见的错误是生成随机值并将其存储在状态中。以下是 Remotion 中的反模式:```tsx {5-6}export const MyComp = () => {// ⚠️ Bug! Random values will change during renderconst [particles] = useState(() => {return new Array(100).fill(true).map(() => ({x: Math.random(),y: Math.random(),}));});};
虽然在预览视频时这样做可以工作,但在渲染期间,随机数将在帧之间更改。这是因为 Remotion 启动了多个 Chrome 实例,每个实例中的随机数将不同。
为了帮助您避免这种错误,现在有一个新的 ESLint 规则,当您使用 Math.random()
时会发出警告。而不是使用它,您可以使用新的 random()
API。它将接受一个 seed
参数并输出一个介于 0 和 1 之间的数字。它的作用是:只要传递相同的种子,您将获得相同的输出!这样在执行多线程渲染时就不会出现意外效果。
```tsx twoslash {7-8}import {useState} from 'react';import {random} from 'remotion';export const MyComp = () => {// ✅ Pseudo-random values that will be same across threadsconst [particles] = useState(() => {return new Array(100).fill(true).map((_, idx) => ({x: random(`x-${idx}`),y: random(`y-${idx}`),}));});};
```tsx twoslash {7-8}import {useState} from 'react';import {random} from 'remotion';export const MyComp = () => {// ✅ Pseudo-random values that will be same across threadsconst [particles] = useState(() => {return new Array(100).fill(true).map((_, idx) => ({x: random(`x-${idx}`),y: random(`y-${idx}`),}));});};
想了解更多吗?阅读有关使用随机性的新文档页面。
更多配置选项
已添加了几个新的配置选项作为 CLI 标志、配置文件条目和 SSR API:
- setCrf() 控制输出文件的质量和文件大小之间的权衡。
- setQuality() 允许您控制渲染帧的 JPEG 质量。
- setCodec() 允许您在 4 种不同的编解码器之间进行选择(如上所述)。
- setImageSequence() 允许您跳过拼接过程,仅输出图像序列。
- setImageFormat() 允许您明确选择 PNG 或 JPEG 作为渲染帧的格式。
- setPixelFormat() 有一个新的接受值,
yuva420p
,这对于透明视频是必要的。
添加了 setImageSequence()
和 setImageFormat()
以及 setCodec()
使得先前的配置选项 setOutputFormat()
和 --png
已过时。虽然它们仍然有效,但我们鼓励您使用新的配置选项,这些选项更加细粒度 - 例如,现在您可以渲染 JPEG 序列。
编辑器中的键盘控制
感谢 Arthur Denner 提交的精彩拉取请求,编辑器中的键盘导航得到了很大改善!强烈建议阅读此 PR,因为它很有见地,让您意识到使网站支持键盘导航并不难。
拼接帧的进度条
如果新添加的编解码器比默认的 H.264 慢得多,不要感到惊讶。这是正常的。但至少现在您可以随时检查渲染的进度!
## `<Sequence>` 新增 `layout` 属性有些人正确指出 `<Sequence>` 组件会绝对定位其子元素,并且没有办法退出这种行为。虽然由于向后兼容性我们现在无法更改这一点,但现在你可以传递 `layout="none"` 作为一个属性,以退出 `<Sequence>` 的任何布局影响。## 异步确定合成元数据在这个版本中有一个小的破坏性变化 - `delayRender` 在 'evaluation' 阶段起作用。这是 Remotion 分析您的项目并确定所有合成并进行一些验证的阶段。注意 `delayRender()` 调用在组件外部,因为它们现在可能会阻止评估阶段,因为在该阶段不会渲染任何组件。好处是现在您的合成可以接收异步获取的数据。例如,现在可以实现以下内容:```tsxexport const RemotionVideo: React.FC = () => {const [videoLength, setVideoLength] = useState(null)useEffect(() => {const handle = delayRender();determineVideoLength().then((duration) => {setVideoLength(duration)continueRender(handle)}).catch(err => /**/)}, [])if (videoLength === null) {return null;}return (<><Compositionid="HelloWorld"component={HelloWorld}durationInFrames={videoLength}fps={30}width={1920}height={1080}/></>)}
## `<Sequence>` 新增 `layout` 属性有些人正确指出 `<Sequence>` 组件会绝对定位其子元素,并且没有办法退出这种行为。虽然由于向后兼容性我们现在无法更改这一点,但现在你可以传递 `layout="none"` 作为一个属性,以退出 `<Sequence>` 的任何布局影响。## 异步确定合成元数据在这个版本中有一个小的破坏性变化 - `delayRender` 在 'evaluation' 阶段起作用。这是 Remotion 分析您的项目并确定所有合成并进行一些验证的阶段。注意 `delayRender()` 调用在组件外部,因为它们现在可能会阻止评估阶段,因为在该阶段不会渲染任何组件。好处是现在您的合成可以接收异步获取的数据。例如,现在可以实现以下内容:```tsxexport const RemotionVideo: React.FC = () => {const [videoLength, setVideoLength] = useState(null)useEffect(() => {const handle = delayRender();determineVideoLength().then((duration) => {setVideoLength(duration)continueRender(handle)}).catch(err => /**/)}, [])if (videoLength === null) {return null;}return (<><Compositionid="HelloWorld"component={HelloWorld}durationInFrames={videoLength}fps={30}width={1920}height={1080}/></>)}
敬请期待一个新的 API,它将允许您测量视频和音频时长!
Windows、macOS 和 Ubuntu 的端到端测试
虽然 Remotion 主要在 macOS 上开发,但其他操作系统不应该有次优的体验或出现错误。虽然它不能取代手动测试,但有助于 现在有一些用于渲染视频的端到端测试,测试套件现在在所有 3 个操作系统上运行。未来,我将添加更多测试,也鼓励贡献者这样做。
错误的资源导入的 ESLint 规则
在 Remotion 中,您不应该将 src
指定为文件路径字符串,而应导入资源。为了帮助您避免犯这个错误,有一个新的 ESLint 规则:
tsx
import {Img} from 'remotion';import hi from './hi.png';// ✅ Correct: Using an import statement<Img src={hi} />// ⚠️ Warning since 1.4: Import the asset instead<Img src="./hi.png"/>
tsx
import {Img} from 'remotion';import hi from './hi.png';// ✅ Correct: Using an import statement<Img src={hi} />// ⚠️ Warning since 1.4: Import the asset instead<Img src="./hi.png"/>
支付顶级贡献者
由于 Remotion 将通过向大公司出售许可证来赚钱,给予贡献者他们应得的份额是公平的!到目前为止,我已经向两位顶级贡献者提供了报酬,以补偿他们迄今为止花费的时间和未来潜在的工作。令人高兴的是,他们都接受了!
各种改进
接下来...
一些很棒的拉取请求已经到来,最引人注目的是添加了音频支持! 我们还在努力允许您自定义 Puppeteer 参数,并通过不下载 Chromium 的副本来加快安装过程。敬请期待更多重大改进的到来。