天天看點

Python實作視訊轉 gif 動圖

Python實作視訊轉 gif 動圖

1. 準備工作

需要準備用于生成 ​

​gif​

​的 視訊檔案 ,另外,就是需要用到 ​

​moviepy​

​庫,關于這個庫更詳細的介紹可以檢視它的官方文檔。

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

指令行鍵入pip安裝吧

pip install moviepy      

這就搞定第1步了!

上面就完成了實作這個功能的子產品了

想要實作

Python實作視訊轉 gif 動圖

動态效果

Python實作視訊轉 gif 動圖

上面gif動圖是通過下面代碼實作的python

from moviepy.editor import *

clip = (VideoFileClip("video(4).mp4").resize((488,225)))
clip.write_gif("movie.gif",fps=15)  #設定為每秒15幀      

制作動圖的制作腳本。

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​

​。

Python實作視訊轉 gif 動圖

視訊屬性

本次轉動圖的參數設定如下:

  • ​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​

​張圖構成!

Python實作視訊轉 gif 動圖

3. 截取區域轉動圖

有時候我們可能隻需要截取螢幕中指定矩形區域來進行動圖的制作,這就要用到 ​

​crop​

​函數截圖區域了。

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

參數:

​x1​

​​、​

​y1​

​:矩形區域左上角坐标

​x2​

​​、​

​y2​

​:矩形區域右下角坐标

​width​

​​、​

​height​

​:是寬度和高度

​x_center​

​​、​

​y_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)      

裁剪

video.resize(0.2).preview()      
  1. 固定區域轉動圖
  2. 對于上面那個動圖中 的搞定了,我們希望它常駐,那麼可以通過截圖搞定了出現這一時刻的内容,然後覆寫到原來位置常駐即可。
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)