如何幫影片檔設定封面圖片 – 使用 MKV 容器
你是否嘗試過建立自己的影片倉庫呢?
YouTube 是一個很棒的平台,許多優秀的創作者在上面創造有趣的內容。但是快速發展的生態也代表了有許多人最終會被迫 黯然離場…
Anyway,如果想要更方便的管理影片庫存,一目瞭然的影片縮圖(thumbnail)是一個很有效的方法!!
Matroska 檔案格式
俄文матроска是матрёшка(俄羅斯娃娃)的誤讀,因為Matroska的工作原理就跟層層套疊的俄羅斯娃娃一樣,是「愈包愈緊」的,故得名。 – Wikipedia
這個格式可以把很多東打包在同一個檔案(容器)裡面(詳見規格)
- 影片:MPEG4、DivX4、 MPEG 1、MPEG 2、Real Video™、QuickTime™(部份)、ProRes 等
- 音訊:MPEG Audio、PCM、AC3、ALAC、FLAC、AAC 等
- 字幕:SSA、ASS、WEBVTT、VobSub 等
而且它還支援 Cover Art 的功能,想必當初自己轉過 .mp3
的玩家們應該都蠻熟悉的(自爆年齡)
我們這次要利用的就是這樣的功能!
使用 MKVToolNix GUI
首先安裝好你的 MKVToolNix GUI,Windows 版有很多人整理,連免安裝版都有,這裡就不談
Ubuntu 軟體中心裡面也能找到,一樣跳過(笑)
▲ 先準備好來源檔案,這裡使用已經畢業的信姬的影片(揮手帕)
▲ 將影片拖曳進 MKVToolNix GUI 的 輸入
▲ 將封面拖曳進 MKVToolNix GUI 的 附件
▲ 將剛才的封面重新命名為 cover.jpg
(用 .png
應該也行)
▲ 按下 Start multiplexing
▲ 鏘鏘~
使用 ffmpeg
搭配腳本
原文:windows – Tagging mkv files with cover images? – Stack Overflow
安裝 ffmpeg
:
sudo apt install ffmpeg
合成影片和圖檔(圖檔):
ffmpeg -i input.mkv -c copy -attach cover.jpg -metadata:s:t \
mimetype=image/jpeg output.mkv
-c
:指定 codec,這邊選copy
直接使用來源的資料,不轉換-attach
:附加檔案,這邊附加的是圖檔,也可以用來附加字幕-metadata:s:t
:指定 metadata,這邊用來設定mimetype=image/jpeg
注:建議將來源圖檔重新命名為 cover.jpg
/cover.png
避免在 Windows 上會無法正確顯示縮圖
Wndows 沒有顯示縮圖
請到 K-Lite Codec Pack 官方網站下載並安裝:
官方網站:https://codecguide.com/
▲ 找到並打開 Codec Tweak Tool,按下 Thumbnails
▲ 按下 Options
▲ 勾選 Use embeded cover as thumbnail (when available)
▲ 成功!!(因為 Explorer 的邏輯,我們的檔案變成地一個)
Ubuntu 沒有正確顯示封面
# 安裝編譯工具
sudo apt install build-essential cmake pkg-config
# 安裝需要的 libraries
sudo apt install libjpeg-dev libpng-dev zlib1g libavcodec-dev libavformat-dev libavfilter-dev
# 安裝 ffmpeg
sudo apt install ffmpeg
# 到 https://github.com/dirkvdb/ffmpegthumbnailer/releases 找最新版
wget https://github.com/dirkvdb/ffmpegthumbnailer/releases/download/2.2.2/ffmpegthumbnailer-2.2.2.tar.bz2
tar -xvf ffmpegthumbnailer-2.2.2.tar.bz2
cd ffmpegthumbnailer-2.2.2
# 根據 INSTALL 的敘述安裝
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GIO=ON -DENABLE_THUMBNAILER=ON .
make
# 在 Ububntu 上似乎會因為 bwarp 的關係,需要安裝到 /usr 底下才行
sed -i -e 's/set(CMAKE_INSTALL_PREFIX "\/usr\/local")/set(CMAKE_INSTALL_PREFIX "\/usr")/' cmake_install.cmake
sudo make install
修改 thumbnailer 設定檔(/usr/share/thumbnailers/ffmpegthumbnailer.thumbnailer
)
sudo sed -i 's/Exec=ffmpegthumbnailer -i %i -o %o -s %s -f$/Exec=ffmpegthumbnailer -i %i -o %o -s %s -f -m/' /usr/share/thumbnailers/ffmpegthumbnailer.thumbnailer
效果如下:
- Exec=ffmpegthumbnailer -i %i -o %o -s %s -f
+ Exec=ffmpegthumbnailer -i %i -o %o -s %s -f -m
故障排除心得
說真的,這篇文章原本是預定在 5/1,也就是勞動節,也就是信姬(YT)正式引退的隔天發佈
沒想到 ffmpegthumbnailer 2.2.2
的設定遇到問題,怎麼樣都無法跟 nautilus
配合產生縮圖,最後只能跑到 AskUbuntu 求救:ubuntu gnome – ffmpegthumbnailer command works, but nautilus failed to genereate thumbnails – Ask Ubuntu
有興趣的人可以看一下上面的文章,來回測試的過程,真的是繞了很大一圈 Orz
Anyway,一開始我猜測問題出在 bwrap
上。自從有人試圖透過 nautilus
會自動呼叫縮圖工具的特性,開採相關工具的漏洞,所以自此之後,所有的縮圖工具都必須在沙盒中執行。而 bwrap
就是那個沙盒。
參見:USB Autorun attacks against Linux – Jon Larimer.pdf / IBM X-Force Advanced R&D
不過這並未解釋為何無法執行,因為若是直接印出 bwrap
的指令,似乎仍然可以正確綁定 /usr/local
。
到了後來,在 oscar1919 發現把檔案從 /usr/local
移至 /usr
之後就能解決這個問題,我開始想,是不是有辦法不要手動複製,直接指定 ffmpegthumbnailer
的安裝路徑呢?
答案是可以的,只要透過 DESTDIR
這個參數即可,像這樣:
make DESTDIR=/home/play_pc/targget install
安裝的目錄 ~/targget
裡面的檔案如下
targget
└── usr
└── local
├── bin
│ └── ffmpegthumbnailer
├── include
│ └── libffmpegthumbnailer
│ ├── ffmpegthumbnailertypes.h
│ ├── filmstripfilter.h
│ ├── ifilter.h
│ ├── imagetypes.h
│ ├── videoframe.h
│ ├── videothumbnailerc.h
│ └── videothumbnailer.h
├── lib
│ ├── libffmpegthumbnailer.so -> libffmpegthumbnailer.so.4
│ ├── libffmpegthumbnailer.so.4 -> libffmpegthumbnailer.so.4.15.1
│ ├── libffmpegthumbnailer.so.4.15.1
│ └── pkgconfig
│ └── libffmpegthumbnailer.pc
└── share
├── man
│ └── man1
│ └── ffmpegthumbnailer.1
└── thumbnailers
└── ffmpegthumbnailer.thumbnailer
更進一步的 ag
指令查找發現 cmake_install.cmake
裡面有一行
set(CMAKE_INSTALL_PREFIX "/usr/local")
只要把 /usr/local
換成 /usr
就可以安裝到 Ubuntu 預設的 ffmpegthumbnailer
套件的安裝位置(請使用 which
和 ldd
指令驗證)
參考資料
- Codec Specs | Matroska
- 官方的 Codeo 列表,非常方便
- K-Lite Codec Pack – 維基百科,自由的百科全書
- 提供了版本比較
- [Feature Request] Matroska Cover · Issue #138 · dirkvdb/ffmpegthumbnailer
- 這裡提到了 Matroska 封面的問題,從
v2.2.0
開始支援
- 這裡提到了 Matroska 封面的問題,從