嵌入透明影片
學習如何在 Remotion 中嵌入含有 Alpha 通道的透明影片,以及如何用 mixBlendMode 處理純黑背景影片的透明效果
嵌入透明影片
Remotion 支援嵌入透明影片,讓你能在影片層疊合成中實現各種視覺效果。本文介紹三種常見的透明影片處理情境。
方法一:含 Alpha 通道的影片
若你的影片本身就帶有 Alpha 通道(例如 WebM 格式的透明影片),只需在 <OffthreadVideo> 元件上加上 transparent prop 即可:
import React from 'react';
import {OffthreadVideo, staticFile} from 'remotion';
export const MyComp: React.FC = () => {
return <OffthreadVideo src={staticFile('transparent.webm')} transparent />;
};支援的格式
含有 Alpha 通道的影片格式主要有:
| 格式 | 說明 |
|---|---|
| WebM(VP8/VP9) | 最廣泛支援的透明影片格式,推薦使用 |
| MOV(ProRes 4444) | Apple 生態系常用,支援高品質透明通道 |
| PNG 序列 | 逐幀 PNG,檔案較大但品質最佳 |
注意事項
transparentprop 只在<OffthreadVideo>上有效,不適用於<Video>元件- 確保影片確實含有 Alpha 通道,否則開啟
transparentprop 可能導致非預期結果
方法二:純黑背景影片(無 Alpha 通道)
若你的影片沒有 Alpha 通道,但背景是純黑色(例如粒子特效、光暈效果等),可以在 style prop 中加入 mixBlendMode: 'screen' 來「消除」黑色背景:
import React from 'react';
import {OffthreadVideo, staticFile} from 'remotion';
export const MyComp: React.FC = () => {
return (
<OffthreadVideo
src={staticFile('nottransparent.mp4')}
style={{
mixBlendMode: 'screen',
}}
/>
);
};mixBlendMode: 'screen' 的原理
screen 混合模式會讓影片中愈暗的像素愈透明,純黑(#000000)會完全透明,純白(#ffffff)會完全不透明。這對於黑底白字、黑底光效等素材特別有效。
其他常用混合模式
| 混合模式 | 適用情境 |
|---|---|
screen | 黑底特效(粒子、光芒、煙火) |
multiply | 消除白底,保留深色內容 |
overlay | 同時增強明暗對比 |
lighten | 保留較亮的像素 |
方法三:綠幕去背效果
若影片背景是特定顏色(例如綠幕),可以透過 Canvas API 逐像素處理,將特定顏色的像素替換為透明。
詳見 影片操作與 Canvas 中的綠幕範例。
簡要說明:
// 使用 onVideoFrame 取得每一幀的像素資料
// 遍歷每個像素,將綠色像素的 alpha 值設為 0
// 將處理後的像素資料繪製回 Canvas輸出透明影片
若你想輸出帶有透明通道的影片(而不只是嵌入),請在渲染時指定支援透明的編碼格式。
相關設定請參考官方文件:Transparent videos(輸出透明影片)
各方法比較
| 情境 | 建議方法 |
|---|---|
| 影片本身有 Alpha 通道 | transparent prop |
| 黑底特效影片 | mixBlendMode: 'screen' |
| 白底素材 | mixBlendMode: 'multiply' |
| 綠幕影片 | Canvas 逐像素去背 |
完整層疊範例
以下示範如何將一段透明影片疊加在背景上:
import React from 'react';
import {AbsoluteFill, OffthreadVideo, staticFile} from 'remotion';
export const LayeredVideo: React.FC = () => {
return (
<AbsoluteFill>
{/* 背景影片 */}
<AbsoluteFill>
<OffthreadVideo src={staticFile('background.mp4')} />
</AbsoluteFill>
{/* 前景透明特效影片 */}
<AbsoluteFill>
<OffthreadVideo
src={staticFile('overlay-effect.webm')}
transparent
/>
</AbsoluteFill>
</AbsoluteFill>
);
};