全程使用 CHAT GPT4 提供幫助
通常而言,電腦上的資源管理器會使用視頻的第一幀來作爲縮略圖,如果視頻文件中有封面存在,則會使用封面作爲文件縮略圖(Windows 自帶的資源管理器是這樣,具體要看資源管理器的實現)
與 GPT4 溝通後,發現可以使用 ffmpeg 爲視頻添加封面。原理是爲文件添加一個視頻流,並標記爲封面。
添加封面
ffmpeg -i input.mp4 -i cover.jpg -map 0 -map 1 -c copy -disposition:v:1 attached_pic output.mp4
這個ffmpeg命令用於將一張圖片(cover.jpg)作爲封面嵌入到一個MP4視頻文件(input.mp4)中,並輸出一個新的視頻文件(output.mp4)。命令中的各個選項和參數含義如下:
ffmpeg: 這是命令行程序的名稱,用於調用FFmpeg工具。
-i input.mp4
: -i標誌指定輸入文件,這裏input.mp4是第一個輸入文件,即原視頻文件。
-i cover.jpg
: 再次使用-i標誌添加第二個輸入文件,這裏cover.jpg是你想嵌入爲封面的圖片文件。
-map 0
: -map選項用於手動選擇輸入流(視頻、音頻、字幕等)添加到輸出文件中。0是一個索引號,指的是第一個-i參數指定的文件(即input.mp4)。這個選項指示FFmpeg將整個第一個輸入文件的所有流(視頻流、音頻流等)複製到輸出文件中。
-map 1
: 同理,這裏1指的是第二個輸入文件,即cover.jpg。這個選項指示FFmpeg將圖片作爲一個單獨的流添加到輸出文件中。
-c copy
: -c選項指定編解碼器(codec)。這裏使用copy來告訴FFmpeg對所有選定的流進行“直接複製”,即不要重新編碼,保持原有格式和質量。這可以減少處理時間並避免質量損失。
-disposition:v:1 attached_pic
: 這裏的-disposition選項用於設置特定流的處置類型。v:1是一個流選擇器,它指定要處理的是第二個視頻流(在這個上下文中,是我們的封面圖片)。attached_pic表示這個流應被視作附加的圖片,通常用於封面或縮略圖。
output.mp4: 指定輸出文件的名字。
總結起來,這個命令告訴FFmpeg將input.mp4視頻的所有流,以及cover.jpg圖片作爲封面,一起復制到output.mp4輸出文件中,而不重新編碼它們,並將封面圖片設置爲“附加圖片”以供播放器識別。
移除已有封面
如果一個視頻文件已經有了封面,則可能需要先移除原有封面。
如已經存在的文件的流是這樣的
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080, 5004 kb/s, 29.97 fps, 29.97 tbr, 29970 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 185 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream #0:2[0x0]: Video: mjpeg (Baseline), yuvj444p(pc, bt470bg/unknown/unknown), 1280x857 [SAR 72:72 DAR 1280:857], 90k tbr, 90k tbn (attached pic)
要移除的其實就是第 3 個流
ffmpeg -i 1.mp4 -map 0 -map -0:2 -c copy output_nocover.mp4
-i 1.mp4
:這是 input file 的標誌,1.mp4 是要處理的視頻文件名。
-map 0
:這個選項告訴 ffmpeg 將輸入文件 1.mp4 中的所有流(音頻、視頻、字幕等)都映射到輸出文件。這裏的 0 代表輸入文件的索引號,通常情況下一個命令中只有一個輸入文件,所以這裏用 0 來表示它。
-map -0:2
:這是一個排除特定流的選項。-map 選項之後的 - 符號表示排除操作。0:2 指代輸入文件中的第三個流(流的索引從0開始計數),根據您提供的 ffmpeg -i 輸出信息,這個流是封面圖片。因此,這個選項告訴 ffmpeg 排除這個封面圖片流,不將它映射到輸出文件中。
-c copy
:這個選項指示 ffmpeg 對所有被映射的流(即除了被排除的封面圖片流之外的所有流)使用“複製”編解碼器。這意味着 ffmpeg 不會對音頻、視頻進行重新編碼,而是直接複製原始數據。這樣可以加快處理速度,同時避免質量損失。
output_nocover.mp4
:這是輸出文件的名字,處理後的文件將不再包含原來的封面圖像。
總結來說,這條命令的作用是複製 1.mp4 文件中的所有流到一個新的文件 output_nocover.mp4,但是排除了封面圖像流。這樣處理後的視頻文件將保留原有的視頻和音頻流,但不包括封面圖像。
附查看文件中流信息的命令
ffprobe -i input.mp4 -hide_banner