上次写文章的时候,遇到了一个问题。公众号插入视频文件太麻烦了。小视频上传为视频需要平台审核。播放时没有gif。直接的。于是就想着找个mp4转gif的工具。上网搜了一下,网上的工具很多,但是套路五花八门,有的以广告为主,有的需要先扫二维码。还是用国外的网站好,没有那么多套路。我认为Python绝对可以处理这种问题。毕竟,万能的蟒蛇什么都能做,就是不生孩子。这样我以后就把它做成一个在线工具,方便自己,也可以顺便给别人用。mp4转gif的原理其实很简单,就是把mp4文件的帧读出来,然后合并成gif图片。用cv2和PIL这两个库就可以轻松搞定。importglobimportcv2fromPILimportImagedefconvert_mp4_to_jpgs(input_file):#首先读取mp4文件的所有帧并保存为图片video_capture=cv2.VideoCapture(input_file)still_reading,image=video_capture.read()frame_count=0whilestill_reading:cv2.imwrite(f"output/frame_{frame_count:03d}.jpg",image)#读取下一张图片still_reading,image=video_capture.read()frame_count+=1defconvert_images_to_gif(output_file):#读取目录下的图片,使用Pillow模块图像和所有图片合并为一个gifimages=glob.glob(f"output/*.jpg")images.sort()frames=[Image.open(image)forimageinimages]frame_one=frames[0]frame_one“__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")剪辑。write_gif("output2.gif")moviepy对实现细节进行了非常简单的封装,提供了很多参数供开发者自行配置。但是moviepy转换出来的文件是9M,相信可以通过参数优化调整。你不得不承认,Python的生态是Kudo,各种轮子都有。没有做不到的,只有找不到。当然,您也可以将gif转换回MP4格式。比如你看到一些搞笑的动图,转成mp4放到?平台上,说不定就会流行起来。defconvert_gif_to_mp4():importmoviepy.editorasmpclip=mp.VideoFileClip("demo.gif")clip.write_videofile("output.mp4")最后,稍微懂点操作的,把它做成工具,挂了它在网络上,又是一个吸粉神器,美不美。
