映像生成が得意なモデルでも、画面の文字や音のタイミングまで思いどおりに揃うとは限りません。そこをコード編集で担当しました。

まず押さえたい答え

30秒・5カットの架空サンプルを、24fps素材から30fps・900フレームの動画に構成。環境はNode 24、Remotion 4.0.532、Apple Siliconでした。

作例ではどうした?

テロップを3フレームずつずらし、音楽や効果音をフレームで配置しました。書き出し約31秒、約28MBは、この環境と素材での1回の記録です。

テロップと図をコードで描く

テロップは1文字ずつ下から浮かび上がるようにしました。Remotionの spring で文字ごとに少しずつ遅らせ、カットの終わりの18フレームで消しています。書体はMacに入っているヒラギノ明朝を指定しました。書き出すパソコンにない書体は別の書体に置き換わるので、ほかの環境で書き出すときは書体ファイルを読み込む必要があります。

{[...text].map((ch, i) => {
  const s = spring({frame: frame - 14 - i * 3, fps, config: {damping: 200}});
  return <span style={{opacity: s, transform: `translateY(${(1 - s) * 24}px)`}}>{ch}</span>;
})}
文字ごとに3フレームずつ遅らせて浮かび上がらせる

産地の畑のカットには、エチオピアから日本へ点線の弧が伸びる図をSVGで重ねました。地図の形は描かず、2つの点と弧だけで「遠くから届く」ことを示しています。弧の伸び方は interpolate で0から1の値を作り、表示する範囲を少しずつ広げています。

音楽と効果音をフレーム単位で配置する

音楽は Audio で全体に流し、最初の15フレームで音量を上げ、最後の30フレームで下げています。効果音は Sequence の開始フレームで位置を決め、箱を取り出す・袋を開ける・湯を注ぐ・一口飲むの4か所に置きました。

書き出した動画の音量は-17.5 LUFS、最大は-2.7 dBFSでした。音量の数値は書き出したあとにffmpegで測っています。

<Audio src={staticFile('music.mp3')}
  volume={(f) => interpolate(f, [0, 15, 870, 900], [0, 0.85, 0.85, 0])} />
<Sequence from={310}>
  <Audio src={staticFile('sfx/pour.mp3')} volume={0.5} />
</Sequence>
音量を関数で指定すると、フレームごとに変えられる

仮の書き出しから直したところ

仮の書き出しをフレームごとに見て、次の3点を直しました。

  1. 冒頭のカットを作り直したところ、3.8秒あたりから手が消えて箱に崩れた文字が出た。崩れる前の3.6秒だけを使い、0.72倍でゆっくり再生して5秒にした
  2. 地図に入れた「約11,000km」は根拠を確かめていない数字だったので消した
  3. 地名のラベルが小さく背景の山に埋もれたので、文字を大きく太くして影を付けた

生成AIのカットに問題があっても、使う範囲と速さをコードで変えれば作り直さずに済む場合があります。数字や地名のように確かめが必要な文字は、コードで描いたあとも人が見て判断します。

相談前に用意しておくこと

完成尺、fps、素材の尺、文字の確定稿、音の開始位置を揃えてから編集する。

気になる作例と「どこで使いたいか」があるだけでも、相談の出発点になります。決まっていない項目は、未定と伝えてください。

制作素材・映像を確認する

Remotionで動画を組み立てる|テロップ・音・書き出し

仮の書き出し
最初に書き出した版|30秒
完成版
冒頭のカットと地図の表示を直した版|30秒

詳しい制作記録とご相談

本記事はFableBridge公式ブログの制作記録を、この媒体の読者向けに再構成したものです。仕様・価格・予定日は元記事の確認時点の情報です。

公式ブログ:Remotionで動画を組み立てる|テロップ・音・書き出し

動画の企画・制作、LP制作、広告の配信・運用については、FableBridge公式HPの相談窓口へ。用途と希望時期を添えてご相談ください。