Python使用moviepy庫實現(xiàn)將視頻轉(zhuǎn)GIF文件
前言
moviepy 是一個用于視頻編輯的 Python 庫,它提供了許多強大的功能,如視頻剪輯、拼接、標題添加、視頻效果應用、音頻處理等。此外,moviepy 還可以將視頻轉(zhuǎn)換為 GIF 文件,這是許多用戶喜歡使用它的一個原因。
pip install moviepy
或者




完整代碼
import os
# 從moviepy.editor模塊中導入了VideoFileClip類,該類用于加載和處理視頻文件。
from moviepy.editor import VideoFileClip
# 加載視頻
# 使用VideoFileClip類的構(gòu)造函數(shù)加載名為movie.mp4的視頻文件,并將其存儲在videoClip變量中。
is_video = input("請輸入您的視頻路徑:")
videoClip = VideoFileClip(f"{is_video}")
# 判斷并打印視頻的原始時長
print(f"您的視頻總時長為: {videoClip.duration} S")
# 調(diào)整幀率和大小,并設置時間范圍
# 調(diào)用subclip方法,從原始視頻中裁剪出從第second1秒到第second2秒的部分。裁剪后的視頻將替換原來的videoClip對象。
second1 = input("開始截取時間:")
second2 = input("結(jié)束截取時間:")
videoClip = videoClip.subclip(second1, second2) # 僅轉(zhuǎn)換視頻second1-second2的內(nèi)容
gif_name = input("請輸入您的GIF名字(或輸入帶后綴的名字如moviepy.gif):")
if not gif_name.lower().endswith('.gif'):
# 檢查后綴
# 如果用戶沒有輸入.gif,則添加.gif
img_name = gif_name + ".gif"
# 允許用戶輸入保存目錄和文件名
save_dir = input("請輸入您想要保存GIF的目錄(例如:C:/Users/YourName/Pictures/):")
# 確保目錄末尾有斜杠(如果不是根目錄的話)
# 使用os.sep來獲取當前操作系統(tǒng)的路徑分隔符,以確保路徑在不同操作系統(tǒng)上都是正確的
# 首先檢查 save_dir 是否不以 os.sep 結(jié)尾,并且確保它不是一個空字符串。
# 如果這兩個條件都滿足,那么它就在 save_dir 的末尾添加一個路徑分隔符。
if not save_dir.endswith(os.sep) and save_dir != "":
save_dir += os.sep
# 檢查目錄是否存在,不存在則創(chuàng)建(exist_ok=True參數(shù)允許目錄已經(jīng)存在而不引發(fā)錯誤)
os.makedirs(save_dir, exist_ok=True)
# 設置GIF的保存路徑,構(gòu)建完整的文件路徑
output_path = os.path.join(save_dir, gif_name)
# 使用resize方法將視頻的尺寸調(diào)整為原來的一半。這里的0.5表示寬度和高度都變?yōu)樵瓉淼?0%。
videoClip = videoClip.resize(0.5)
videoClip.write_gif(output_path, fps=5) # 將幀率設置為 5 FPS輸出:


知識擴展
使用 Python 將視頻轉(zhuǎn)換為 GIF 文件,最常用的庫是 moviepy 或 PIL 配合 imageio。這里提供兩種主流方法:使用 moviepy(最簡單)和使用 imageio(更輕量)。同時給出優(yōu)化 GIF 文件大小的常用技巧。
方法一:使用 moviepy(推薦,功能豐富)
from moviepy.editor import VideoFileClip
# 加載視頻文件
clip = VideoFileClip("input.mp4")
# 1. 截取片段(例如從10秒到20秒)
clip = clip.subclip(10, 20)
# 2. 調(diào)整大?。蛇x,減小文件體積)
clip = clip.resize(width=320) # 按寬度縮放,高度自動
# 3. 輸出為 GIF
clip.write_gif("output.gif", fps=10) # fps 控制幀率,越低文件越小參數(shù)說明:
fps:幀率,原視頻一般 24-30 fps,轉(zhuǎn) GIF 建議 10-15,可大幅減小文件大小。resize:縮小尺寸,例如width=480。subclip(start, end):截取片段,單位秒。program:可指定ffmpeg(默認)或ImageMagick(支持更多顏色優(yōu)化)。
完整優(yōu)化示例:
clip = VideoFileClip("input.mp4").subclip(5, 10)
clip = clip.resize(height=360) # 限制高度
clip.write_gif("output.gif", fps=8, program='ffmpeg', opt='optimize')方法二:使用 imageio + PIL(輕量級,純 Python)
import imageio
from PIL import Image
import numpy as np
# 讀取視頻
reader = imageio.get_reader("input.mp4")
fps = reader.get_meta_data()['fps']
# 準備存儲幀列表
frames = []
# 取前 5 秒,每隔 2 幀取一幀(降低幀率)
for i, frame in enumerate(reader):
if i > fps * 5: # 只取前5秒
break
if i % 2 == 0: # 降采樣,每隔一幀取一幀
# 可選:縮小畫面(PIL)
img = Image.fromarray(frame)
img = img.resize((img.width//2, img.height//2), Image.LANCZOS)
frames.append(np.array(img))
# 保存為 GIF
imageio.mimsave("output.gif", frames, fps=fps//2)這種方法適合不想引入額外依賴(moviepy 依賴 FFmpeg)的場景。
優(yōu)化 GIF 文件大小的小技巧
| 方法 | 說明 |
|---|---|
| 縮短時長 | 只轉(zhuǎn)換最精彩的幾秒,如 subclip(0, 5) |
| 降低幀率 | 從 30fps 降到 10-15 fps,體積明顯減小 |
| 縮小分辨率 | resize(width=480) 或 height=360 |
| 減少顏色數(shù) | moviepy 支持 colors=64,但默認已優(yōu)化 |
| 裁剪畫面 | 使用 clip.crop(x1,y1,x2,y2) 去除無關(guān)區(qū)域 |
安裝依賴
# 方法一需要 pip install moviepy # 方法二需要 pip install imageio pillow
如果 moviepy 轉(zhuǎn)換時報錯 OSError: MoviePy Error: FFMPEG not found,需要安裝 FFmpeg:
- Windows:下載 ffmpeg 并添加到 PATH
- Linux:
sudo apt install ffmpeg - Mac:
brew install ffmpeg
完整腳本:批量轉(zhuǎn)換視頻為 GIF
import os
from moviepy.editor import VideoFileClip
def video_to_gif(input_path, output_path, start=0, duration=5, width=480, fps=10):
clip = VideoFileClip(input_path).subclip(start, start+duration)
clip = clip.resize(width=width)
clip.write_gif(output_path, fps=fps)
clip.close()
# 批量處理文件夾下所有 mp4
input_dir = "videos"
output_dir = "gifs"
os.makedirs(output_dir, exist_ok=True)
for file in os.listdir(input_dir):
if file.endswith(".mp4"):
in_path = os.path.join(input_dir, file)
out_path = os.path.join(output_dir, file.replace(".mp4", ".gif"))
video_to_gif(in_path, out_path, start=0, duration=5)
print(f"已生成: {out_path}")總結(jié)
- 簡單快速:moviepy 一行
write_gif搞定。 - 精細控制:使用 imageio 自己控制幀率和縮放。
- 體積優(yōu)化:務必降低
fps和分辨率。
對于大多數(shù)需求,建議直接用 moviepy,代碼簡潔且功能完善。如果 GIF 文件依然過大,可以進一步降低 fps 到 8 或使用 program='ffmpeg' 參數(shù)(默認已啟用)。
以上就是Python使用moviepy庫實現(xiàn)將視頻轉(zhuǎn)GIF文件的詳細內(nèi)容,更多關(guān)于Python moviepy視頻轉(zhuǎn)GIF的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python multiprocessing多進程原理與應用示例
這篇文章主要介紹了Python multiprocessing多進程原理與應用,結(jié)合實例形式詳細分析了基于multiprocessing包的多進程概念、原理及相關(guān)使用操作技巧,需要的朋友可以參考下2019-02-02
Pytorch上下采樣函數(shù)--interpolate用法
這篇文章主要介紹了Pytorch上下采樣函數(shù)--interpolate用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Tensorflow 實現(xiàn)分批量讀取數(shù)據(jù)
今天小編就為大家分享一篇Tensorflow 實現(xiàn)分批量讀取數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
深入理解Python中pywin32庫實現(xiàn)Windows自動化與系統(tǒng)交互
pywin32是一個讓?Python?能夠直接調(diào)用?Windows?API?和?COM?對象的擴展庫,本文將帶大家從入門到精通,系統(tǒng)性地理解?pywin32?的核心功能、內(nèi)部機制、典型應用場景和高級用法2025-10-10
基于wxPython和DeepSeek API開發(fā)的智能批處理文件生成器
在日常的系統(tǒng)運維和自動化任務處理中,批處理文件(.bat)一直是Windows環(huán)境下不可或缺的工具,然而,編寫批處理腳本對于非技術(shù)人員來說存在一定門檻,本文給大家介紹了如何基于wxPython和DeepSeek API開發(fā)的智能批處理文件生成器,需要的朋友可以參考下2026-01-01
python之生成多層json結(jié)構(gòu)的實現(xiàn)
今天小編就為大家分享一篇python之生成多層json結(jié)構(gòu)的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
基于Mediapipe+Opencv實現(xiàn)手勢檢測功能
mediaPipe,他就是一個集成好的包括人臉關(guān)鍵位點識別、身體關(guān)鍵位點識別、手部關(guān)鍵位點識別的一個包或者庫,直接調(diào)用就能夠得到它的關(guān)鍵位點信息,本文給大家介紹Mediapipe+Opencv實現(xiàn)手勢檢測功能,感興趣的朋友一起看看吧2022-01-01
Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解
今天小編就為大家分享一篇關(guān)于Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02

