用FFmpeg製作WebP動圖

2020-10-20 11:01:07

去年寫過一篇文章,是教大家用FFmpeg製作GIF動畫的。今天在討論到專案中碰到的一個.apng動畫素材引起的程式崩潰時,有位同學建議:我們為啥不用WebP來代替.apng?是啊,why not?

網上搜到一篇文章。自己試了一下,發現強大的FFmpeg果然支援製作WebP動圖,於是順手做了些筆記。

先來試一下這條命令:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -lossless 1 -loop 0 -y D:\bear-lossless.webp

意思是:D:\Media目錄下的原始檔bear.wmv,從第25秒的位置開始,擷取5秒長度的視訊,畫面寬度按比例縮放到240畫素,並且控制輸出影格率為10fps後轉成webp檔案,最終儲存為D:\bear-lossless.webp。注意到,我們這次用的是無失真壓縮(-lossless 1),並且生成的動畫是無限迴圈播放的(-loop 0)。

當你迫不及待地找到新鮮生成的bear-lossless.webp檔案,雙擊滑鼠,彈出了系統預設的看圖軟體——呃,怎麼不是動畫呀?莫急!那只是因為你用的看圖軟體太菜了。將bear-lossless.webp檔案拖進Chrome瀏覽器吧,馬上就看到效果了!

既然提到了無失真壓縮,接下來我們再試試有失真壓縮吧,這時用到了qscale品質因子,它的取值範圍為0-100,數值越高影象品質越好。我們用80來試試,命令列如下:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -qscale 80 -loop 0 -y D:\bear-q80.webp

作為對比,我們用相同的這段視訊生成一個GIF動畫,命令列如下:

ffmpeg -ss 25 -t 5 -i D:\Media\bear.wmv -vf scale=240:-1 -r 10 -y -f gif D:\bear.gif

對比後發現,無失真壓縮的bear-lossless.webp檔案最大,有1.3MB;採用有失真壓縮後,bear-q80.webp檔案變小了很多,只有177KB;而同樣較小的bear.gif檔案(僅154KB),影象品質明顯差於bear-q80.webp。說明什麼問題?WebP壓縮演演算法優秀啊!

bear-lossless.webp
bear-q80.webp
bear.gif

回到實際的軟體專案中來,我們要用的WebP能從視訊中抽取出來嗎?通常情況不是這樣的。設計師往往會製作完整動畫過程所對應的一系列靜態圖片。那麼,怎樣把這個圖片序列生成一個WebP動圖呢?其實也很簡單,命令列如下:

ffmpeg -f image2 -framerate 10 -i D:\Media\pics\cache_loading_%02d.jpeg -loop 0 -y D:\loading.webp

意思是:將設計師製作的動畫單幀圖片分別按照cache_loading_xx.jpeg格式命名,其中xx是連續的兩位整數,並把這些檔案都放在同一個資料夾下。執行上述命令後,這些靜態檔案按照影格率10fps生成一個WebP動圖檔案D:\loading.webp。

設計師製作的原始素材須規範命名

很棒哦,快把loading.webp拖進Chrome瀏覽器看看吧!對比檔案大小(loading.apng 81KB vs. loading.webp 42KB),差不多縮減了一半,滿滿的驚喜!

loading.webp