一日一技:用Python輕鬆搞定影片轉gif動圖

語言: CN / TW / HK

不知道大家是不是有過類似的經歷,在看影片的時候覺得某段非常有意思想弄成動圖,但是無從下手! 或可以在網上找一些線上工具但是多多少少需要付費或者帶有水印之類的,那麼!

對,今天我們就來學習用 Python 搞定這一需求吧!

動圖效果

目錄:

  • 1. 準備工作

  • 2. 初探

  • 3. 擷取區域轉動圖

  • 4. 固定區域轉動圖

  • 5. 新增自定義文字

1. 準備工作

需要準備用於生成 gif影片檔案 ,我這裡用的是上次《 用Python製作一個B站影片下載小工具(文末附完整程式碼) 》裡案例中的影片。另外,就是需要用到 moviepy 庫,關於這個庫更詳細的介紹可以檢視它的官方文件。

https://zulko.github.io/moviepy/

命令列鍵入pip安裝吧

pip install moviepy

這就搞定第1步了!

2. 初探

這一步也是我們開篇第一張動圖的製作指令碼。

from moviepy.editor import *

video_path = "F:\PythonCool\影片\【咒術回戰】第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大小(畢竟動圖尺寸大小其檔案大小也太大)
  • write_gif("動圖搞定了.gif",fps=8) 儲存gif的時候將幀率調整為了8

基於上述引數設定下,這個動圖一共其實是 (2.60-2.45)*8=12 張圖構成!

動圖屬性

3. 擷取區域轉動圖

有時候我們可能只需要擷取螢幕中指定矩形區域來進行動圖的製作,這就要用到 crop 函式截圖區域了。

video.crop(
x1=None,
y1=None,
x2=None,
y2=None,
width=None,
height=None,
x_center=None,
y_center=None,
)

引數:

x1y1 :矩形區域左上角座標

x2y2 :矩形區域右下角座標

widthheight :是寬度和高度

x_centery_center :表示x1的座標為x_center-width/2,x2的座標為x_center+width/2,y_center類似處理

比如,我們截圖人物所在區域製作動圖程式碼如下:

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. 固定區域轉動圖

對於上面那個動圖中 的搞定了,我們希望它常駐,那麼可以通過截圖搞定了出現這一時刻的內容,然後覆蓋到原來位置常駐即可。

snapshot = (crop
# 截圖區域
.crop(x1=100,y1=190, x2=140,y2=216)
# 擷取的時間段(1秒的時候)
.to_ImageClip(1)
# 設定位置(左上角,和擷取區域的左上角一致)
.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節)
.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 這個庫還有很多種好玩的用於影片剪輯的功能,我們後續再慢慢研究分享與學習吧~

未聞 Code·知識星球開放啦!

一對一答疑爬蟲相關問題

職業生涯諮詢

面試經驗分享

每週直播分享

......

未聞 Code·知識星球期待與你相見~

一二線大廠在職員工

十多年碼齡的程式設計老鳥

國內外高校在讀學生

中小學剛剛入門的新人

“未聞 Code技術交流群” 等你來!

入群方式:新增微信“mekingname”,備註“粉絲群”(謝絕廣告黨,非誠勿擾!)