• 基于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		# 执行脚本
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二、实现

    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)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
  • 相关阅读:
    【云原生】docker环境中安装mysql、redis服务
    Linux内网渗透
    网页翻译软件-网页自动采集翻译软件免费
    4520. 质数
    YOLO先验框的设计理解
    施密特正交化
    新知实验室TRTC初体验
    C++对象内存布局
    IntelliJ IDEA 2022.2发布首个Beta版本,看看有哪些更新
    LeetCode 2343. 裁剪数字后查询第 K 小的数字 暴力+语法考察
  • 原文地址:https://blog.csdn.net/weixin_43721000/article/details/126361108