Remotion動画からResolveタイムラインへの変換
Remotionプロジェクトを読み取り、そのシーンデータをresolve-screen-tutorialスキルがfilm.jsonに変換するための小さなアダプターを作成し、そのビルドを実行し、結果をRemotionレンダリングと比較します。
ピクセルのコピーではなく、Resolveのツールを使った再構築です。Reactは何でも描画できますが、タイムラインは画像、キーフレーム、Fusionタイトルを使用します。したがって、この作業の正直な部分は、何がきれいにマッピングされ、何が近似され、何が引き継がれないかをユーザーに伝えることです。
始める前に
resolve-screen-tutorialはこのスキルのフォルダの隣にあります。SKILL.mdとreferences/film-format.mdを今すぐ読んでください。このフォーマットを記述し、ビルド手順に従います。もし欠けている場合は、このスキルに必要であることをユーザーに伝えてください。- Remotionプロジェクトには依存関係がインストールされています。プロジェクト自体のコードは変更されず、アダプターはそれを読み取るだけです。
手順
1. 動画を読み取る。 まずsrc/Root.tsxでコンポジションのid、fps、width、height、durationInFramesを確認し、シーンコンポーネントとそのデータをたどります。複数のコンポジションがありリクエストに明示がない場合は、どれかを尋ねてください。public/以下のすべてのアセットを見つけます。
2. 画面に表示されているものをリストアップし、マッピングする。 references/mapping.md には、Remotionの構成要素からfilm.jsonへのマッピングテーブルがあります。今すぐ読んでください。各要素を以下の3つのグループに分類します。
- 直接マッピング: 全フレームスクリーンショット、カメラ移動、カーソル、リング、キャプション、タイトルカード、フェード。
- 近似: その他のイージング、その他のトランジション、インストールされていないWebフォント、精巧なキャプションスタイル。
- 引き継がれない: チャート、パーティクル、3D、Lottie、または文字ごとにアニメーション化されたテキスト。
重要なものが3番目のグループにある場合は、ビルド前にユーザーに伝え、references/mapping.mdの選択肢を提供します。動画の大部分がそのグループにある場合、このアプローチは適切ではないため、貧弱なコピーを作成する代わりにその旨を伝えてください。
3. 参照動画を取得する。 out/にこのコンポジションのレンダリングがないか確認します。コンポジションのソースファイルより新しく、durationInFramesフレーム数があることが望ましいです(ffprobeで確認)。小さいWebエンコードでも問題なく、スコアがわずかに下がるだけです。そうでない場合は、コンポジションの設定でレンダリングします。
npx remotion render <composition id> out/<composition id>.mp4
4. アダプターを記述する。 <project>/resolve/<composition id>/export-film.mjsに配置し、その隣にfilm.jsonを出力します。このフォルダがビルドのフィルムフォルダになります。ユーザーがこれらのファイルをリポジトリに保持したい場合のみ、build/をプロジェクトの無視リストに追加し、要求がない限りコミットしないでください。
アダプターは動画の実際のデータをインポートし、コピーやタイミングが変更されたときに再実行すると変更が反映されるようにします。references/mapping.mdにはスケルトンと算術が含まれています。JSX内部に絡みついている値のみ手動でコピーし、それらの値は後続のコード変更に追従しないため、ユーザーに伝えてください。
コードの色、フォント、ロゴからブランドを設定します。動画が読み込むすべてのフォントをリストアップし、それぞれをfonts_availableで確認します。インストールされていない場合は、インストールするか、類似のインストール済みフォントを使用するかを尋ねます。同じ名前のインストール済みフォントでも、Webフォントとは異なるカットで、幅がわずかに異なる場合があります。
5. ビルドする。 resolve-screen-tutorialのSKILL.mdの「ビルド」セクションの手順1から4に従い、WORKにフィルムフォルダを設定します。手順4のreview_framesはレンダリング前の簡易チェックです。次に、手順5のようにレンダリングします。比較には動画全体が必要だからです。review.pyの呼び出しはスキップします。手順6で参照動画を使って行うためです。比較が終わったらレンダリングジョブを削除します。resolve-screen-tutorialの判断もここに適用されます。どのプロジェクトに配置されるかをユーザーに伝え、自分でビルドしていないタイムラインを置き換えないでください。fpsはプロジェクトのフレームレートに設定します。film.jsonの時間は秒単位なので、コンポジションと異なっていてもタイミングは維持されます。
6. Remotionレンダリングと比較する。 参照動画をreview.pyに渡します。
python "<resolve-screen-tutorial>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4" "<reference video>"
SSIM(1に近いほど類似していることを示す類似度スコア)がフィルム全体と各シーンについて出力され、各シーンの最も弱いフレームが示されます。build/review/にサイドバイサイドのシート(左がResolve)と、ssim-by-half-second.txtが書き出されます。後者はシーンの最低フレームでは隠れる問題を示します。シートを開いて確認します。より詳しく見るには、--at <seconds>を追加して特定の瞬間をフルサイズで表示し、上にResolveを配置します。
目安として、スクリーンショットベースで忠実に再構築されたフィルムは全体で0.96から0.97のスコアです。隣接するシーンより明らかに低いシーンには実際の違いがあるため、その最低フレームを確認します。
| 表示内容 | 通常の原因 |
|---|---|
| すべてがずれている、またはサイズが間違っている | アダプター内のスケールまたはトランスフォーム原点 |
| フィルム全体の時間がずれている | アダプター内のシーン開始またはトランジションのオーバーラップ |
| カメラは静止時は正しいが、移動時に誤っている | イージング |
| リングがわずかに大きすぎる | CSSのボーダーがボックス内側に配置される(film-format.mdを参照) |
| テキストのみ異なる | フォントの置き換え、または同じ名前の異なるカット |
一部の違いは予想通りで、修正する必要はありません。
- ハイライトの表示が遅れる。カメラが停止するのを待つため。
- リングのグローがリングの内側に色を付ける。Fusionのぼかしが両方向に広がるため。
- キャプション、カーソル、リングがディゾルブの途中で終了し、遷移元のシーンに留まらない。
- 最初の後のカードがディゾルブの半分遅れてアニメーションする。
アダプターを修正し、再度実行し、次にplan.pyとbuild_filmを再度実行します。残っている違いが名前を付けられるものになったら停止します。
7. 報告する。 resolve-screen-tutorialの「完了」セクションのすべての内容に加えて、以下を報告します。
- SSIMスコア
- 手順6の違いのリストと、それぞれの原因
- 「引き継がれない」グループの内容と、それに対して行った処理
- アダプターの場所、再実行方法、再ビルドによってタイムラインが置き換えられ、編集内容が失われること