2016/05/08

製作 GIF 動圖的方法(2)

Make an animated GIF from the command line (2)


【前言】

若未看過,請先看前一篇,了解基本設定。

本文敘述自影片中抽出圖片,再製作成動圖的方法。來源是 BuzzFeed YouTube 的影片。下載後,檔名改為 source.mp4


【步驟】

1. 尋找目標。

第一步當然是先看影片,記住欲抽出的時段。本例是 1:12 1:15。保險一點,前後各多取 1 秒,即自 1:11 6 秒。


2. 抽出圖片。

ffmpeg -ss 1:11 -i source.mp4 -t 6 images\1%3d.png

 -ss: 起點。格式:秒或 hh:mm:ss[.xxx]
 -i: 來源檔名。
 -t: 時長。格式:秒或 hh:mm:ss[.xxx]
 1%3d 是檔名模式,1001 起算,1 是為了分類。

註一:此指令順序很重要-ss 是影片的選項,要在 -i 前;-t 是輸出終止時長,要在輸出檔前。


3. 選圖。

進入 images 資料夾:

a. 計算:每秒圖數(frame rate) = 總圖數 / 時長。

 此例是 144 / 6 = 24 (frames/sec)

b. 去除前後不要的圖片。

c. 記住餘圖中,頭尾兩檔名稱。

 此例是 1016 1121


4. 編輯圖片。

for /L %a in (1016,2,1121) do (
magick convert images\%a.png -crop 1080x720+0+0 -resize 30% +repage images\b%a.png
)

 (1016,2,1121): 1016.png 起,每 2 個圖取 1 個,直到 1121.png。最後面的圖可能會被跳過。
 -crop: 裁剪。自左上角 (0,0) 起取寬 1080、高 720。先用繪圖軟體觀察,"小畫家"即可。
 -resize: 改變尺寸。
 +repage: 重設畫布值。
 輸出檔名頭稍加更改以便區別。

3 項都是為了減少動圖的檔案尺寸,因為動圖的最大問題就是檔案太大。這大概就是 Facebook 不開放直接貼動圖的原因。


5. 製作動圖。

magick convert -delay 2x24 images\b*.png -fuzz 1% -layers OptimizeTransparency baby.gif

 -delay: 間隔。2 是因為每 2 個圖取 1 個;24 是影片速率(frame rate),即上述每秒圖數。2x24 近似 8x100,故此設定相當於 -delay 8
 -fuzz: 降低色數。1% 內的顏色視為同色。此為減少動圖的檔案尺寸。fuzz 數值愈大,尺寸愈小,但會失真。
 -layers: 處理動圖圖層的方式。文長不述,自閱 ImageMagick 選項說明。OptimizeTransparency 會看 fuzz 的設定。


【後語】

1. 本例是先抽出影片中某一片段的所有畫格,然後每 2 個圖取 1 個。如果已確定是要每 2 個圖取 1 個,可以在抽出時直接設定:

ffmpeg -ss 1:11 -i source.mp4 -r 12 -t 6 images\1%3d.png

 -r: rate,每秒畫格數。24 / 2 = 12

此法的優點是只取須要的圖,可減短抽取時間。但缺點不少:
a. 必須先知道影片速率(frame rate)
b. 必須先知道要每 2 個圖取 1 個。
c. 如果想每 3 個圖取 1 個呢?就必須重新抽取一次。

所以建議:還是先抽出片段中的所有畫格。


2. 不難吧!下一篇敘述製作動圖的一些變化,用的來源圖是前一篇的數字方圖。


【附錄】批次檔的完整內容

ffmpeg -ss 1:11 -i source.mp4 -t 6 images\1%%3d.png

echo 選圖
pause

for /L %%a in (1016,2,1121) do (
magick convert images\%%a.png -crop 1080x720+0+0 -resize 30%% +repage images\b%%a.png
)

magick convert -delay 2x24 images\b*.png -fuzz 1%% -layers OptimizeTransparency baby.gif

1 則留言: