怎么用Python处理MP4与GIF格式互转

这篇文章主要介绍“怎么用Python处理MP4与GIF格式互转”,在日常操作中,相信很多人在怎么用Python处理MP4与GIF格式互转问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python处理MP4与GIF格式互转”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

mp4转gif的原理其实很简单,就是将mp4文件的帧读出来,然后合并成一张gif图。用cv2和PIL这两个库就可以轻松搞定。

importglob

importcv2
fromPILimportImage


defconvert_mp4_to_jpgs(input_file):
#先将mp4文件的所有帧读取出保存为图片
video_capture=cv2.VideoCapture(input_file)
still_reading,image=video_capture.read()
frame_count=0
whilestill_reading:
cv2.imwrite(f"output/frame_{
frame_count:03d}
    .jpg",image)
#readnextimage
still_reading,image=video_capture.read()
frame_count+=1


defconvert_images_to_gif(output_file):
#读取目录下图片,用Pillow模块的Image和所有图片合并
#成一张gif
images=glob.glob(f"output/*.jpg")
images.sort()
frames=[Image.open(image)forimageinimages]
frame_one=frames[0]
frame_one.save(output_file,format="GIF",append_images=frames[1:],
save_all=True,duration=40,loop=0)


defconvert_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=[ffori,finenumerate(frames[1:])ifi%2==0],
save_all=True,duration=40,loop=0)

实现逻辑是用enumerate函数过滤取偶数张图片来合成,最小大小从3.9M压缩到2M。

写完这个代码后,发现还有另一个牛逼的库moviepy,2行代码就可以搞定;

defmp4_to_gif2():
clip=VideoFileClip("demo.mp4")
clip.write_gif("output2.gif")

moviepy把实现细节已经封装非常简约了,然后提供了一大堆参数可以让开发者自行配置。但使用moviepy转的文件有9M,我相信可以用参数来优化调整。

你不得不承认Python生态就是库多,各种各样的轮子都有,没有做不到的,只有你找不到的。

当然,你也可以将gif转回成MP4格式,比如你看到一些搞笑的gif将它转换成mp4放到短视频平台,说不定就火了。

defconvert_gif_to_mp4():
importmoviepy.editorasmp
clip=mp.VideoFileClip("demo.gif")
clip.write_videofile("output.mp4")

到此,关于“怎么用Python处理MP4与GIF格式互转”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!