Communitygithub.com

LiliLIN0324/imgseq-cover-video-skill

数字で命名された静止画フォルダ(01.jpg、02.jpg…200以上)からMP4カバー/ティーザー動画を生成します。ユーザーが画像フォルダを動画にしたい、画像フリップリールやスライドショーを作りたい、画像間にソフトなクロスフェードトランジションを追加したい、またはフォルダ内のjpgからカバー動画をエクスポートしたいと依頼した時に使用します。logo.jpg、discord.jpg、cover.mp4などの非数字画像は無視されます。

imgseq-cover-video-skill とは?

このスキルは、数字で連番命名された静止画ファイル(例:01.jpg、200.jpg)が入ったフォルダを、H.264エンコードのMP4カバー/ティーザー動画に変換するためのものです。画像間のトランジションはハードカット(`--transition none`)またはデフォルトのクロスフェード(`--transition fade`)を選択でき、フェード時間や表示時間も調整可能です。このスキルはClaude Code, Cursor, CodexなどのAIエージェント向けに設計されており、`scripts/imgseq2mp4.py`というPythonスクリプトを実行して動画を生成します。スクリプトは数字のみのファイル名を正規表現で選択し、整数値でソートするため、欠番があっても問題なく処理できます。出力動画は無音で、色空間はフルレンジからリミテッドレンジのbt709に適切に変換され、白飛びや色あせを防ぎます。また、メモリ制約に対応するため、トランジションはチャンク単位でレンダリングされ、最大約8チャンクまで安全に処理できます。このスキルは、特にカバー動画やティーザー動画の高速生成に有用で、ファイルのバックアップや検証ステップも自動化されています。

対応~Claude Code~Codex CLI~Cursor
npx skills add LiliLIN0324/imgseq-cover-video-skill

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

叠帧 · Numbered Stills → Cover Video

概要

フォルダをスキャンし、ファイル名の本体部分が純粋な数字であるファイル(01.jpg、200.jpg)のみを保持し、それらを数字順に再生してH.264 mp4にエンコードします。画像間のトランジションはハードカット(--transition none)またはクロスフェード(--transition fade、デフォルト)です。数字以外の画像(logo、discordなど)や既存の動画は無視されます。

手順

  1. まずフォルダを検査します。 ファイルを一覧表示し、ffprobeで1枚の画像の寸法を確認します。数字で命名された静止画がいくつ存在するか、アスペクト比が混在しているかを確認します。
  2. 既存の出力ファイルをバックアップします。 <folder>/cover.mp4がすでに存在する場合、レンダリング前にcover.prev-YYYYMMDD.mp4にリネームします。ユーザーの以前のレンダリングを警告なしに上書きすることは絶対にしません。
  3. バンドルされたスクリプトでレンダリングします:
python "<skill-dir>/scripts/imgseq2mp4.py" --dir "<folder>" --out cover.mp4

デフォルト: 画像あたり0.8秒、0.2秒のfadeクロスフェード、30 fps、1920x1080、レターボックスパディング、CRF 18、音声なし、+faststart。

  1. 確認します。想定しません。 継続時間/フレーム数をプローブし、黒フレームがないことを確認し、最後のフレームを抽出して最後のソース画像と比較します:
ffprobe -v error -show_entries format=duration -show_entries stream=nb_frames -of default=nw=1 cover.mp4
ffmpeg -i cover.mp4 -vf blackdetect=d=0.05:pix_th=0.10 -an -f null -
ffmpeg -y -sseof -0.05 -i cover.mp4 -frames:v 1 frame_last.png

トランジションがオンの場合、最初のトランジションウィンドウ内のフレームも取得し、それがブレンドであることを確認します(ハードカットよりも画像2に近いが、両方のソースから測定可能な違いがあること)。

  1. 報告します: 画像数、無視した画像、合計時間、出力パスとサイズ。

ペース

合計長さ = n × 秒 − (n−1) × トランジション秒。各画像の表示ステップは 秒 − トランジション秒 です。このステップが --seconds ではなく、視聴者が感じる値です。

画像あたりのステップコマンド20枚44枚200枚
0.35 秒--seconds 0.5 --transition-seconds 0.15~8 秒~18 秒~75 秒
0.45 秒--seconds 0.65 --transition-seconds 0.2~9 秒~22 秒~95 秒
0.60 秒 (デフォルト)--seconds 0.8 --transition-seconds 0.2~12 秒~27 秒~120 秒
0.80 秒--seconds 1.0 --transition-seconds 0.2~16 秒~34 秒~150 秒

ハードカットの場合は --transition none --seconds <ステップ> を使用します。

ユーザーから速く/遅くのリクエストがあった場合、一度に1行ずつ調整します。--transition-seconds は0.15~0.2に保ってください。これより長くなると、クロスフェードというよりもスライドショーのように見え始めます。

ルール

  • クロスフェードのみ。スライド、ワイプ、その他のプッシュトランジションは使用しないでください。これらは方向性として却下されました。
  • 正規表現 ^\d+\.(jpe?g|png|webp)$ で選択します。ファイル名は数字のみでなければなりません。これにより logo.jpg、discord.jpg、cover.jpg が除外されます。
  • 辞書順ではなく整数値でソートします(2.jpg は 10.jpg の前、99.jpg は 100.jpg の前)。番号に欠番があっても問題ありません。欠番はエラーではありません。
  • --fit pad(デフォルト)を使用して、フレーム全体が表示されるようにします。ユーザーが明示的にエッジツーエッジのトリミングを希望する場合にのみ --fit fill を使用します。
  • 出力は無音です。ユーザーがトラックを提供しない限り、音楽を追加しないでください。
  • 色はそのままにします。JPEGはフルレンジです。タグなしのフルレンジH.264としてエンコードすると、ほとんどのプレーヤーはリミテッドレンジとしてデコードし、結果は明るく色あせて見えます(+10レベル)。スクリプトはリミテッドレンジのbt709に変換し、タグを付けます。このチェーンを「簡略化」しないでください。
  • スクリプトは --force なしでは --out を上書きしません。盲目的に強制するのではなく、バックアップして解決します。

マシンに関する注意

  • ffmpeg は PATH にありません。スクリプトは実際の ffmpeg.exe(~/.dsh/tools/ffmpeg/**/ffmpeg.exe、次に C:/ または D:/ffmpeg のコピー)を、.cmd ラッパーよりも優先します。そのラッパーは cmd.exe 経由でルーティングされ、コマンドラインが約8k文字に制限されるためです。FFMPEG=/path/to/ffmpeg でオーバーライドします。
  • このビルドには -filter_complex_script がありません。xfade グラフを -filter_complex 経由でインラインで渡します(スクリプトは既にそうしています)。
  • トランジションは --chunk(デフォルト6)のグループでレンダリングされ、その後マージされるため、同時に開かれるデコーダーは最大6つです。単一の44入力xfadeパスは16 GBマシン(空き約2.4 GB)でRAMを枯渇させ、Cannot allocate memory で失敗しました。ここでは --chunk を約8以上に上げないでください。グループ化は再帰的に行われるため、200枚の画像はOOMなしで3段階でマージされます。
  • 中間ステージファイルはCRF 14 / veryfastでエンコードされ、破棄されます。最終パスのみが --crf / mediumを使用します。
  • 中間フレームには書き込み可能なディレクトリが必要です。tempfile.mkdtemp() の結果は、制限されたサンドボックスではアクセスできない場合があります(Windows + DSHで確認:ffmpeg が Permission denied、os.listdir が WinError 5 をスロー)。そのため、スクリプトはプレーンなディレクトリを作成し、書き込み可能であることを確認し、$IMGSEQ_WORKDIR → システムテンポラリ → <out-dir>/.imgseq-work の順にフォールバックします。

リソース

  • scripts/imgseq2mp4.py — 選択、数値ソート、ハードカットまたはクロスフェードレンダリング、検証に適したサマリー。

関連スキル