用Python輕松搞定視頻轉(zhuǎn)gif動(dòng)圖

作者 |?道才
來(lái)源 | 可以叫我才哥
不知道大家是不是有過(guò)類似的經(jīng)歷,在看視頻的時(shí)候覺(jué)得某段非常有意思想弄成動(dòng)圖,但是無(wú)從下手!或可以在網(wǎng)上找一些在線工具但是多多少少需要付費(fèi)或者帶有水印之類的,那么!?
對(duì),今天我們就來(lái)學(xué)習(xí)用Python搞定這一需求吧!

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


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


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

本次轉(zhuǎn)動(dòng)圖的參數(shù)設(shè)定如下:
subclip((2,4.5),(2,6.0)?選取的是整個(gè)視頻從2.45秒到2.60秒resize(0.2)尺寸大小改為原始大小的0.2也就是1/5大小(畢竟動(dòng)圖尺寸大小其文件大小也太大)write_gif("動(dòng)圖搞定了.gif",fps=8)保存gif的時(shí)候?qū)收{(diào)整為了8
基于上述參數(shù)設(shè)定下,這個(gè)動(dòng)圖一共其實(shí)是(2.60-2.45)*8=12張圖構(gòu)成!



3. 截取區(qū)域轉(zhuǎn)動(dòng)圖
有時(shí)候我們可能只需要截取屏幕中指定矩形區(qū)域來(lái)進(jìn)行動(dòng)圖的制作,這就要用到crop函數(shù)截圖區(qū)域了。
video.crop(
????x1=None,
????y1=None,
????x2=None,
????y2=None,
????width=None,
????height=None,
????x_center=None,
????y_center=None,
)
參數(shù):
x1、y1:矩形區(qū)域左上角坐標(biāo)
x2、y2:矩形區(qū)域右下角坐標(biāo)
width、height:是寬度和高度
x_center、y_center:表示x1的坐標(biāo)為x_center-width/2,x2的坐標(biāo)為x_center+width/2,y_center類似處理
比如,我們截圖人物所在區(qū)域制作動(dòng)圖代碼如下:
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)

這里關(guān)于左上角和右下角坐標(biāo)的確定可以采用preview方法預(yù)覽視頻,然后鼠標(biāo)點(diǎn)擊對(duì)應(yīng)位置來(lái)獲取。
video.resize(0.2).preview()

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



5. 添加自定義文本
對(duì)于上面這個(gè)操作,我們還有很多方法來(lái)完成,比如用一張帶有搞定了的圖片去覆蓋(和上面的案例類似,只是不需要單獨(dú)截圖而是讀取一張現(xiàn)成的);另外,我們還可以通過(guò)添加蒙版再加上自定義文字的形式來(lái)玩。
from?moviepy.video.VideoClip?import?TextClip
#?蒙版
mask?=?(#?長(zhǎng)寬為40*20的顏色為黑色的mask
?????ColorClip((40,?20),?(0,?0,?0))
?????#?設(shè)置位置(同第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)

以上就是本次的全部?jī)?nèi)容了,關(guān)于moviepy這個(gè)庫(kù)還有很多種好玩的用于視頻剪輯的功能,我們后續(xù)再慢慢研究分享與學(xué)習(xí)吧~
覺(jué)得不錯(cuò),請(qǐng)點(diǎn)個(gè)在看
