python MP4视频转GIF动图

news2024/11/24 18:45:57

python MP4视频转GIF动图

  • 引言
  • 一、转换代码
  • 二、PyQt界面编写
    • 2.1 效果展示
    • 2.2 源码
  • 三、打包成可执行文件(.exe)

一个相当于原视频三倍速的GIF动图
一个相当于原视频三倍速的GIF动图

引言

将MP4格式的视频转为GIF动图可以方便地向他人展示动画效果。GIF是网络上广泛使用的图像格式之一,几乎所有的网页浏览器和客户端都支持,其兼容性较好。比如可以直接插入到PPT中、或是在微信上发给别人、或者直接插入到CSDN博客中,但是MP4等视频格式的文件显然不行。

  • 常用的免费在线转换网站上不去了,好多其它网站需要注册,本作者亲自写一个方便日常使用。

当然,GIF也有其缺点,将MP4视频同帧率转为GIF,文件会变大,占用更多内存:

文心一言给出的理由:将MP4视频转换为GIF后,文件变大主要是因为GIF格式的编码方式和MP4不同。MP4文件内一般采用视频压缩的格式,例如h264,这种压缩方式利用时间上相邻两帧的相似性和人眼视觉上的冗余来做有损压缩,从而压缩率很高。而GIF格式则单独保留了每一帧图片,同时每张图片都是采用无损压缩的方式,因此GIF尺寸比较大。

一、转换代码

使用moviepy库,安装: pip install moviepy

英文文档:https://zulko.github.io/moviepy/ 推荐,方便Search
中文文档:http://doc.moviepy.com.cn/

from moviepy.editor import *
myClip = VideoFileClip("xxx.mp4")
myClip.write_gif("xxx.gif")

write_gif默认与原视频时常一样(只能更改帧速率,默认帧率也与原视频一样),如果想更改播放速度可使用speedx函数,如:

  • 放慢一半:
myClip.speedx(0.5).write_gif("xxx.gif")
  • 二倍速播放
myClip.speedx(2).write_gif("xxx.gif")
  • write_gif参数官方解释:write_gif(self, filename, fps=None, program=‘imageio’, opt=‘nq’, fuzz=1, verbose=True, loop=0, dispose=False, colors=None, tempfiles=False, logger=‘bar’)
  • write_gif参数解释:moviepy音视频剪辑基类VideoClip的write_gif方法opt、fuzz、dispose、colors、loop等参数的作用
  • 转换代码也可参考: 使用Opencv将MP4文件转GIF图片

二、PyQt界面编写

2.1 效果展示

在这里插入图片描述
使用gif展示了一个将mp4转为gif动图的软件

2.2 源码

使用pyqt5-tool生成的ui界面,转成py后增加了mp4_to_gif函数,可直接运行

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


def mp4_to_gif():
    dialog = QFileDialog()
    dialog.setFileMode(QFileDialog.ExistingFile)
    dialog.setAcceptMode(QFileDialog.AcceptOpen)
    filename, _ = dialog.getOpenFileName(dialog, "Open file", "", "files (*.mp4);;(*.*)")
    print(filename.replace('.mp4', '.gif'))

    from moviepy.editor import VideoFileClip
    myClip = VideoFileClip(filename)
    myClip.speedx(3).write_gif(filename.replace('.mp4', '.gif'))
    pass


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(321, 71)
        MainWindow.setMaximumSize(QtCore.QSize(321, 71))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(0, 0, 321, 71))
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(24)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MP4_to_GIF"))
        self.pushButton.setText(_translate("MainWindow", "将MP4转为GIF"))

        # 按钮事件
        self.pushButton.clicked.connect(mp4_to_gif)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

  • 还有个小bug,filename为空,程序会奔溃

三、打包成可执行文件(.exe)

安装pyinstaller:pip install pyinstaller

  • 执行 pyinstaller -F -w main.py
    在这里插入图片描述
  • 打包生成100MB的exe文件… 结果如下:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

反爬指南:《孤注一掷》诈骗分子窃取用户信息的工具令人吃惊

目录 什么是网络爬虫 爬虫的非法盗取与平台反爬 全流程反爬方案 AI时代的验证码 《孤注一掷》 最近在火热上映中。影片讲述了程序员潘生在境外网络诈骗团队的高薪诱惑下被拐骗到境外“公司”,并在陆秉坤和安俊才的强迫下从事诈骗活动,最终在帮助同被…

You may use special comments to disable some warnings

You may use special comments to disable some warnings 方法1: 找到build目录下的webpack.base.conf.js文件,注释掉 方法2: 找到config目录下的index.js文件,useEslint:false

javabean项目专项练习(1) 文字格斗游戏

main中是这样写的 如下是character类的描述 总结一下(个人) : 这是一题面向对象的编程, 个人编程后感是: 核心就是在于自己会不会取定义一个类, 如果是多个对象(同一个类),能不能捋顺类的方法的关系,个人觉得黑马程序员up主给出来的分析方法特别好用. 步骤: 先把在类里该该…

Python灰帽子编程————网页信息爬取

爬取图片,问题分解: 获取网页内容;从网页内容中提取图片地址;通过图片地址,将图片下载到本地。 1. 相关模块 1.1 requests 模块 获取网页内容。 requests 模块:主要是用来模拟浏览器行为,发…

专业软件测评中心:关于软件性能测试的实用建议

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。 一、软件性能测试的实用建议   1、制定清晰的测试目标:明确测试目标…

数据结构与算法——14.栈

目录 1.概述 2.栈的接口设计 3.用链表来实现栈 4.用数组来实现栈 5.用两个栈来实现一个队列 6.用一个队列来实现一个栈 7.总结 1.概述 计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之…

主打低功耗物联网国产替代,纵行科技ZT1826芯片以速率和灵敏度出圈

在低功耗物联网领域,国产替代的趋势越演越烈。 9月20日,纵行科技在“IOTE 2023深圳物联网通信技术与应用高峰论坛”发表了“自主原创Advanced M-FSK调制技术助力国产替代和泛在物联”的演讲,并推出了ZT1826芯片,以“更低功耗、更…

【lesson8】操作系统的理解和类比

文章目录 操作系统是什么?为什么要有操作系统?怎么做?学校的例子(理解管理)银行的例子(类比操作系统) 操作系统是什么? 操作系统是一款软件,是为了进行软硬件资源管理的…

CentOS下Redis6.x安装教程

Redis安装教程 文章目录 Redis安装教程一、安装包下载地址二、安装2.1上传服务器解压2.2安装编译所需依赖2.3编译安装 三、启动与停止3.1守护进程启动3.2开机自启动 一、安装包下载地址 https://redis.io/download/ 目前最新的版本是7.0以上的版本,本次使用redis6…

python3+selenium自动化测试介绍详解!

自动化测试是什么? 自动化测试简单来说就是借助工具的方式来辅助手动测试的行为就可以看做是自动化测试。 自动化测试工具有哪些? 现在常用的自动化测试工具包括: QTP:主要用于回归测试和测试同一软件的新版本Robot Framework…

vue2 provide/inject watch 监控inject中值变化

在Vue 2.x中,使用inject注入的值默认情况下是不能被watch直接监控到的,因为inject提供的值不是响应式的。这是Vue 2.x的设计,与Vue 3.x中的provide和inject不同,Vue 3.x中的inject提供的值是响应式的,可以直接被watch监…

【Java 基础篇】Java同步代码块解决数据安全

多线程编程是现代应用程序开发中的常见需求,它可以提高程序的性能和响应能力。然而,多线程编程也带来了一个严重的问题:数据安全。在多线程环境下,多个线程同时访问和修改共享的数据可能导致数据不一致或损坏。为了解决这个问题&a…

心理咨询预约微信小程序开发制作步骤

随着互联网的普及和人们对心理健康的重视,越来越多的心理咨询需求在日常生活中涌现。为了满足这一需求,开发一款心理咨询预约微信小程序势在必行。本文将介绍使用乔拓云网这个第三方制作平台来制作这款小程序的具体步骤。 1. 找一个合适的第三方制作平台…

竞赛选题 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

ChatGPT追祖寻宗:GPT-3技术报告要点解读

论文地址:https://arxiv.org/abs/2005.14165 往期相关文章: ChatGPT追祖寻宗:GPT-1论文要点解读_五点钟科技的博客-CSDN博客ChatGPT追祖寻宗:GPT-2论文要点解读_五点钟科技的博客-CSDN博客 本文的标题之所以取名技术报告而不是论文…

【差旅游记】初见乌海湖

哈喽,大家好,我是雷工。 最近在乌海出差,有幸见到了传说中在沙漠中看海的“黄河明珠”——乌海湖。 前段时间一直有点忙,现在有点时间,趁还没忘光,简单整理记录下。 那是在上个月,2023年8月8号…

K8S:Pod容器中的存储方式及PV、PVC

文章目录 Pod容器中的存储方式一.emptyDir存储卷1.emptyDir存储卷概念2.emptyDir存储卷示例 二.hostPath存储卷1.hostPath存储卷概念2.hostPath存储卷示例 三.nfs共享存储卷1.nfs共享存储卷示例 四.PV和PVC1.PV、PVC概念2.PVC 的使用逻辑及数据流向3.storageclass插…

Conditional DETR(ICCV 21)

Conditional DETR(ICCV 21) Conditional DETR for Fast Training Convergence 加速detr收敛(50 epoch收敛) DETR收敛慢的原因 DETR训练收敛速度慢,需要500 epochs DETR的Cross Attention高度依赖content embedding…

Go编程规范

文章目录 注释转义符定义变量方法一:指定变量类型,声明后若不赋值,使用默认值方法二:根据值自行判定变量类型(类型推导)方法三:省略var, 注意:左侧的变量不应该是已经声明过的,否则会导致编译错误[推荐]全局…

通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access

本文介绍利用CommGate X2ACCESS-U实现从OPC UA Server读取数据并同步转储至ACCESS数据库。CommGate X2ACCESS-U是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从OPC UA Server实时读取…