Communitygithub.com

叠帧 · 数字序列图像 → 封面视频

將資料夾中純數字命名的靜態圖片(如 01.jpg、02.jpg……)轉換為 MP4 封面預告片,支援硬切與淡入淡出轉場,自動忽略非數字命名的檔案。

叠帧 · 数字序列图像 → 封面视频 是什麼?

這項技能「叠帧 · 數列圖片轉封面影片」能夠從一個資料夾中選取純數字命名的圖片(例如 01.jpg、200.jpg),按數值順序排列,並編碼為 H.264 的 MP4 影片。它支援兩張圖片之間進行硬切(硬切)或預設的淡入淡出轉場(淡入淡出),並會自動忽略如 logo.jpg、discord.jpg 等非數字命名的檔案,以及既有的影片檔。此技能適用於 Claude Code、Cursor 或 Codex 等 AI 開發工具,主要用於快速製作封面預告片、圖像幻燈片或翻頁集錦。其運作原理是先掃描資料夾、備份舊檔案,再透過內建的 Python 指令稿(imgseq2mp4.py)進行渲染,最後驗證影片長度、影格數與色彩正確性。輸出預設為 1920×1080、30 FPS、無音軌,並可調整每張圖片的顯示時間與轉場長度。特別注意,此技能使用交叉淡出(交叉淡出)而非滑動或掃描等轉場,並確保影像色彩從全色域轉換為有限色域 BT.709,以避免播放時畫面過亮。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add LiliLIN0324/imgseq-cover-video-skill

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

叠帧 · 數字序列圖像 → 封面影片

概述

掃描資料夾,僅保留檔名為純數字的檔案(01.jpg、200.jpg),依數字順序播放,並編碼為 H.264 MP4。圖片之間可使用硬切(--transition none)或淡入淡出(--transition fade,預設值)。非數字命名的圖片(如 logo、discord……)及既有的影片檔會被忽略。

流程

  1. 先檢查資料夾內容。列出檔案,並用 ffprobe 探測其中一張圖片的尺寸。記錄有多少張數字序列的靜態圖片,以及畫面寬高比是否混合。
  2. 備份既有的輸出檔案。如果 <資料夾>/cover.mp4 已存在,在渲染前將其重新命名為 cover.prev-YYYYMMDD.mp4。切勿靜默覆蓋使用者先前的渲染結果。
  3. 使用內建指令稿進行渲染:
python "<技能目錄>/scripts/imgseq2mp4.py" --dir "<資料夾>" --out cover.mp4

預設值:每張圖片 0.8 秒,搭配 0.2 秒的 fade 淡入淡出,30 fps,1920×1080,letterbox 填充,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

啟用轉場時,也應抓取第一個轉場視窗內的影格,確認其為混合狀態(比硬切更接近第二張圖片,但仍與兩張來源圖片有明顯差異)。

  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 <停留時間>。

當使用者要求加快或減慢時,一次移動一個列。將 --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 階)。該指令稿會轉換為有限色域 BT.709 並加上標記——請不要「簡化」這個處理鏈。
  • 該指令稿在未使用 --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;需透過 -filter_complex 內聯傳遞 xfade 圖(該指令稿已這樣做)。
  • 轉場以 --chunk(預設 6)為一組進行渲染,然後合併,因此最多同時開啟 6 個解碼器。單次 44 輸入的 xfade 傳遞在 16 GB 的機器上消耗了所有 RAM(約剩 2.4 GB)並因 Cannot allocate memory 而失敗;請勿在此環境下將 --chunk 提高到約 8 以上。分組會遞迴進行,因此 200 張圖片會在三個階段內合併,不會超出記憶體。
  • 中間階段檔案以 CRF 14 / veryfast 編碼並被丟棄;只有最終傳遞使用 --crf / medium。
  • 中間檔案需要一個可寫入的目錄。tempfile.mkdtemp() 的結果在受限沙盒中可能無法存取(在 Windows + DSH 上觀察到:ffmpeg 出現 Permission denied,os.listdir 引發 WinError 5)。因此該指令稿會建立一個普通目錄,確認其可寫入,並依序回退至 $IMGSEQ_WORKDIR → 系統暫存 → <輸出目錄>/.imgseq-work。

資源

  • scripts/imgseq2mp4.py — 選取、數字排序、硬切或淡入淡出渲染、便於驗證的摘要。

相關技能