1.准备好mp4文件和我们提供的python脚本:
2.打开python文件,查看修改源码:
3.找到定义视频路径的代码,并将路径修改为你自己的视频路径:
4.找到定义截取mp4帧的时间区间代码,并且修改为你的视频自定义的时间区间(如下表示截取开始时间是1秒,截取结束时间是60秒):
5.找到定义gif尺寸的代码,并且自定义修改尺寸的值(左边的值是宽度,右边的值是高度):
6.找到定义gif文件存储路径的代码,并修改为你自定义的路径和名字:
7.配置好自己的参数后,点击运行python文件稍等片刻即可生成gif文件(注意:当文件时长太长时,或者gif生成太大时,将导致程序崩溃,应合理设置时间区间和设置图片尺寸):
python3 mp4_to_gif.py
8.python文件运行效果:
import cv2
import io
from PIL import Image, ImageOps
# 打开视频文件
cap = cv2.VideoCapture('./bad_apple.mp4')
# 获取总帧数和帧率
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
# 定义需要截取的时间区间(单位为秒)
start_time = 1
end_time = 60
# 计算对应的帧数区间
start_frame = int(start_time * fps)
end_frame = int(end_time * fps)
# 移动到起始帧
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
# 声明内存缓冲区
buffer = bytearray()
images = []
# 从起始帧开始遍历帧数区间内的每一帧
for i in range(start_frame, end_frame):
# 读取下一帧
ret, frame = cap.read()
# 如果帧读取失败,退出循环
if not ret:
break
# 将帧编码为 JPEG 格式的图像数据,并存储到内存缓冲区中
_, enc_frame = cv2.imencode(".jpg", frame)
buffer.extend(enc_frame)
images.append(Image.open(io.BytesIO(buffer)))
# 清空缓冲区
buffer = bytearray()
# 释放视频文件句柄。
cap.release()
cv2.destroyAllWindows()
# 对图片进行变换并保存为 GIF 文件
new_frames = []
for frame in images:
frame = ImageOps.fit(frame, (256, 128), method=Image.ANTIALIAS)
new_frames.append(frame)
new_frames[0].save('movie_new.gif', save_all=True, append_images=new_frames[1:], duration=5, loop=0)