OpenCV(Python)将MP4转为内存更小的GIF

194 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

MP4转为GIF并不复杂,有很多在线工具和软件都可以实现,但这些工具将MP4转为GIF后,GIF会变得很大。如5M的MP4视频转为GIF可能变成15M,为了获得较小的GIF,不妨考虑使用opencv实现。通过设置GIF帧率和改变视频分辨率可以大大压缩视频大小。代码如下:

import cv2
import moviepy.editor as med


video_name = "vedio.mp4"
video = cv2.VideoCapture('vedio.mp4')    # 读取视频

# 获取视频相关参数,便于裁剪
fps = video.get(5)    # 读取视频帧率
frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))   # 读取视频帧数
width = video.get(3)    # 读取视频宽度
high = video.get(4)     # 读取视频高度
print("帧率:",fps)
print("帧数:",frames)
print("宽度:",width)
print("高度:",high)

clip = med.VideoFileClip(video_name)
clip = clip.set_duration(clip.duration)    # 设置视频持续时间

# 裁剪视频,若想到自定义裁剪画面,可将视频转为多帧图片进行裁剪
#c1 = clip.subclip()   # 读取全部视频,且不改变分辨率
# c1 = clip.subclip().resize((1000, 500))     # 读取全部视频,并改变分辨率
c1 = clip.subclip((0, 0), (0, 4)).resize((300, 100))    # 只读取0分0秒到0分2秒的视频内容

c1.write_gif("vedio.gif", fps=6)    # 转为gif,并设置gif的帧率

cap = cv2.VideoCapture('vedio.gif')    # 读取gif
while cap.isOpened():
    ret, frame = cap.read()    # frame表示每一帧图片
    if ret == True:    # ret为bool类型,表示是否读取到图片
        cv2.imshow('frame', frame)     # 通过连续imshow每一帧图片预览gif效果
        cv2.waitKey(50)    # 每帧图片展示50ms
    else:
        break

# 销毁窗口,释放内存
cap.release()
cv2.destroyAllWindows()