Skip to main content

<OffthreadVideo>

从 Remotion 3.0.11 开始可用

此组件导入并显示视频,类似于 <Video/>,但在渲染期间,从视频中提取精确的帧并在 <Img> 标签中显示。此提取过程在浏览器外部使用 FFmpeg 进行。

此组件旨在解决默认 <Video> 元素的限制。请参见:<Video> vs <OffthreadVideo>.

示例

tsx
import { AbsoluteFill, OffthreadVideo, staticFile } from "remotion";
 
export const MyVideo = () => {
return (
<AbsoluteFill>
<OffthreadVideo src={staticFile("video.webm")} />
</AbsoluteFill>
);
};
tsx
import { AbsoluteFill, OffthreadVideo, staticFile } from "remotion";
 
export const MyVideo = () => {
return (
<AbsoluteFill>
<OffthreadVideo src={staticFile("video.webm")} />
</AbsoluteFill>
);
};

您也可以从 URL 加载视频:

tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" />
</AbsoluteFill>
);
};
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" />
</AbsoluteFill>
);
};

属性

src

要渲染的视频的 URL。可以是远程 URL 或使用 staticFile() 引用的本地文件。

startFrom?

将在视频开头删除一部分。

在以下示例中,我们假设合成的 fps30

通过传递 startFrom={60},播放立即开始,但视频的前 2 秒将被裁剪掉。
通过传递 endAt={120},文件中 4 秒标记后的任何视频将被裁剪掉。

视频将播放从 00:02:0000:04:00 的范围,意味着视频将播放 2 秒。

tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
src={staticFile("video.webm")}
startFrom={60}
endAt={120}
/>
</AbsoluteFill>
);
};
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
src={staticFile("video.webm")}
startFrom={60}
endAt={120}
/>
</AbsoluteFill>
);
};

endAt?

在视频结尾删除一部分。请参见 startAt 以获取解释。

transparent?v4.0.0

如果设置为 true,帧将被提取为 PNG,从而实现透明度,但也会减慢渲染速度。

如果设置为 false默认),帧将被提取为位图(BMP),这更快。

volume?

允许您控制整个轨道的音量或根据每帧更改音量。请参阅 使用音频 指南以了解如何使用。

使用静态音量的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo volume={0.5} src={staticFile("video.webm")} />
</AbsoluteFill>
);
};
使用静态音量的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo volume={0.5} src={staticFile("video.webm")} />
</AbsoluteFill>
);
};
在 100 帧内逐渐增加音量的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
volume={(f) =>
interpolate(f, [0, 100], [0, 1], { extrapolateLeft: "clamp" })
}
src={staticFile("video.webm")}
/>
</AbsoluteFill>
);
};
在 100 帧内逐渐增加音量的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
volume={(f) =>
interpolate(f, [0, 100], [0, 1], { extrapolateLeft: "clamp" })
}
src={staticFile("video.webm")}
/>
</AbsoluteFill>
);
};
note

在 iOS Safari 上,无法精确地更改媒体标签的音量。
浏览器只会尊重值 01

loopVolumeCurveBehavior?v4.0.142

控制在使用 volume 回调函数并将 OffthreadVideo 包装在 <Loop> 中时返回的 frame

可以是 "repeat"(默认值,在每次迭代时从 0 开始)或 "extend"(保持增加帧)。

style?

您可以传递任何您可以传递给本机 HTML 元素的样式。请记住,在渲染期间,<OffthreadVideo> 渲染一个 <Img> 标签,但在预览期间使用 <video> 标签。

tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<Img
src={staticFile("video.webm")}
style={{ height: 720, width: 1280 }}
/>
</AbsoluteFill>
);
};
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<Img
src={staticFile("video.webm")}
style={{ height: 720, width: 1280 }}
/>
</AbsoluteFill>
);
};

allowAmplificationDuringRender?v3.3.17

使 volume 大于 1 的值在渲染期间产生放大效果。
在预览期间,音量将被限制为 1,因为浏览器无法放大音频。

name?v4.0.71

在 Remotion Studio 时间轴中显示为序列标签的名称。此属性仅用于帮助您在时间轴中跟踪项目。

toneFrequency?v4.0.47

调整音频的音调 - 仅在渲染期间应用。

接受介于 0.012 之间的数字,其中 1 代表原始音调。小于 1 的值会降低音调,而大于 1 的值会增加音调。

toneFrequency 为 0.5 会将音调降低一半,而 1.5 会将音调增加 50%。

onError?

处理播放视频时出现的错误。从 v3.3.89 开始,如果传递了一个 onError 回调,则不会抛出异常。以前,无法捕获错误。

playbackRate?v2.2.0

控制视频的播放速度。1 是默认值,表示正常速度,0.5 会减慢视频速度,使其变为原来的两倍长,2 会加快视频速度,使其变为原来的两倍快。```

虽然 Remotion 不限制可能的播放速度范围,在开发模式下使用 HTMLMediaElement.playbackRate API,对极端值会抛出错误。在撰写本文时,Google Chrome 如果播放速度低于 0.0625 或高于 16 会抛出异常。

视频以两倍速播放的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo playbackRate={2} src={staticFile("video.webm")} />
</AbsoluteFill>
);
};
视频以两倍速播放的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo playbackRate={2} src={staticFile("video.webm")} />
</AbsoluteFill>
);
};

muted?

您可以通过添加 muted 属性来消除视频的音频:

静音视频的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
muted
src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
/>
</AbsoluteFill>
);
};
静音视频的示例
tsx
export const MyComposition = () => {
return (
<AbsoluteFill>
<OffthreadVideo
muted
src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
/>
</AbsoluteFill>
);
};

acceptableTimeShiftInSeconds?v3.2.42

StudioRemotion Player 中,如果视频与 Remotion 的内部时间差异过大 - 无论是由于视频加载还是页面无法实时跟上,Remotion 将会寻找视频。默认情况下,如果遇到 0.45 秒的时间差,将触发一次搜索。使用此属性,您可以自定义阈值。

allowAmplificationDuringRender?v3.3.17

使 volume 大于 1 的值在渲染过程中产生放大效果。
在预览期间,音量将被限制为 1,因为浏览器无法放大音频。

toneFrequency?v4.0.47

调整音频的音调 - 仅在渲染过程中应用。

接受介于 0.012 之间的数字,其中 1 代表原始音调。小于 1 的值会降低音调,而大于 1 的值会增加音调。

toneFrequency 为 0.5 会将音调降低一半,而 1.5 会将音调提高 50%。

pauseWhenBuffering?v4.0.111

如果设置为 true 并且视频正在加载,播放器将进入 本机缓冲状态。默认值为 false,但在 Remotion 5.0 中将变为 true

toneMapped?v4.0.117

自 Remotion 4.0.117 起,当转换为 RGB 时,Remotion 将调整不同色彩空间(如 HDR)的视频颜色,以抵消色彩偏移。
由于浏览器以 sRGB 进行绘制,这是必要的,以确保颜色显示正确。
此行为默认为 true,可以通过将 toneMapped 设置为 false 来禁用。
禁用色调映射将加快渲染速度,但可能导致颜色不那么鲜艳。

在 Remotion 4.0.117 之前,色调映射始终被禁用,并且 toneMapped 属性不可用。

showInTimeline?v4.0.122

如果设置为 false,则不会在 Remotion Studio 时间轴中显示任何图层。默认值为 true

delayRenderTimeoutInMilliseconds?v4.0.150

自定义此组件调用的 delayRender()超时

delayRenderRetries?v4.0.178

自定义此组件调用的 delayRender()重试次数

onAutoPlayError?v4.0.187

当视频由于自动播放限制而无法播放时调用的回调函数。
如果不传递回调函数,则视频将被静音并重试一次。
如果要自行处理错误,例如暂停播放器,则此属性很有用。
在此处阅读有关自动播放限制的更多信息。

onVideoFrame?v4.0.190

从视频中提取帧时调用的回调函数。
用于视频处理
回调使用 CanvasImageSource 对象调用。
在预览期间,这是一个 HTMLVideoElement 对象,在渲染期间,它是一个 HTMLImageElement

crossOrigin?v4.0.190

对应于 <video> 元素的 crossOrigin 属性。
其中之一为 "anonymous""use-credentials"undefined
默认值:如果指定了 onVideoFrame,则为 "anonymous",否则为 undefined

imageFormat v3.0.22

在 v4.0.0 中移除

可以是 jpegpng。默认为 jpeg
使用 png,可以显示透明视频(VP8、VP9、ProRes),但速度会慢大约 40%,VP8 视频速度更慢。

其他属性

支持属性 onErrorclassNamestyle,并传递给底层 HTML 元素。请记住,在渲染期间,这是一个 <img> 元素,在预览期间,这是一个 <video> 元素。

性能提示

只有在需要透明度时才将 transparent 设置为 true。它比非透明帧提取慢。
如果您不关心颜色准确性,也可以将 toneMapped 设置为 false,以节省颜色转换的时间。

循环播放视频

<Video> 不同,OffthreadVideo 目前不实现 loop 属性。

您可以使用以下代码片段,使用 @remotion/media-utils 来循环播放视频。

请注意,这将在浏览器中挂载一个 <video> 标签,这意味着只能使用浏览器支持的编解码器。

LoopedOffthreadVideo.tsx
tsx
import {
Loop,
OffthreadVideo,
useVideoConfig,
} from "remotion";
 
export const LoopedOffthreadVideo: React.FC<{
durationInSeconds: number | null;
src: string;
}> = ({durationInSeconds, src}) => {
const { fps } = useVideoConfig();
 
if (durationInSeconds === null) {
return null;
}
 
return (
<Loop durationInFrames={Math.floor(fps * durationInSeconds)}>
<OffthreadVideo src={src} />
</Loop>
);
};
LoopedOffthreadVideo.tsx
tsx
import {
Loop,
OffthreadVideo,
useVideoConfig,
} from "remotion";
 
export const LoopedOffthreadVideo: React.FC<{
durationInSeconds: number | null;
src: string;
}> = ({durationInSeconds, src}) => {
const { fps } = useVideoConfig();
 
if (durationInSeconds === null) {
return null;
}
 
return (
<Loop durationInFrames={Math.floor(fps * durationInSeconds)}>
<OffthreadVideo src={src} />
</Loop>
);
};
Root.tsx
tsx
import React, { useState } from "react";
import { Composition, staticFile } from "remotion";
import { getVideoMetadata } from "@remotion/media-utils";
 
export const RemotionRoot: React.FC = () => {
return (
<Composition
id="MyComp"
component={LoopedOffthreadVideo}
defaultProps={{
durationInSeconds: null,
src: staticFile("myvideo.mp4"),
}}
calculateMetadata={async ({props}) => {
const { durationInSeconds, width, height } = await getVideoMetadata(props.src);
const fps = 30;
 
return {
// Set any duration, here as an example, we loop the video 5 times
durationInFrames: Math.floor(durationInSeconds * fps * 5),
fps,
width,
height,
props: {
...props,
// Pass the durationInSeconds as prop to the React component
durationInSeconds,
}
};
}}
/>
)
}
Root.tsx
tsx
import React, { useState } from "react";
import { Composition, staticFile } from "remotion";
import { getVideoMetadata } from "@remotion/media-utils";
 
export const RemotionRoot: React.FC = () => {
return (
<Composition
id="MyComp"
component={LoopedOffthreadVideo}
defaultProps={{
durationInSeconds: null,
src: staticFile("myvideo.mp4"),
}}
calculateMetadata={async ({props}) => {
const { durationInSeconds, width, height } = await getVideoMetadata(props.src);
const fps = 30;
 
return {
// Set any duration, here as an example, we loop the video 5 times
durationInFrames: Math.floor(durationInSeconds * fps * 5),
fps,
width,
height,
props: {
...props,
// Pass the durationInSeconds as prop to the React component
durationInSeconds,
}
};
}}
/>
)
}

<OffthreadVideo> 支持的编解码器

<OffthreadVideo> 可以读取以下编解码器:

  • H.264("MP4")
  • H.265("HEVC")
  • VP8 和 VP9("WebM")
  • AV1(从 v4.0.6 开始)
  • ProRes

参见