reanimate-video は何をしますか?
reanimate はライブページを撮影し、コード内でそれを再構築し、コピーを撮影して比較し、数値が一致するまでラウンドを繰り返します。ビデオ参照用の独自のパスは存在しますが、最初の実際の実行(2026年11月6日、無料ストックカウントダウン)では7つのトラップに遭遇し、それぞれが黙って失敗するか、低速でした。このキットはそれらを除去し、ビデオに必要な測定機能を追加します。なぜなら、ビデオには検査するページがないからです。
reanimate が必要です:npx skills add NiazMorshed2007/reanimate -g を実行し、その後 bash <reanimate>/scripts/setup.sh を実行します。
次に rv setup を一度実行します(測定ツールの numpy と opencv を、このキット独自の Python 環境にインストールします。ほとんどの Mac にある python3 はグローバル pip install を拒否します)。確認は rv doctor で行います。(rv はこのスキルの rv ファイルです。)
トラップとキットの対応
| トラップ(標準 reanimate、ビデオからの場合) | キットの対応 | |
|---|---|---|
| 1 | 10ビットビデオ(ProRes、ほとんどのストック映像)が16ビットPNGになり、1フレーム10MBに | rv ref が8ビットフレームを書き出し |
| 2 | シートがすべてのフレームを1ページにインライン展開し、1080pフレームでタイムアウト | シートは480ピクセルコピーから生成 |
| 3 | file:// で開かれたコピーはESモジュールを読み込めず、reanimate は何も言わずに空白ページを記録 | rv serve + rv round は file:// を拒否し、すべての録画は BLANK または FROZEN チェックされるとラウンドを停止 |
| 4 | コピーの最初のフレームが最初のアニメーションフレームより先に記録される | テンプレートは読み込み時に描画 |
| 5 | 300フレームを1080pで比較すると、1ラウンドに数分かかる | ラウンドでは毎回同じ方法でハーフサイズ(シャープ&4pxブラー)で比較 |
| 6 | ビデオには読み取る要素トラックやキーフレームがない | measure/:中心、フロート、回転、弧、フェード、サイズ、セグメント、タイプフェイスをピクセルから測定 |
| 7 | 仮想クロックは浮動小数点でティックを加算し、フレームの最後のティックをスキップすることがある:そのフレームはページを1ティック早く表示(デフォルト60Hzで17ms) | テンプレート上のコピーは、t = k / fps で正確に描画関数を呼び出して記録;他のページは240Hzティックで記録 |
| 8 | (キット独自のツール)numpy と opencv を、ほとんどのMacのpython3(Homebrew、PEP 668)にpipインストールできない | rv setup がキット独自のPython(.venv)を作成;rv measure <tool> はそれを使って各ツールを実行 |
tests/run.sh は、標準 reanimate(赤)での各トラップを再現し、次にキットの方法(緑)で実行します;tests/e2e.sh は小規模ケース(参照そのものがコピーである場合は0%、間違った色が埋め込まれている場合はそれより悪い値)でパス全体を実行します。キットに変更を加えた後は、両方を実行してください。
その前に:このビデオはコピーしてよいか?
ユーザーがコピーを許可されているビデオの LOOK のみをコピーしてください:自分自身のもの、または変更を許可するフリーライセンス(Videezy Standard License:個人・商用利用無料、クレジット「Videezy.com」必要;Mixkit フリーライセンス;Pexels と Pixabay のライセンス)。ライセンス、そのソースリンク、日付を <作業ディレクトリ>/LICENSE.md に書き込み、ビデオが表示される場所すべてでクレジットを画面に表示します(<作業ディレクトリ>/film.json の "credit")。ゲームの映像は MOTION のみコピーされます(reanimate のデフォルト):ルック(言葉、フォント、色、アート)はユーザー自身のものになります。
手順
rv doctorrv ref <動画> <作業ディレクトリ>(部分的な場合は--start/--end、1つの要素に対しては--crop x,y,w,hを追加)。<作業ディレクトリ>/ref/sheets内のすべてのシートと、<作業ディレクトリ>/ref/sheets_full_rate内のフルレートシートを読んでください。計測前に、何がいつ動くかを書き留めます。- 各移動要素を、その種類の動きに対応するツール(
measure/README.md参照。各ツールはrv measure <ツール> ...で実行)で測定し、<作業ディレクトリ>/ref/framesに対して行います。ツールを要素に適用する前に、そのツールが正しいことを証明してください(その--sheet、または一致する必要がある2番目のフレームを使用)。 <作業ディレクトリ>/spec.md:要素ごと、プロパティごとに1行:開始、持続時間、from -> to、イージングまたは測定テーブル、および数値の出典ファイル。「?」のある行は未完了です。- 構築:
template/をプロジェクトにコピーします。animation.jsはdraw(ctx, t)(時間の純粋関数)とDURATIONをエクスポートします。測定した数値はすべて、出典ファイルとともにモジュールに配置します。キャンバスは参照のサイズに合わせます(<作業ディレクトリ>/run.json)。 rv serve <コピーディレクトリ>を実行し、次にrv round 1 <作業ディレクトリ> --url http://127.0.0.1:8765/index.htmlを実行します。<作業ディレクトリ>/compare-1/report.mdとそのシート(compare-1/sheets)を読んでください:数値はどれだけずれているか、シートは何がずれているかを示します。最も大きな差異のみを修正し、その後rv round 2 ...を実行します。5ラウンドで停止します;それでも失敗するものは、数値と理由とともに報告されます。rv rounds <作業ディレクトリ>(表)とrv film <作業ディレクトリ>(プロセスクリップ、1080x1920:ビデオ、そのフレーム、各ラウンドと差異を赤で示したものとその数値、数値の減少、最終同期状態)。- 報告:何がどの忠実度でコピーされたか、ファイル、ラウンド表、何がずれたままかとその理由。
ビデオからコピーできるものとできないもの
測定によりうまくコピーできるもの:形状、テキスト、回転するリングや弧、点灯するティックやセグメント、フェードやフラッシュ、拡大やスライド、それらの順序とタイミング。measure/ で測定し、形状として再構築します。
測定ではコピーできないもの:3Dレンダリングシーン、実写映像、ランダムに配置されたパーティクル、断片がフラッシュして変化する背景。measure/spin.py は AGREEMENT でそれを示します(約0.3未満の場合、帯域は単なる回転以上のことを行っています)。2026年11月6日、カウントダウンのトンネルは0.16〜0.6を示しました:コピーの3ラウンドはそれをスミアのままにしました(画素の76%→48%がずれている)が、HUDは一致しました。その場合:前面の要素をコピーし、背景にはユーザー自身のシーン(ゲームのもの、ページのもの)を与え、要素がある場所のみを比較するか、背景が単色の参照を選んでください。そのようなコピーをピクセルパーフェクトと呼んではいけません。
合格基準(reanimate のものをビデオ用に読み替え)
- タイミング:すべてのイベント(要素の10/50/90%の立ち上がりと立ち下がり、
measure/curve.py)が参照から0.08秒以内。 - イージング:コピーの測定曲線が参照のものから5%以内(平均絶対差)。
- ピクセル:ピクセル忠実コピーの場合、平均不一致が最大2%(ユーザーがルックをコピーすることを許可されている参照のみ、かつ背景がコピー対象の一部である場合のみ);シャープな数値とブラーをかけた数値を併記。
- すべてのラウンドの録画がガードを通過(ブランクやフリーズフレームなし)。
学んだ落とし穴
-
デザイン全体に1つの浮動小数点は仮説に過ぎない:何かを安定させる前に、各リングの中心を元のフレームでフィットさせる(
polar.py fit)。2026年11月6日(Videezy 40314)、最初のフィットは最も明るいリング(白いリング)にロックオンし、それは8.5ピクセルドリフトします;319にあるリングは0.1ピクセルしか動きません。3ラウンドでHUD全体を浮かせ、間違ったレイヤーで安定させたフレーム上で測定しました;ラウンド4では、白いリングのみを浮かせ、すべてを静止中心の周りで再測定したところ、12.6%→9.3%に改善しました。 -
ラウンドを費やす前に、数フレームで変更を試す:
rv still <作業ディレクトリ> --url ... --frames 0,60,150を実行し、それらのフレームを compare.ts で最後のラウンドのコードと比較します。2026年11月、3つの候補変更のうち2つは効果があり(10.0→9.5→8.9%)、1つは悪化させました(13.3%):それは決してラウンドになりませんでした。 -
measure/radial_diff.pyはラウンドデザインがどこでずれているかを半径ごとに示します;静止部分のみを読み取ります。フローティングリングはその中央値でスミアするため、compare.ts がこれと矛盾する場合はそれに従って判断してください。 -
静止リングはすべての角度で明るい:角度に対する30パーセンタイルはそれを保持し、動くものを落とします。これがリングの真の半径と幅を読み取る方法です。
-
rv filmは被写体にクロップします(film.jsonの "crop"):ショーケースは被写体を大きく表示します。 -
「最もシャープなリング」から見つけた中心は、中央に大きな白い形状があると迷走します:数フレーム上の小さな明るいランドマークを使用し、フレームが一致する場合のみそれを信頼します(
measure/polar.py landmark)。 -
グローはすべてのエッジを太くします:タイプフェイスは目視ではなく測定で選びます(
measure/fontmatch.py)。 -
測定されたズームや回転は、2番目の視点が一致するまでは仮説です:2026年11月、対数極座標相関が3%/秒のズームを報告しましたが、半径対時間のストリップはそれが存在しないことを示し、コピーはそのズームでトンネルを1ラウンド縮めました。
-
面積はサイズの2乗で増加する:数値のサイズは、その前のフレームを超える白領域の平方根、またはそのボックスです。
-
無料ストック映像は多くの場合4K ProRes、1〜2GB/クリップです:1920幅で読み取り(
rv refが行います)、記録用にオリジナルを保持し、ディスク容量に注意してください。