如何幫影片檔設定封面圖片 – 使用 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 軟體中心裡面也能找到,一樣跳過(笑)

input files

▲ 先準備好來源檔案,這裡使用已經畢業的信姬的影片(揮手帕)

drag&drop video

▲ 將影片拖曳進 MKVToolNix GUI 的 輸入

drag&drop cover art

▲ 將封面拖曳進 MKVToolNix GUI 的 附件

rename cover art

▲ 將剛才的封面重新命名為 cover.jpg(用 .png 應該也行)

start multiplexing

▲ 按下 Start multiplexing

result

▲ 鏘鏘~

使用 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

▲ 找到並打開 Codec Tweak Tool,按下 Thumbnails

Thumbnail Settings

▲ 按下 Options

Thumbnail Options

▲ 勾選 Use embeded cover as thumbnail (when available)

Thumbnail Options

▲ 成功!!(因為 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 套件的安裝位置(請使用 whichldd 指令驗證)

參考資料

發表迴響