自動計算影片長度
關於如何根據內容自動決定 Remotion Composition 時長的常見問題,包含 calculateMetadata 的使用方式。
自動計算影片長度
可以根據內容動態決定影片長度嗎?
可以。Remotion 提供 calculateMetadata 回呼函式,讓你能根據輸入資料動態計算影片的時長、尺寸和幀率,而不必在 <Composition> 上寫死固定值。
為什麼需要動態計算時長?
在許多實際應用場景中,影片長度取決於內容:
- 文字朗讀影片:長度取決於音訊檔案的時間
- 幻燈片影片:長度取決於投影片數量
- 資料視覺化:長度取決於資料筆數
- 字幕影片:長度取決於逐字稿的總時間
如何使用 calculateMetadata?
在 <Composition> 元件上傳入 calculateMetadata 屬性:
import { Composition } from "remotion";
export const RemotionRoot = () => {
return (
<Composition
id="MyVideo"
component={MyVideoComponent}
width={1920}
height={1080}
fps={30}
durationInFrames={150} // 預設值,會被覆寫
calculateMetadata={async ({ props }) => {
const audioDuration = await getAudioDuration(props.audioSrc);
return {
durationInFrames: Math.ceil(audioDuration * 30),
};
}}
/>
);
};calculateMetadata 可以回傳哪些欄位?
calculateMetadata 可以回傳以下任意組合:
| 欄位 | 類型 | 說明 |
|---|---|---|
durationInFrames | number | 影片總幀數 |
fps | number | 幀率 |
width | number | 影片寬度(像素) |
height | number | 影片高度(像素) |
props | object | 覆寫或補充傳入的 Props |
只需回傳你想要覆寫的欄位,其餘欄位會使用 <Composition> 上的預設值。
如何根據音訊長度計算時長?
可以使用 @remotion/media-utils 套件的 getAudioDurationInSeconds() 函式:
import { getAudioDurationInSeconds } from "@remotion/media-utils";
import { staticFile } from "remotion";
const calculateMetadata = async ({ props }) => {
const duration = await getAudioDurationInSeconds(
staticFile(props.audioFileName)
);
return {
durationInFrames: Math.ceil(duration * 30),
};
};如何根據文字長度計算時長?
你可以直接在 calculateMetadata 中撰寫計算邏輯:
const WORDS_PER_MINUTE = 150;
const FPS = 30;
const calculateMetadata = async ({ props }) => {
const wordCount = props.text.split(" ").length;
const durationInSeconds = (wordCount / WORDS_PER_MINUTE) * 60;
return {
durationInFrames: Math.ceil(durationInSeconds * FPS),
};
};calculateMetadata 可以執行非同步操作嗎?
可以,calculateMetadata 支援非同步函式(async/await)。你可以在其中:
- 呼叫 API 取得資料
- 讀取媒體檔案的中繼資料
- 進行任何需要等待的非同步計算
請注意,這個函式在每次 Remotion Studio 刷新和渲染開始前都會執行,因此建議加入適當的快取機制以避免重複請求。
calculateMetadata 在渲染時也會執行嗎?
是的。在使用 CLI 或 Node.js API 渲染時,calculateMetadata 同樣會在渲染開始前執行,以決定最終的影片規格。這確保渲染結果與 Remotion Studio 中預覽的一致。
可以同時動態決定時長和 Props 嗎?
可以。calculateMetadata 中回傳的 props 欄位會合併到原始的 Props 中,讓你能在計算時長的同時補充或修改 Props:
const calculateMetadata = async ({ props }) => {
const data = await fetchData(props.dataId);
return {
durationInFrames: data.items.length * 90,
props: {
...props,
items: data.items, // 將取得的資料附加到 Props
},
};
};