科技 · 實用指南
FFprobe 選到封面?先核實視訊串流,再交給 FFmpeg
先排除附加圖片,確認候選數量,再用真正的串流索引檢查同一檔案的預覽。

檔案裡的一條視訊串流可能只是封面圖片。腳本若把第一筆視訊記錄視為主影片,就可能讀到封面尺寸或產生錯誤縮圖。先查看串流清單;更換輸出編碼器並不能證明選對了輸入。
本流程適用於完整且不再變動的本機檔案,目標是產生單一視訊串流的檢查預覽。候選為零個、一個或多個時分別處理;它不會移除媒體庫封面、自動挑選偏好的拍攝角度,也不負責修復直播映射。
1. 篩選之前,保留完整清單
記錄檔案路徑、大小、修改時間,以及 FFmpeg 和 ffprobe 的實際建置版本。使用不會繼續變動的副本,尤其避免仍在下載或被其他程式改寫的檔案。執行 ffprobe -v error -show_streams -show_format -of json "INPUT",保存標準輸出、錯誤輸出及結束碼,並將 INPUT 換成實際路徑。探測失敗應另行處理;部分或空白 JSON 不代表清單取得成功。
逐條查看 index、codec_type、codec_name、尺寸、標籤及 disposition。不能因為某個案例的封面用了 MJPEG,就排除所有 MJPEG 串流;缺少影格數或看似為零的影格率,也不能單獨確定主影片。獨立的 Stack Overflow 問題展示了這種排列:附加 MJPEG 圖片在 H.264 視訊之前。
2. 先確認候選數量,再作選擇
執行 ffprobe -v error -select_streams V -show_entries stream=index,codec_name,width,height:stream_disposition=default,attached_pic:stream_tags=title,language -of json "INPUT"。此處的大寫 V 是刻意的。命令成功後才讀取 streams 陣列;缺少的選填中繼資料仍屬未知。這能排除被識別為封面的串流,卻無法識別所有標記錯誤的靜態圖片。
零個候選:保留清單,停止視訊預覽流程;帶封面的音訊檔可能正常出現這個結果。一個候選:保留真正的 index,再檢查畫面。多個候選:比較標籤、尺寸與預覽,明確選定軌道。default 標記或較高解析度可提供線索,卻無法決定你要哪個內容。不要只為了消除歧義就加上 :0。
3. 傳遞真正索引,不傳陣列位置
假設篩選後 JSON 只有一筆,含有 index: 1。它在陣列中是 streams[0],但仍對應輸入串流 1。將同一檔案當作 FFmpeg 的第一個輸入時,明確映射應為 0:1:前面的 0 指輸入檔案,後面的 1 指其中的串流。腳本應將 index、選定檔案及選擇依據一併保留。
檔案、輸入順序或解多工選項改變後,應重新探測。不要直接套用到直播網址、持續更新的播放清單或仍在增長的錄影檔:再次開啟可能看見不同清單。Jellyfin 的直播電視問題報告曾描述這種列舉差異;這是特定使用者案例,不代表所有本機容器或直播來源都有相同行為。
4. 另存預覽,並分清錯誤類型
以確認過的索引 1 為例,執行 ffmpeg -hide_banner -loglevel error -nostdin -n -i "INPUT" -map 0:1 -frames:v 1 "preview-check.jpg"。換成實際索引,使用尚不存在的輸出檔名。命令刻意只產生一張圖片,不含音訊或其他軌道。開啟圖片,核對可辨識的內容是否屬於目標影片;若開頭是黑畫面,可另外取較後方的樣本檢查。
若畫面選對了,卻仍有編碼器或位元串流濾鏡錯誤,應檢查完整命令,而非刪除封面。Immich 曾發生縮圖故障:HEVC 中繼資料濾鏡過度廣泛地套用到視訊串流,連 MJPEG 附圖也受到影響。專案修正將濾鏡限制於選定串流,並於 2026 年 5 月 1 日獲准合併。這顯示參數作用範圍是另一個問題,並不能證明現在所有 Immich 安裝都有此故障。
5. 用範圍明確的證據確認結果
我們以 Ubuntu FFmpeg 6.1.1-3ubuntu5 進行合成測試。帶封面的 MP3 回傳一條 v 串流、零條 V 串流;音訊排在前面的 MP4 回傳一條 V 候選,絕對索引為 1,但陣列位置為 0;雙視訊 MP4 回傳兩個候選,因此流程停止,要求人工選擇。單一候選的預覽可開啟,選定串流完整解碼的結束碼為零,三份輸入檔案的雜湊值均未改變。
測試並未重現 Immich 報告中的 DJI 原始檔,也未測試直播或所有 FFmpeg 建置版本。處理自己的檔案時,保留清單、索引、完整命令和結果。可再用 ffmpeg -hide_banner -loglevel error -nostdin -i "INPUT" -map 0:1 -f null - 檢查選定串流解碼,並換成正確索引;它會讀取該串流,可能需要整段影片的處理時間。除了結束碼,也要檢查錯誤輸出。正確的單張圖片或順利解碼,都不能證明已選到偏好的角度,或後續匯出保留了所有軌道。
