利用Python輕松實現視頻轉GIF動圖

前言

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

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

動圖效果

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)

自定義文本

到此這篇關於利用Python輕松實現視頻轉GIF動圖的文章就介紹到這瞭,更多相關Python視頻轉GIF內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: