使用 ffmpeg 爲視頻文件添加封面

全程使用 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章