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




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


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

