天天看點

用ffmpeg将視訊轉成gif動圖

  今天分享一個我制作表情包的技巧。現在視訊編輯的門檻已經非常低了,隻要裝個剪映稍微學一下,很容易就能把你想要的内容剪出來,真的是有手就行。但是視訊剪出來的視訊是無法直接用做表情包的,隻有gif格式的動圖才是真正可以用的表情包。另外一點,在微信、企微等通訊軟體中,gif動圖的大小也是有嚴格限制的,比如微信和企微裡最大是5MB,超過這個大小就會被當成檔案傳輸,且無法被别人收藏轉發,也就失去了表情包的意義。我這裡分享一些用ffmpeg來生成gif動圖的指令行示例,助力大家生産出更多有趣的表情包。

  首先就是将一個視訊直接轉成gif動圖,基本指令格式如下:

ffmpeg -i 你的視訊檔案.mp4 生成的檔案名.gif      

例如:

ffmpeg -i vid20221028.mp4 out.fig      

  是不是相當簡單。那麼,如果說原始視訊太長,你隻想截取其中的一段視訊生成gif,你可以增加-ss和-t兩個參數,-ss代表的是start time,也就是開始時間,你可以指定開始的具體秒數,也可以用時:分:秒.毫秒的格式,比如00:12:14.500。-t是要截取的時長,機關是秒。假設我們想從input.mp4裡的第73.5秒開始,截取12秒的視訊内容生成動圖,指令行你可以寫成如下的方式:

ffmpeg -i input.mp4 -ss 73.5 -t 12 out.gif
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 out.gif      

  但是,當gif生成後,你會發現gif的大小非常大,這是因為你沒有指定目标幀率和分辨率,ffmpeg會延用原始視訊的相關參數,這時候可以考慮以下幾種方式來降低生成gif動态的大小。

降低動圖的幀率

  用-r參數來降低征率,比如原始的input.mp4是30幀的,可以用-r 15來降低成15幀。具體效果也是很明顯的,生成的檔案大小從原來的86MB下降到56MB,具體指令行如下:

ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -r 15 out1.gif      

  關于ffmpeg的-r參數,有個很小坑,-r參數一定要放到-i參數後面,它在前在後的作用是不一樣的。

調整畫面分辨率

  比如原始視訊是1080p的,我們可以将其減低到480p,進而顯著降低最終的gif檔案大小,這裡可以使用-s參數,後面跟具體的分辨率大小比如480x272 具體指令如下:

ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -s 480x272 out2.gif      

  有些時候,我們不知道原始的視訊分辨率,如果貿然指定目标分辨率的話,可能會導緻畫面被拉伸,觀感下降,這時候可以使用一個更進階的參數-vf,-vf其實就比較複雜了,這裡我們隻看如何用-vf參數實作寬高等比例縮放吧,具體指令如下:

#scale後面可以指定具體的分辨率寬:高,作用同-s,也可以隻指定寬或者高,
#另一者用-d代替,ffmpeg就會自動縮放,保持原比例
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -vf "scale=480:-1" out3.gif      
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -vf "scale=480:-1" -r 15 out4.gif