Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

2023-11-17

☞ ░ 前往老猿Python博文目录

一、引言

老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完GIF后都会在动画中打上对应工具的显著广告或Logo,根本没法将转换后的动画发布。如是想到了万能的Python,就找到了moviepy,没费多少时间就搞定了,因此萌发了学习和研究Moviepy的兴趣。本文利用前面介绍的知识来开发一个windows下图形化的视频转GIF或图片的工具。

二、背景知识介绍

1、视频转gif或图片会用到《moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解》、《moviepy音视频剪辑:视频剪辑基类VideoClip详解》介绍的write_images_sequence和write_gif方法,具体内容在此就不赘述了;
2、图形化工具开发会用到专栏《使用PyQt开发图形界面Python应用》或《PyQt入门知识》的知识;
3、打包生成exe会用到《PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件》介绍的方法进行打包;
4、程序的框架与《PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件》、《PyQt+moviepy音视频剪辑实战2:实现一个剪裁视频文件精华内容留存工具》或《PyQt+moviepy音视频剪辑实战1:多个音视频合成顺序播放或同屏播放的视频文件实现详解》、《PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现》相同。

三、图形界面设计

本程序的界面框架除了主界面之外的部分都是复用《PyQt+moviepy音视频剪辑实战1:多个音视频合成顺序播放或同屏播放的视频文件实现详解》、《PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件》的公用框架。

主界面如下:
在这里插入图片描述

四、代码实现

4.1、主界面类及构造方法

class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.initValues()

        self.initSignalAndSlots()
        self.initPublicFrame()

4.2、槽和信号连接方法initSignalAndSlots

      def initSignalAndSlots(self):
        self.btn_choiceSrc.clicked.connect(self.chooseFile)

        self.videoFile.textChanged['QString'].connect(self.fileNameInputed)
        self.btn_choiceDest.clicked.connect(self.chooseFile)
        self.action2Gif.triggered.connect(self.convert)
        self.action2Img.triggered.connect(self.convert)

4.3、视频转换方法

    def convertByMoviepy(self,srcFile,destFile,toGif):
        destFileName,destFileType = destFile.rsplit('.',1)

        if toGif:
            destFileType = '.gif'
        else:
            destFileType = '.jpg'
        destFile = destFileName+destFileType

        print("convertUseMoviepy start:",srcFile,'-->',destFile)
        try:
            start = int(self.startPos.text().strip(' \r\n\t'))
            end = int(self.endPos.text().strip(' \r\n\t'))
            vfps = int(self.fps.text())
        except Exception as e:
            print("输入了非法的数字字符,不能转换:",e)
            return
        try:
            if  end:
                if start>end:
                    print("指定视频开始位置大于结束位置,不能转换")
                    return
                cache = mpe.VideoFileClip(srcFile).subclip(start, end)
            else:cache = mpe.VideoFileClip(srcFile)

        except Exception as e:
            info = f"视频文件无法读取,可能是因为格式不支持:{e}"
            print(info)
            print("任务无法执行!")
            return


        if vfps<1 or vfps>30:vfps = 2
        if not toGif:
            imgCount = len(str(vfps*(end-start+1)))+1
            format = f"_%0{imgCount}d"
            destFileFormat = destFileName +format+ destFileType
            fileFormat =  '_'+'X'*imgCount
            destFileFormatName = destFileName +fileFormat+ destFileType


        try:
             if toGif:
                 cache.write_gif(destFile,fps=vfps)
             else:
                 cache.write_images_sequence(destFileFormat,vfps)

        except Exception as e:
            if toGif:
                print(f"视频{srcFile}转换gif失败:", e)
            else:
                print(f"视频{srcFile}转换图片失败:", e)
        else:
            if toGif:
                print(f"视频{srcFile}转换gif成功,结果保存在{destFile}中")
            else:
                print(f"视频{srcFile}转换图片成功,结果保存在{destFileFormatName}中")
        cache.close()

五、运行界面

5.1、初始主界面

在这里插入图片描述

5.2、进行视频转换的运行过程界面

在这里插入图片描述

这是从F:\video\zbl1.mp4视频转成一系列图片输出,每秒取一帧图片保存,每个图片的名字是输出文件名加序号再加后缀的形式,如zbl1_09.jpg,第一张序号为0,即zbl1_00.jpg,序号的长度根据生成图片的视频需要生成的文件数来决定,超过100个就是3位、超过1000个就是4位…。

六、打包成windows执行文件

使用《PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件》介绍的方法进行打包。

老猿的工程包含了两个公共框架目录,因此打包使用如下命令:

pyinstaller video2Gif.py  -w  -p F:\coffeDog\loadApp2 -p F:\coffeDog\captureStdout2>log.txt

注意:moviepy的包必须使用《关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭》修改了的文件,否则打包执行会报错。

在win7、win10上可运行的可执行程序包已经上传到百度云,大家可以下载下来长期免费使用。具体下载地址为百度网盘。

链接:https://pan.baidu.com/s/1UNaA2UqQBoxx-v8rCIPDhA

提取码:yh2d

选择该链接下的:视频转图片和动画工具V2.0.rar 即可,下载后解压到指定目录后,选择exe文件直接执行即可。不过使用该工具会自动打开老猿的博客请大家点赞,敬请大家支持,谢谢。

注意:

百度云上分享的《咖啡狗免费工具软件共享空间》下的不同软件安装时必须解压到不同目录,如果解压到同一目录可能有冲突导致不能正常运行,
但解压后遵循如下要求可以将其聚合到同一个目录:

  1. 放置到同一目录的不同软件的版本必须相同,版本为压缩文件名中VX.X标注;
  2. 聚合拷贝时除拷贝执行文件外,还有resource目录必须拷贝,如果resource目录下有相同文件名可以覆盖;
  3. 聚合拷贝exe文件和resource目录及其下文件到其他已解压工具目录后,源目录可以删除。

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

收费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》,本文收费专栏对应文章为《Moviepy音视频开发:开发视频转gif动画或jpg图片exe图形化工具的案例》。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学Moviepy!

☞ ░ 前往老猿Python博文目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例 的相关文章

随机推荐

  • Java坑人面试题系列: 变量声明(中级难度)

    作用域规则与变量覆盖面试题 Java Magazine上面有一个专门坑人的面试题系列 https blogs oracle com javamagazine quiz 2 这些问题的设计宗旨 主要是测试面试者对Java语言的了解程度 而不是
  • 华为OD -单词接龙(Python)

    单词接龙 题目描述 单词接龙的规则是 可用于接龙的单词 首字母必须要与前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等 则取字典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成
  • vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目)

    目录 1 需求 2 想要的效果就是由图一变成图二 编辑 3 组件集成了以下功能 4 参数配置 示例代码 参数说明 5 组件 6 页面使用 1 需求 一般后台管理系统 通常页面都有增删改查 而查不外乎就是渲染新增 修改的数据 由输入框变成输入
  • Oracle 数据库查看锁表的语句和解锁的方法

    一 查看锁表语句 SELECT sess sid sess serial lo oracle username 登陆账号名称 lo os user name 登录电脑名称 ao object name 被锁表名 lo locked mode
  • 【Vulnhub】之symfonos1

    一 部署方法 在官网上下载靶机ova环境 https download vulnhub com symfonos symfonos1 7z 使用VMware搭建靶机环境 攻击机使用VMware上搭建的kali 靶机和攻击机之间使用NAT模式
  • oracle impdp无法打开日志文件,oracle expdp导入时 提示“ORA-39002: 操作无效 ORA-39070: 无法打开日志文件 ”...

    oracle impdp导入时 提示 OpenCurlyDoubleQuote ORA 39002 colon 操作无效 ORA 39070 colon 无法打开日志文件 第一步 首先使用DBA权限的用户创建directory 我使用sys
  • ‘git‘不是内部或外部命令,也不是可运行的程序或批处理文件。

    一 出现问题 git 不是内部或外部命令 也不是可运行的程序或批处理文件 出现这个问题主要是git的环境变量没有设置 二 解决问题 首先右键我的电脑点击属性 在点击高级系统设置 点击环境变量 在下面这栏点击path设置环境变量 添加这三个环
  • 【人工智能】感知器算法的设计实现(QDU)

    人工智能 Astar算法求解8数码问题 QDU 人工智能 利用 搜索的博弈树算法编写一字棋游戏 QDU 人工智能 Fisher 线性分类器的设计与实现 QDU 人工智能 感知器算法的设计实现 QDU 人工智能 SVM 分类器的设计与应用 Q
  • Hive的数据类型

    Hive支持的数据类型如下 原生类型 TINYINT SMALLINT INT BIGINT BOOLEAN FLOAT DOUBLE STRING BINARY Hive 0 8 0以上才可用 TIMESTAMP Hive 0 8 0以上
  • 04-SpringBoot集成Nebula Graph

    SpringBoot集成Nebula 建议模块 在这里给大家推荐一种方式 每引入一种新的技术 建议新建一个模块 来适配这种技术 对外提供接口 在调用的地方应用就可以 不用搞的到处都是 防止如果后续替换这种技术 还要到处修改 这样的话 只需要
  • 工业大数据漫谈14:煤矿与非煤矿矿山如何应用大数据

    在工业领域 煤矿与非煤矿山属于相对特殊的行业 不是我们传统意义上的工厂模式 而是一种资源开采模式 矿山行业因为其生产的特殊性 因此在工业大数据的应用上 也呈现出了与制造型工业完全不同的特点 与制造型工业相比较 矿山行业最大的区别在于产品质量
  • JTest简单试用

    安装JTest 拷贝破解文件lic client jar到 Parasoft Test 9 4 plugins com parasoft xtest libs 9 4 0 20120412 Parasoft 创建附带案例 例如JPetSto
  • SpringBoot项目在IDEA制作Docker镜像并部署到阿里服务器运行

    SpringBoot项目如何在IDEA制作Docker镜像并部署到阿里服务器运行 首先IDEA安装Docker插件 没错就是它 这家伙挺好用的 安装后你会看到 这里就是配置你阿里云服务器地址的 服务器开放docker的2375端口还需要改配
  • Visual Studio error C2001:常量中有换行符

    问题描述 问题分析 经百度多方求助 发现该问题主要是由中文和文件编码格式引起的 存在中文时需要手动文件编码格式转换成UTF 8 这里使用Notepad 去转换 但是很奇怪的是我发现我的文件就是UTF 8的格式 仍然编译不过 我查询了其他没有
  • idea插件生成用例图、时序图、类图、活动图

    给大家推荐一个idea生成用例图 时序图等的神器 PlantUML 最近软件工程要结课了 结课报告要附加用例图 时序图 类图 活动图等 类图我首先就想到可以用idea生成 嘿嘿 可惜忘了怎么用 搜着搜着 突然发现 idea生成时序图 用例图
  • dfs、bfs时候染色算法和直接传一个visited两种方法

    以695 岛屿的最大面积为例 在图的遍历中 如果不加任何约束 DFS和BFS一定会遍历到重复节点 解决这个问题的一个方法就是在函数外定义一个visited set 然后每次遍历的时候把未在visited中的节点加入 在外面的递归终止条件 队
  • eclipse 项目没错却有红叉(解决办法)

    1 进入 eclipse 选择报错的项目 然后在工具栏选择Window 选择Show View 选择Problems 如下图 2 找到 General 下的 problems 双击 problems 就会在下面提示你项目报错的原因 根据错误
  • Go_异常处理

    Error 异常就是程序出现了不正常的情况 会导致程序非正常停止 而异常处理就是针对非正常停止的情况 给出异常时的处理方式 语法错误不算异常体系中 error是一个接口 作用是返回程序异常的信息 errors实现了error type er
  • QT踩坑第十一天(QT多线程)

    前言 QT在什么时候会用到多线程 所有的IO操作都要放到线程里面 1 IO操作QIODevice文件IO网络IO 套接字eg CAN Linux下也是套接字 串口等外设 因为他们不确定什么时候可以读完 2 耗时的算法eg 文件压缩 信号处理
  • Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    前往老猿Python博文目录 一 引言 老猿之所以学习和研究Moviepy的使用 是因为需要一个将视频转成动画的工具 当时在网上到处搜索查找免费使用工具 结果找了很多自称免费的工具 但转完GIF后都会在动画中打上对应工具的显著广告或Logo