基于python的MP4转GIF小工具


一、使用方法

  1. mp4文件夹下放待转换的MP4,转换后生成同名的GIF文件在gif文件夹下
  2. 其他详细参数见代码
  3. 目录结构如下
根目录
  |-----gif				# 生成的gif保存位置
  |		 |
  |	     |-----1.gif	# 生成的gif文件与MP4文件同名
  |      |-----2.gif
  |      |-----...
  |
  |-----mp4				# 待转换的MP4
  |      |
  |      |-----1.mp4	# MP4文件名随便
  |      |-----2.mp4
  |      |-----...
  |
  |-----start.py		# 执行脚本

二、实现

from moviepy.editor import *


class Mp42GifOp(object):
    def __init__(self,
                 resize=None,       # 修改尺寸,接收元组或者0-1之间的值,比如 (300, 200) 的意思是尺寸转为宽300高200,0.5 的意思是尺寸缩放到一半
                 fps=None,          # 抽帧,接收整数,比如 20 的意思就是将mp4生成每秒 20 帧的gif
                 clip=None          # 视频裁剪,接收元组,比如 (3, 10) 的意思是裁剪 3-10 秒之间的视频生成gif
                 ):
        self.resize = resize
        self.fps = fps
        self.clip = clip


    def mp42gif(self, mp4path, gifpath):

        vfc = VideoFileClip(mp4path)

        if self.clip:
            vfc = vfc.subclip(*self.clip)

        if self.resize:
            vfc = vfc.resize(self.resize)

        clip = (vfc)

        if self.fps:
            clip.write_gif(gifpath, fps=self.fps)
        else:
            clip.write_gif(gifpath)

        print("{} to {} complete!".format(mp4path, gifpath))


if __name__ == '__main__':

    # 一些生成参数,根据实际情况调整 -------
    resize = None
    fps = 9
    clip = None
    # ---------------------------------

    # mp4放这个文件夹下
    mp4_dir = './mp4'
    # gif生成在这个文件夹下
    gif_dir = './gif'

    # 初始化
    m2g = Mp42GifOp(resize, fps, clip)

    # 获取全部MP4路径
    mp4_path_list = [os.path.join(mp4_dir, file) for file in os.listdir(mp4_dir)]

    # 批量转换
    for idx, mp4_path in enumerate(mp4_path_list):

        print("---- 当前进度:{} / {},当前转换文件:{} ----".format(idx+1, len(mp4_path_list), mp4_path))

        # 生成gif路径
        gifname = mp4_path.replace('\\', '/').rsplit('/', 1)[1].rsplit('.', 1)[0]
        gif_path = os.path.join(gif_dir, '{}.{}'.format(gifname, 'gif'))

        # 转换
        m2g.mp42gif(mp4_path, gif_path)



版权声明:本文为weixin_43721000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。