本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
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()