网站首页 > 基础教程 正文
mp4转gif的原理其实很简单,就是将mp4文件的帧读出来,然后合并成一张gif图。用cv2和PIL这两个库就可以轻松搞定 。
import glob
import cv2
from PIL import Image
def convert_mp4_to_jpgs(input_file):
# 先将mp4文件的所有帧读取出保存为图片
video_capture = cv2.VideoCapture(input_file)
still_reading, image = video_capture.read()
frame_count = 0
while still_reading:
cv2.imwrite(f"output/frame_{frame_count:03d}.jpg", image)
# read next image
still_reading, image = video_capture.read()
frame_count += 1
def convert_images_to_gif(output_file):
# 读取目录下图片,用Pillow模块的Image和所有图片合并
# 成一张gif
images = glob.glob(f"output/*.jpg")
images.sort()
frames = [Image.open(image) for image in images]
frame_one = frames[0]
frame_one.save(output_file, format="GIF", append_images=frames[1:],
save_all=True, duration=40, loop=0)
def convert_mp4_to_gif(input_file, output_file):
convert_mp4_to_jpgs(input_file)
convert_images_to_gif(output_file)
if __name__ == "__main__":
convert_mp4_to_gif("demo.mp4", "output.gif")
执行完成后,发现gif文件大小暴增:
可以尝试通过减少帧的数量来优化gif的大小,比如这个视频一共有60帧,我们只取30帧,大小就会减半;
frame_one.save(output_file, format="GIF", append_images=[f for i, f in enumerate(frames[1:]) if i % 2 == 0],
save_all=True, duration=40, loop=0)
实现逻辑是用enumerate函数过滤取偶数张图片来合成,最小大小从3.9M压缩到2M。
写完这个代码后,发现还有另一个牛逼的库moviepy,2行代码就可以搞定;
def mp4_to_gif2():
clip = VideoFileClip("demo.mp4")
clip.write_gif("output2.gif")
moviepy把实现细节已经封装非常简约了,然后提供了一大堆参数可以让开发者自行配置。但使用moviepy转的文件有9M,我相信可以用参数来优化调整。
Python生态就是库多,各种各样的轮子都有,没有做不到的,只有你找不到的。
也可以将gif转回成MP4格式,比如看到一些搞笑的gif将它转换成mp4,非常简单就可以实现
def convert_gif_to_mp4():
import moviepy.editor as mp
clip = mp.VideoFileClip("demo.gif")
clip.write_videofile("output.mp4")
原文:
https://developer.51cto.com/article/703676.html
猜你喜欢
- 2025-03-10 go语言text/template标准库
- 2025-03-10 Python 的os和shutil包简介
- 2025-03-10 前端代码质量-圈复杂度原理和实践
- 2025-03-10 近2万字详解JAVA NIO2文件操作,过瘾
- 2025-03-10 Python技巧之实现智能文件整理,轻松分类图片、文档、视频等
- 2025-03-10 Python之Pandas使用系列(八):读写Excel文件的各种技巧
- 2025-03-10 Python 实现 批量 复制指定PDF文件 到指定文件夹并批量打印出来
- 2025-03-10 深入理解 Linux 位置无关代码 PIC
- 2025-03-10 什么是微调?如何用微调模型完成图像分类?
- 2025-03-10 为机器学习模型设置最佳阈值:0.5是二元分类的最佳阈值吗
- 03-10extern "C"用法详解
- 03-10嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 03-10C++知识点 13:extern“C”
- 03-10go语言text/template标准库
- 03-10Python 的os和shutil包简介
- 03-10前端代码质量-圈复杂度原理和实践
- 03-10近2万字详解JAVA NIO2文件操作,过瘾
- 03-10这两个Python库,轻而易举就能实现MP4与GIF格式互转,太好用了
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)