用Python輕松搞定視頻轉gif動圖

作者 |?道才
來源 | 可以叫我才哥
不知道大家是不是有過類似的經歷,在看視頻的時候覺得某段非常有意思想弄成動圖,但是無從下手!或可以在網上找一些在線工具但是多多少少需要付費或者帶有水印之類的,那么?。?/p>
對,今天我們就來學習用Python搞定這一需求吧!

目錄:
1. 準備工作
2. 初探
3. 截取區(qū)域轉動圖
4. 固定區(qū)域轉動圖
5. 添加自定義文本


1. 準備工作
需要準備用于生成gif的視頻文件,需要用到moviepy庫,關于這個庫更詳細的介紹可以查看它的官方文檔。
https://zulko.github.io/moviepy/
命令行鍵入pip安裝吧
pip?install?moviepy
這就搞定第1步了!


2. 初探
這一步也是我們開篇第一張動圖的制作腳本。
from?moviepy.editor?import?*
video_path?=?"F:\PythonCool\視頻\【咒術回戰(zhàn)】第20集五條悟帥的有些過分了.mp4"
video?=?VideoFileClip(video_path)
clip?=?(video.subclip((2,4.5),(2,6.0))
????????.resize(0.2))
clip.write_gif("動圖搞定了.gif",fps=8)
我們原始視頻素材是尺寸1920*1080,幀率是30。

本次轉動圖的參數設定如下:
subclip((2,4.5),(2,6.0)?選取的是整個視頻從2.45秒到2.60秒resize(0.2)尺寸大小改為原始大小的0.2也就是1/5大?。ó吘箘訄D尺寸大小其文件大小也太大)write_gif("動圖搞定了.gif",fps=8)保存gif的時候將幀率調整為了8
基于上述參數設定下,這個動圖一共其實是(2.60-2.45)*8=12張圖構成!



3. 截取區(qū)域轉動圖
有時候我們可能只需要截取屏幕中指定矩形區(qū)域來進行動圖的制作,這就要用到crop函數截圖區(qū)域了。
video.crop(
????x1=None,
????y1=None,
????x2=None,
????y2=None,
????width=None,
????height=None,
????x_center=None,
????y_center=None,
)
參數:
x1、y1:矩形區(qū)域左上角坐標
x2、y2:矩形區(qū)域右下角坐標
width、height:是寬度和高度
x_center、y_center:表示x1的坐標為x_center-width/2,x2的坐標為x_center+width/2,y_center類似處理
比如,我們截圖人物所在區(qū)域制作動圖代碼如下:
crop?=?(video.subclip((2,4.5),(2,6.0))
????????.resize(0.2)
????????.crop(x1=70,y1=0,?x2=310,y2=216))?
crop.write_gif("裁剪.gif",fps=8)

這里關于左上角和右下角坐標的確定可以采用preview方法預覽視頻,然后鼠標點擊對應位置來獲取。
video.resize(0.2).preview()

4. 固定區(qū)域轉動圖
對于上面那個動圖中 的搞定了,我們希望它常駐,那么可以通過截圖搞定了出現這一時刻的內容,然后覆蓋到原來位置常駐即可。
snapshot?=?(crop
????????????#?截圖區(qū)域
????????????.crop(x1=100,y1=190,?x2=140,y2=216)?
????????????#?截取的時間段(1秒的時候)
????????????.to_ImageClip(1)
????????????#?設置位置(左上角,和截取區(qū)域的左上角一致)
????????????.set_position((100,?190))
????????????.set_duration(crop.duration))
#?合并
composition?=?CompositeVideoClip([crop,?snapshot])
composition.write_gif('覆蓋.gif',?fps=8)



5. 添加自定義文本
對于上面這個操作,我們還有很多方法來完成,比如用一張帶有搞定了的圖片去覆蓋(和上面的案例類似,只是不需要單獨截圖而是讀取一張現成的);另外,我們還可以通過添加蒙版再加上自定義文字的形式來玩。
from?moviepy.video.VideoClip?import?TextClip
#?蒙版
mask?=?(#?長寬為40*20的顏色為黑色的mask
?????ColorClip((40,?20),?(0,?0,?0))
?????#?設置位置(同第4節(jié))
????????.set_pos((100,?190))
????????.set_duration(crop.duration)
????????)
#?文字
text?=?(TextClip("搞定啦",
?????????????????fontsize=30,?color='white',
?????????????????font='SimHei',?interline=-25)
????????.set_pos((80,?160))
????????.set_duration(crop.duration))
composition?=?CompositeVideoClip([crop,?mask,?text])
composition.write_gif('覆蓋.gif',?fps=8)

以上就是本次的全部內容了,關于moviepy這個庫還有很多種好玩的用于視頻剪輯的功能,我們后續(xù)再慢慢研究分享與學習吧~
覺得不錯,請點個在看
