影片元件比較:OffthreadVideo、Html5Video 與 Video
深入比較 Remotion 三種影片元件的差異,包含編解碼器支援、效能、畫面精確度及適用情境,協助您選擇最合適的元件。
影片元件比較
Remotion 提供了三種嵌入影片的元件,各有其底層實作與適用場景:
<OffthreadVideo />— 官方推薦,基於 Rust 的影格擷取器<Html5Video />(原名<Video />,來自remotion套件)— 基於 HTML5<video>元素<Video />(來自@remotion/media)— 實驗性 WebCodecs 元件,預計成為未來預設
功能比較表
| 功能 | <OffthreadVideo /> | <Html5Video /> | <Video /> (@remotion/media) |
|---|---|---|---|
| 底層技術 | Rust + FFmpeg binary | HTML5 <video> | Mediabunny、WebCodecs |
| 畫面精確 | 是 | 不保證 | 是 |
| 部分下載資源 | 否(需 muted 屬性) | 是 | — |
| 預覽方式 | HTML5 <video> | HTML5 <video> | WebCodecs |
| 渲染速度 | 快 | 中等 | 最快 |
| HLS 支援 | Chrome v142+ | 僅預覽時 | 規劃中 |
| 需要 CORS | 否 | 否 | 是 |
| 可循環播放 | 否 | 是 | 是 |
playbackRate(速度調整) | 是 | 是 | 是 |
toneFrequency(音調調整) | 僅渲染時 | 僅渲染時 | 僅渲染時 |
| Three.js 材質 | useOffthreadVideoTexture() | useVideoTexture() | 最佳,使用程式碼片段 |
| 客戶端渲染 | 否 | 否 | 是 |
支援的容器格式
| 元件 | 支援容器 |
|---|---|
<OffthreadVideo /> | .aac、.avi、.caf、.flac、.flv、.m4a、.mkv、.mp3、.mp4、.ogg、.wav、.webm |
<Html5Video /> | .aac、.flac、.m4a、.mkv、.mp3、.mp4、.ogg、.wav、.webm |
<Video /> (@remotion/media) | .aac、.flac、.mkv、.mov、.mp3、.mp4、.ogg、.wav、.webm(不支援的容器自動降階至 <OffthreadVideo />) |
支援的編解碼器
| 元件 | 支援編解碼器 |
|---|---|
<OffthreadVideo /> | AAC、AC3、AV1、FLAC、H.264、H.265、M4A、MP3、Opus、PCM、ProRes、VP8、VP9、Vorbis |
<Html5Video /> | AAC、FLAC、H.264、MP3、Opus、VP8、VP9、Vorbis |
<Video /> (@remotion/media) | AAC、FLAC、H.264、MP3、Opus、VP8、VP9、Vorbis(不支援的編解碼器自動降階至 <OffthreadVideo />) |
如何選擇?
- 一般情況下:使用
<OffthreadVideo />,畫面精確、格式支援最廣 - 需要循環播放:使用
<Html5Video />或<Video />(@remotion/media) - 客戶端渲染:必須使用
<Video />(@remotion/media) - Three.js 材質:優先使用
@remotion/media的<Video />(搭配onVideoFrame)
在預覽與渲染時使用不同元件
使用 useRemotionEnvironment() hook 可以讓您在預覽和渲染時分別使用不同的元件:
範例:預覽使用 OffthreadVideo,渲染使用 @remotion/media
import {
useRemotionEnvironment,
OffthreadVideo,
RemotionOffthreadVideoProps,
} from 'remotion';
import { Video, VideoProps } from '@remotion/media';
// 一個在預覽時使用 OffthreadVideo、渲染時使用 @remotion/media Video 的元件
const AdaptiveVideo: React.FC<{
offthreadVideoProps: RemotionOffthreadVideoProps;
videoProps: VideoProps;
}> = ({ offthreadVideoProps, videoProps }) => {
const env = useRemotionEnvironment();
// 非渲染環境(即預覽模式)使用 OffthreadVideo
if (!env.isRendering) {
return <OffthreadVideo {...offthreadVideoProps} />;
}
// 渲染時使用 @remotion/media 的 Video(支援 WebCodecs,速度最快)
return <Video {...videoProps} />;
};範例:預覽使用 Html5Audio,渲染使用 @remotion/media
import {
useRemotionEnvironment,
Html5Audio,
RemotionAudioProps,
} from 'remotion';
import { Audio, AudioProps } from '@remotion/media';
const AdaptiveAudio: React.FC<{
html5AudioProps: RemotionAudioProps;
audioProps: AudioProps;
}> = ({ html5AudioProps, audioProps }) => {
const env = useRemotionEnvironment();
// 預覽時使用 HTML5 Audio
if (!env.isRendering) {
return <Html5Audio {...html5AudioProps} />;
}
// 渲染時使用 @remotion/media 的 Audio
return <Audio {...audioProps} />;
};useRemotionEnvironment() 回傳值
const env = useRemotionEnvironment();
env.isRendering // boolean:是否正在渲染(非預覽)
env.isPlayer // boolean:是否在 <Player> 元件中
env.isStudio // boolean:是否在 Remotion Studio 中常見問題
Q:為什麼 <OffthreadVideo /> 不支援循環播放?
<OffthreadVideo /> 在渲染時是透過 FFmpeg 逐格擷取影格,並非即時串流,因此沒有原生的循環播放概念。若需要循環,請改用 <Html5Video /> 並搭配 loop 屬性,或在 <Sequence> 層次手動重複播放。
Q:<Video />(@remotion/media)需要 CORS,應如何設定?
若影片資源來自不同來源(跨域),需要伺服器在回應標頭中加入:
Access-Control-Allow-Origin: *
或更安全地指定您的網域:
Access-Control-Allow-Origin: https://your-domain.com
相關連結
<OffthreadVideo />— API 文件<Html5Video />— API 文件@remotion/media— 套件文件useRemotionEnvironment()— API 文件