Communitygithub.com

ItachiDevv/llvideo

理解影片中的脈絡——發生什麼、何時發生、誰說了什麼、螢幕上顯示什麼。可用於任何 .mp4/.mov/.mkv/.webm/.avi 檔案或 YouTube 網址,以及像是「這部影片發生什麼事」、「分析這段片段」、「找到 X 發生的那一刻」、「2:14 時螢幕顯示什麼」、「這個渲染正確嗎」、「QA 這個匯出」、「檢查這個螢幕錄影」或「總結這段影片」等問題。也可用來驗證你剛製作的渲染影片(Remotion、HyperFrames、Veo、ffmpeg 輸出)、提取靜態圖像或片段,以及精確測量 FPS、掉幀、黑幀、凍結和靜音。它使用一個影片原生模型來處理時間軸,並將真實的影格交給你親自查看。不要手動提取影格——使用這個工具。

llvideo 是什麼?

llvideo 是一個命令列工具,為 AI 開發者提供以程式化方式分析影片內容的能力,無需依賴模型主觀描述。與其轉述模型摘要(這可能導致資訊失真),llvideo 會輸出結構化的時序證據——包含場景時間戳、螢幕文字、語音、關鍵時刻及不確定性標記——並生成一份「聯絡表」(contact sheet)讓開發者親自檢視所有關鍵影格。這確保了事實性驗證,因為每個斷言都能追溯到開發者自己看到的真實畫面之一,或是一個確定的 ffmpeg 測量值。 該工具支援多種平台,包括 macOS、Linux 和 Windows,並需要 ffmpeg 執行環境以及至少一個 API 金鑰(GEMINI_API_KEY 或 OPENROUTER_API_KEY)。其獨特的工作流程從免費的探查和規劃步驟開始,接著進行索引、檢視聯絡表,以及使用精確的剪輯和靜態圖像命令進行深入分析。它還包含一個強大的稽核功能,用於檢查渲染影片中的黑幀、音量問題和凍結狀況,並可自動修正部分缺陷。對於需要理解「如何剪輯」而非單純「發生什麼事」的編輯問題,它提供一個專門的 `craft` 模式來分析轉場、運鏡和節奏,其精確度足以區分甩鏡和實際的剪輯。

相容平台~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ItachiDevv/llvideo/tree/HEAD/skills/llvideo

在你喜歡的 AI 中提問

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

說明文件

llvideo 是做什麼的?

你無法觀看影片。但一個影片原生模型可以。這個技能將它放在一個 CLI 後面,讓它回傳結構化證據而非散文,然後將真實的影格交給你,讓你形成自己的判斷。

這個區別是關鍵所在。如果你轉述模型的摘要,你只是一個中間人。如果你根據一個有型別的索引進行推理,並用它來對照你親眼看過的像素進行確認,你就是一個分析師。

設定檢查

llvideo providers

需要 ffmpeg 在 PATH 中,以及一個 API 金鑰。GEMINI_API_KEY 可以處理所有功能。OPENROUTER_API_KEY 的價格大約是一半,但沒有上傳端點,因此僅限於網址和小型片段——而且 OpenRouter 需要有 $1.00 的已購買額度,然後它才會接受任何影片請求,包括 :free 模型。

金鑰會優先從環境變數讀取。作為備用方案,它也會讀取 ~/.itachi-api-keys 中的 KEY=value 檔案,這只是為了方便將金鑰從你的 shell profile 中移出——環境變數就足夠了。


你應該遵循的循環

1. 總是從免費開始

llvideo probe VIDEO      # 時長、編碼、解析度、token 估算——完全免費
llvideo plan VIDEO       # 費用將是多少,以及如何處理——完全免費

plan 會告訴你取樣率、是否需要轉碼、token 計數和美元估算。在花費之前先讀取它。

2. 索引影片

llvideo index VIDEO
llvideo index VIDEO --json        # 用於程式解析
llvideo index VIDEO --verify 3    # 當螢幕文字很重要時——請見下方說明

回傳帶有時間戳的場景、螢幕文字、動作、語音、關鍵時刻,以及一個明確的 uncertainties 列表。它還會寫入一份聯絡表。

3. 查看聯絡表。此步驟不可省略。

index 的輸出名結尾會包含一個路徑。在你回答使用者之前,先用你自己的視覺能力讀取那張圖片。 它是一張覆蓋整個時間軸的圖片,大約需要 600–1,600 個 token。用於驗證事實時你代價很低,但犯錯時代價很高。

你所斷言的一切都應該是以下之一:

  • 你自己在某個影格中看到的東西,
  • 一個 ffmpeg 測量值,或
  • 一份逐字稿的引用。

任何其他內容都必須註明出處:「索引報告指出…」。永遠不要將模型的猜測用你自己的語氣表達出來。

4. 在重要的地方深入

llvideo clip VIDEO --start 02:10 --end 02:40 --fps 4 -q "logo 動畫是否流暢?"
llvideo stills VIDEO --at 02:14,02:19 --width 1920   # 全解析度,親自查看
llvideo sheet VIDEO --at 01:00,01:05,01:10 --tile 768 --cols 2   # 密集的 UI 文字

剪輯是影格精確的,且花費數百個 token。可以自由使用。


理解影片的最佳視角——timeline

llvideo timeline VIDEO
llvideo timeline VIDEO --transcribe    # 逐字精確的語音時序

index 回傳 scenes、speech 和 audio_events 三個獨立的陣列。每個都準確,但它們之間沒有關聯——所以「儀表板特寫」和「他說範圍錯了」位於不同的列表中,而它們發生在同一時刻的事實則留待你去重建。

這種共現性就是脈絡。 一個鏡頭的意義取決於同時在說什麼。timeline 將所有內容交織在一條軌道上:

00:10-00:18  (8.0s)   *KEY*
    shot   駕駛員特寫
    see    鏡頭回到駕駛員身上,一個亮著燈的加油站滑過車窗
    does   車輛駛過明亮的加油站雨棚
    says   "加油站在片段開始九秒處出現。"
    hear   車內低沉的環境嗡嗡聲
    why    加油站雨棚直接從駕駛員後方經過

當問題涉及「意義」而非「清單」時,使用此模式優於 index。

--transcribe 會融合一個本地級別的逐字逐句稿,而非模型的語音。模型的音訊時間戳會有大約一秒的漂移,這足以在快速剪輯時將一行臺詞連接到錯誤的鏡頭。語音會被分配給它重疊最多的節拍,而不是第一個碰到的節拍,因此跨越剪輯點的一行臺詞會落在它主要被說出的地方。

它會報告覆蓋率,並標出運行時間中沒有任何內容被提及的任何部分。一個有空白的時間軸表示錯過了某些東西,而說出這一點比呈現一個不完整的帳戶作為完整內容要好。

後續問題是免費的

索引會根據內容身份和取樣設定快取 48 小時。實測:對同一部影片的第二個 timeline 從 12.5 秒和 $0.02 減少到 0.4 秒和無成本。盡可能多地提問——反覆迭代是建立理解的過程,並且在第一次處理之後不應再有任何成本。--no-cache 強制重新運行。


修復你發現的問題——fix

大多數審計結果不需要重新生成任何東西。錯誤的音量、削波的峰值、片頭或片尾的黑幀——這些都是確定性的 ffmpeg 操作,沒有成本且不會產生幻覺。

llvideo audit render.mp4        # 找出問題
llvideo fix render.mp4          # 修復它 -> render_fixed.mp4

自動修復: 綜合響度(兩遍 loudnorm 至 −14 LUFS)、真實峰值削波(限制在 −1.0 dBFS),以及黑色或白色的首/末影格——透過測量黑色實際結束的位置來修剪,而不是假定一個影格計數。

特意不修復的項目,每個都附有說明理由:

發現不修復的理由
時間軸中間的黑洞一個編輯決定,而不是一個要默默刪除的缺陷
凍結一個保持的影格可能是有意的——在時間軸中縮短它
低解析度放大會憑空創造出從未捕捉到的細節
安全邊距佈局是一個構圖選擇;移動元素,而不是裁切
時長 / 長寬比在渲染時設定;為了適應而修剪會剪掉內容

fix 之後會重新審計並報告之前/之後的計數,因為聲稱修復成功卻不重新測量,正是這個工具旨在打破的習慣。在一個刻意破壞的渲染上實測:5 個主要問題 + 1 個次要問題變成了 1 個主要問題 + 1 個次要問題,而留下的兩個正好是需要人類決策的兩個。

它永遠不會覆蓋原始檔。輸出會寫入 <name>_fixed.mp4,除非你傳遞 --out。


生成補充片段——gen

插入到其他地方建立的時間軸中的短片段:一個建立鏡頭、B-roll、紋理、Logo 動畫。不是整部電影。

llvideo gen "黎明時分,在霧氣瀰漫的松林上空,一個緩慢的推進空拍鏡頭" --seconds 5
llvideo gen "logo 定位到畫面中" --image logo.png --seconds 3    # 圖像轉影片
llvideo gen "相同場景,色調更冷" --video clip.mp4 --seconds 5   # 影片轉影片
llvideo gen-image "做舊木質標題卡" --out title.png

透過你現有的 XAI_API_KEY 在 Grok Imagine 上運行。請注意這是 xAI 的 Grok,不是 Groq——不同的公司。1 到 15 秒,以 1 秒為間隔,這比 Veo 固定的 4/6/8 秒更靈活。

解析度實測費用
480p$0.05/秒
720p$0.07/秒
1080p~$0.11/秒(外推,非實測)

這些費率來自 API 自己在真實工作上的使用情況字段,而非文件。任何超過 $1.00 的費用都需要 --yes。

每個片段在到達時都會被審計,這不是裝飾。Grok 自己的預設值會產生 848x480 且響度約為 -21 LUFS——兩者都會被審計器標記。因此 gen 預設使用 720p。然後親自查看:

llvideo sheet clip.mp4

--audio 會切換到 grok-imagine-video-1.5,它會生成配樂。生成的音訊往往會偏小聲;如果該片段要與其他素材放在一起,預計會出現響度問題,請在後製中進行標準化。


審計你製作的影片——spec + --from-project

這是完整的循環。HyperFrames、brag 和 Remotion 都已經知道自己原本要建構什麼,所以沒有人應該手寫一份意圖規格:

llvideo audit render.mp4 --from-project ./my-hyperframes-project
llvideo audit brag-output/brag.mp4 --from-project ./brag-output
llvideo audit out.mp4 --from-project ./my-remotion-project

或者單獨提取規格以檢查或編輯它:

llvideo spec ./project --out intent.json

意圖的來源,以及可以信任的程度:

來源提取內容可信度
HyperFrames index.html從 data-start / data-duration 取得場景開始/結束時間,從 DOM 取得螢幕文字精確
HyperFrames STORYBOARD.md每個影格的轉場類型和時長(transition_in)作者意圖
brag讀取它在 composition/ 下建構的 HyperFrames 專案;交叉檢查 brag-plan.md 的場景數量和總計精確 + 交叉檢查
Remotion .tsx<Sequence from= durationInFrames=> ÷ fps;<TransitionSeries.Transition presentation=>對於文字常數和 N * fps 是精確的;計算後的值會被跳過,而非猜測

任何無法靜態讀取的內容都會被記錄為註釋,而不是被假定——一個 springTiming 時長或一個 from={computeIt()} 會被標記並排除。

為什麼這個功能存在。 HyperFrames 的 check 在無頭 Chrome 中驗證已搜尋的合成時間軸。brag 的交付關卡止步於渲染前的快照。Remotion 根本沒有等價的關卡。它們都不會查看匯出的 MP4,因此編碼器錯誤、過時的渲染或匯出時的掉幀會在不被注意的情況下發送出去。這個功能填補了那個空白——這就是為什麼即使專案本身的檢查通過了,audit 仍然值得運行。

規格要求的淡出至黑色不會被報告為黑幀缺陷。只有未宣告的黑色才是一個發現。


轉場、運鏡與節奏——craft

對於「這個剪輯如何」、「使用了什麼轉場」、「分析剪輯」、「運鏡在做什麼」、「為什麼感覺很快」等問題——使用 craft,而不是 index。

llvideo craft VIDEO
llvideo craft VIDEO -q "00:14 處的剪輯是否落在節拍上?"

index 以 1 fps 對整個影片進行取樣,這對於「發生什麼事」來說沒問題,但對於「如何剪輯」則毫無用處:一個硬剪輯只佔據一個影格,因此在 1 fps 下你只看到剪輯前後的鏡頭,而永遠看不到轉場。craft 的工作方式不同:

  1. 一個免費的本地處理會對每個影格進行評分,並找出候選的轉場。這能捕捉到普通偵測器無法捕捉的柔和混合——一個 1 秒的交叉淡化峰值大約在 0.025,而場景偵測在 0.12 時觸發。
  2. 然後每個候選轉場會在一個狹窄的視窗中以 8 fps 重新檢查,因此模型能看到轉場逐影格發生的情況。
  3. 每個視窗中的亮度會用 ffmpeg 測量,這就是將「淡出至黑色」與「交叉淡化」區分開來的關鍵。沒有它,模型會把淡出至黑色誤認為交叉淡化;有了它,結果是正確的。

回傳鏡頭列表(大小、運鏡、構圖)、轉場列表(類型、精確時長、為何剪輯落在該處)、節奏統計、色彩與光線。

在一個已知轉場的影片上進行驗證——4/4 的類型正確,時長在 0.2 秒內:

建構偵測到
硬剪輯,瞬間hard_cut,瞬間
交叉淡化,1.0 秒crossfade,1.0 秒
淡出至黑色,0.6 秒fade_to_black,0.5 秒
向左擦除,0.8 秒wipe,0.63 秒

而在一個包含甩鏡的連續手持拍攝中,它正確地報告了一個鏡頭和零個轉場,而不是憑空創造一個剪輯。

運鏡不是剪輯。 甩鏡、快速傾斜或跟焦在低影格率下看起來和剪輯一模一樣。craft 是為了區分它們而建構的;index 則不是。如果問題是關於剪輯,請使用 craft。

標誌:--zoom-fps 12 用於非常快速的剪輯 · --max-windows 12 用於較繁忙的剪輯 · --no-zoom 跳過近距離處理(較便宜,但準確度低很多)。


螢幕文字是失敗模式。請認真對待。

模型會自信地讀取模糊的文字並弄錯。在真實影片中實測——同一個動態模糊的汽車儀表板,問了三次:

呼叫 1:"642"   "55 F"   "330 mi"
呼叫 2:"23.9"  "65 F"   "330"
呼叫 3:"6:42"  "55 F"   "330 mi"

任何單一答案中沒有任何東西會標記這個問題。所以不要依賴單一答案:

llvideo index VIDEO --verify 3

這會運行三次查詢,並報告哪些讀數是穩定的(每次運行都相同),哪些是不穩定的。將不穩定的讀數視為「顯示器存在但無法辨識」。如果一個不穩定的讀數很重要,請匯出全解析度靜態影像並親自閱讀:

llvideo stills VIDEO --at 00:11 --width 1920

當答案將被採取行動時,請使用 --verify 3:螢幕錄影中的錯誤訊息、儀表板上的數字、螢幕上的程式碼、價格、名稱。每次額外運行的成本大約與第一次相同——幾分錢。


審計渲染——audit

在你製作影片之後(Remotion、HyperFrames、brag、ffmpeg、Veo),你從未看過它。在發布前檢查它:

llvideo audit out.mp4                      # 僅限免費測量檢查
llvideo audit out.mp4 --craft              # 加上轉場和運鏡
llvideo audit out.mp4 --spec intent.json   # 加上與你要求內容的差異比較

免費檢查會捕捉到實際發生的錯誤。 無需模型,無需 token,無需網路:

  • 黑色或白色首/末影格——最常見的匯出缺陷,時間軸上的離一錯誤
  • 主體內的黑色空隙和凍結片段
  • EBU R128 響度和真實峰值削波,針對 -14 LUFS 平台目標
  • 靜音空隙,以及「音軌實際上是空的」
  • 宣告與隱含的影格率、解析度、位元率
  • 緊貼著影格邊緣的明亮細節(標題安全提示)

驗證:捕捉了 5 個刻意種植的缺陷中的 5 個,並在真實專業影片上回傳CLEAN,零發現。它不會狼來了。

每個發現都會說明它是測量值(ffmpeg 如此說,附帶數值)還是判斷值(模型認為如此)。切勿將判斷值作為事實呈現。

僅當存在阻礙因素時退出代碼為 1,因此它可以作為 CI 關卡使用。

與意圖進行差異比較

寫下影片應該是什麼樣子,然後進行比較:

{
  "duration_seconds": 30,
  "duration_tolerance": 0.5,
  "aspect": "16:9",
  "transitions": [
    { "from": 0, "to": 10, "type": "crossfade", "duration": 1.0 },
    { "from": 10, "to": 30, "type": "hard_cut" }
  ],
  "black_guard": { "head_ms": 100, "tail_ms": 100, "mid_ms": 500 },
  "loudness": { "integrated": -14, "true_peak": -1.0 },
  "black_frames": [],
  "frozen_frames": 0
}

然後 spec 會說出實際情況以及偏差所在。這對於想要自己的時間軸或元資料(例如 Veo 的標題卡)的專案來說比較嚴格,但意義完全相同。

spec 本身不是一個命令——它是一種傳遞給 audit 的模式。如果你只想要一個差異,請將規格儲存到一個檔案中並傳遞它。


多工——at

llvideo at VIDEO --at 01:00,01:05,01:10 "螢幕上顯示什麼?"

立即給你這些精確影格的答案,以及一張你可以查看的並排截圖。這與先進行 stills 再進行 vision 調用來分別詢問每個影格相同,但封裝成單一命令。

--width 1920 用於全解析度。對於需要高保真度以閱讀小文字的問題,請使用此選項。


常見問題或抱怨

「這個工具為一個簡單問題做了太多工作。為什麼要使用一個模型?」

因為你無法觀看影片。你能做的是對由一個可以看到該影片的模型所準備的證據進行推理。它們是互補的。

「『你無法觀看影片』聽起來像是針對我個人。」

不是。針對所有沒有完整視覺皮質的 LLM。就是這樣。

「我可以直接去一個影片平台…… 」

去吧。這個工具適用於當你已經在一個終端機中,正在編寫程式碼或自動化一個工作流程時。它是一個 API 工具,不是一個入口網站。

「但 Gemini 可以在內部處理多長的影片?」

最大約 1 小時的無損輸入。probe 會告訴你。

「你能自動化這個嗎?」

可以,但如果你跳過查看聯絡表或--verify 3 次,你會得到較差的答案。工具本身不會阻止你——它是為與合作 AI 搭配使用而設計的,這個 AI 應該知道要檢查來源。如果你是一個只透過 API 使用函數的獨立代理程式,那麼值得在每次 index 之後呼叫一個 read_contact_sheet 步驟。

相關技能