FilmForge Deliver 是做什麼的?
一部電影完成的條件是:每個版本在預期的地方都能播放、測量正確,且整個製作專案都放在一個資料夾中,並附有證明沒有缺少任何東西的憑證。此技能根據交付矩陣製作交付物,檢查每個交付物,並使用 archive.py 完成製作。
路徑:下方的 scripts/、templates/ 和 config/ 是此技能內部的資料夾(載入時顯示的基礎目錄),由 ./install.sh 放置。如果從儲存庫複製,它們是根目錄下的 tools/、templates/ 和 config/。
第 1 步:交付矩陣 (templates/delivery-checklist.md)
將它複製到製作專案中,並劃掉電影沒有的項目。每個電影交付物都來自同一個母版,該母版從您的編輯器或合成器中以 3840x2160 解析度匯出,使用與預覽相同的鏡頭表、繪畫和混音,然後使用 ffmpeg 進行編碼:
| 交付物 | 製作來源 | 設定 |
|---|---|---|
| 4K 母版 | 編輯器的 4K 匯出 | 3840x2160,鏡頭表指定的幀率;透過 VAAPI (hevc_vaapi) 使用常數 QP 18 的 HEVC Main,標記為 BT.709,然後使用 -c copy -tag:v hvc1 重新封裝,以便 Apple 播放器接受;如果沒有 VAAPI,則使用 H.264 (libx264, preset medium, CRF 18, yuv420p);AAC 320k;+faststart |
| 用於發布的 1080p | 母版 | 使用 Lanczos 縮放至 1920x1080,libx264 preset slow, CRF 16, High profile, yuv420p;混音透過兩次線性 loudnorm 標準化至 -14 LUFS 和 -1.5 dBTP;AAC 320k;+faststart |
| 手機版 | 發布版 | 使用 Lanczos 縮放至 1280x720,並帶有輕微降噪 (hqdn3d=1.2:1.2:3:3),libx264 使用 900k (maxrate 1400k, buffer 2800k),AAC 128k;小到可以在聊天中發送 |
| 封面 | 母版 | 3 或 4 張最強烈的 4K 幀,PNG 格式,以及用於發布的 JPG 格式;在手機尺寸下可讀 |
確切的 ffmpeg 指令:references/deliverables.md。將它們放入一個指令碼中,以便任何更改都能重新建構每個交付物。
當電影有書籍和周邊時:以 4K 和 1080p 影片形式呈現的圖畫書(附音樂)、印刷 PDF、可隨音樂翻頁的互動式網路書、本地化版本(每種語言都有自己的 4K、1080p 和手機影片,每句台詞都由懂該語言的人重新設定和檢查,絕不允許未經審查的機器設定),以及幕後花絮的 PDF 和手機版 PDF。詳細資訊:references/deliverables.md。
第 2 步:檢查每個交付物
測量檔案本身,而不是時間軸:
- 串流: 編解碼器、大小、畫素格式、幀率、編解碼器標籤(HEVC 母版為
hvc1)、音訊取樣率和聲道數、長度、大小和位元率 (ffprobe)。 - 響度: 整合響度、響度範圍和真實峰值(EBU R128,ffmpeg 的
ebur128濾波器)。母版保留混音原樣;發布版和手機版必須讀數約為 -14 LUFS。 - 故事關鍵點的同步: 對於每個關鍵點,在半秒內最大的畫面變化和最強的聲音起始,以及它們之間的毫秒差距。畫面變化來自 ffmpeg 的場景評分,聲音起始來自對電影自身音訊執行的
beatmap.py。目標:在關鍵點有剪輯的地方,差距小於一個幀(42 毫秒,24 fps 時)。沒有剪輯的關鍵點會報告一個差距;請對照鏡頭表解讀。 - 結尾: 第一幀和最後一幀(黑色,或有意的標題)。
- 完成影片的縮圖索引,每 2 秒一幀,從頭到尾檢視。
- 在目標螢幕上從頭到尾觀看一次,使用聲音,然後簽核。
每個的指令:references/deliverables.md(檢查)。
對於 PDF:在兩個閱讀器中開啟,檢查每個跨頁,字體已嵌入,圖片為印刷解析度。
第 3 步:存檔及其證明
製作電影的一切都放在一個製作資料夾中:production.yaml、故事檔案、提示詞、每張繪畫和版本、工作表、樂譜及其測量、程式碼、混音、交付物、經驗教訓。
python3 scripts/archive.py build <film> --require deliverables.txt \
--require-shotlist <film>/shotlist.yaml --paintings <film>/art/film \
--exclude "code/.venv/=rebuilt from requirements.txt"
python3 scripts/archive.py verify <film>
build 將每個檔案雜湊到 <film>/MANIFEST.sha256(純文字 sha256sum -c 格式,因此證明可以比工具本身更長久),並寫入 manifest.json:檔案計數、位元組、按類型分類的檔案、故意排除的內容及其原因(快取、虛擬環境、任何 4k/ 升頻資料夾)、必要的交付物及其缺失、沒有繪畫的鏡頭,以及清單本身的摘要。僅當每個必要模式都匹配且每個有繪畫的鏡頭都有其繪畫時,它才會報告 COMPLETE。verify 稍後重新雜湊所有內容,並在任何遺失或更改的檔案(以及編輯過的清單)上失敗。
同一個工具也可以用來證明較小的包。Lantern Moth 的 archive-required.txt 列出了其前期製作包在花費任何費用製作繪畫之前必須包含的內容,並且在範例資料夾上使用 --require archive-required.txt 執行 archive.py build 會發現所有十個模式都存在並報告 COMPLETE。
副本: 逐位元組驗證備份或移動:python3 scripts/archive.py compare <film> <copy>。它用一個命令完成了通常需要手動執行來源和副本中每個檔案的 SHA-256 清單和複製日誌才能完成的工作。
在存檔中寫一個簡短的 README:每個資料夾的內容、故意排除的內容、成品所在位置。
第 4 步:完成
production.py signoff deliver --by <你> --note "<在電視上觀看了母版;檢查通過>",然後 advance 到回顧階段 (forge-director)。
輸出
film/包含每個交付物,命名為<Title>_4K.mp4、<Title>_1080p.mp4、<Title>_phone.mp4、covers/- 報告中的檢查數據(大小、響度、每個關鍵點的同步偏移)
MANIFEST.sha256、manifest.json、存檔 README
閘門檢查清單
- 矩陣中的每個交付物都存在並通過檢查
- 每個故事關鍵點的同步誤差小於一個幀
- 在目標螢幕上使用聲音觀看過
-
archive.py build:COMPLETE;archive.py verify:OK - 每個副本已透過
archive.py compare驗證 - 已簽核
維修表
| 症狀 | 修復方法 |
|---|---|
| Apple 裝置拒絕 HEVC 母版 | 缺少 hvc1 標籤:使用 ffmpeg -i in.mp4 -c copy -tag:v hvc1 out.mp4 重新封裝 |
| HEVC 母版無法解碼 | hvc1 在 VAAPI 編碼期間被寫入:編碼時不加標籤,然後使用 -c copy -tag:v hvc1 重新封裝 |
| 電視透過 Wi-Fi 播放時卡頓 | 位元率過高(ffprobe 會顯示):以更高的 QP(更小的檔案)重新編碼母版 |
| 需要 HEVC 但沒有 VAAPI 編碼器 | ffmpeg -h encoder=hevc_vaapi 和 ls /dev/dri 會顯示機器有什麼;否則交付 H.264 母版 |
| 發布平台拒絕或剪輯影片 | 未標準化:發布兩次處理的副本(-14 LUFS、-1.5 dBTP、線性),而不是母版 |
| 手機版太大無法傳送 | 從發布版以較低的 -b:v(references/deliverables.md)重新編碼,或縮短;保持 720p |
| verify 報告 CHANGED | 有人編輯了已交付的檔案:從驗證過的副本還原,或重新建構並重新簽核 |
| build 報告 INCOMPLETE | 缺少必要的交付物或繪畫:製作它,或出於原因故意將其從清單中移除 |
參考資料
references/deliverables.md:完整的 ffmpeg 指令、檢查、書籍、版本和封面