python MP4视频转GIF动图

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 VideoFileClipmyClip = VideoFileClip(filename)myClip.speedx(3).write_gif(filename.replace('.mp4', '.gif'))passclass 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.translateMainWindow.setWindowTitle(_translate("MainWindow", "MP4_to_GIF"))self.pushButton.setText(_translate("MainWindow", "将MP4转为GIF"))# 按钮事件self.pushButton.clicked.connect(mp4_to_gif)if __name__ == "__main__":import sysapp = 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.mzph.cn/news/84251.shtml

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

相关文章

C#-WinForm-发送邮件

登录QQ邮箱——设置——开启“POP3/SMTP服务” 登陆QQ邮箱→打开设置→开启“POP3/SMTP服务”,获取“授权码” 简单总结一下: 1、使用SmtpClient发送电子邮件是很简单的,只要正确创建了MailMessage对象和SmtpClient就可以很容易的发送出去电…

大二层—多链接透明互联协议如何工作

大二层就引入了 TRILL(Transparent Interconnection of Lots of Link),即多链接透明互联协议。它的基本思想是,二层环有问题,三层环没有问题,那就把三层的路由能力模拟在二层实现。 运行 TRILL 协议的交换…

c语言进阶部分详解(指针进阶2)

大家好!我快马加鞭接着写出指针部分part2部分。第一部分见:c语言进阶部分详解(指针进阶1)_总之就是非常唔姆的博客-CSDN博客 指针初阶部分见:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博…

CSP-J 2023 入门级 第一轮 阅读程序(2)

【题目】 CSP-J 2023 入门级 第一轮 阅读程序&#xff08;2&#xff09; #include <iostream> #include <vector> #include <algorithm> using namespace std; int f(string x, string y) {int m x.size();int n y.size();vector<vector<int>&g…

【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…

Vulnhub系列靶机-Hackadmeic.RTB1

文章目录 Vulnhub系列靶机-Hackadmeic.RTB11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用3.1 反弹Shell 4. 内核提权 Vulnhub系列靶机-Hackadmeic.RTB1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.184扫描到了…

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java &#xff0c;通常 Interface 的问题多多少少会遇到&#xff0c;而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型&#xff08;Abstract Type&#xff09;&…

SkyWalking快速上手(一)——安装单机版SkyWalking、使用SkyWalking

文章目录 什么是SkyWalking为什么选择SkyWalking安装步骤前置条件环境要求下载 SkyWalking 配置 SkyWalkingSkywalking 使用Agent 配置Collector 配置 启动 SkyWalking配置SkyWalking代理 SkyWalking的监控功能分布式调用链追踪性能指标监控告警和报警 总结 什么是SkyWalking …

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

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

2. PCIE TLP解包封包

第二十一讲、PCIE的TLP包的封包解包原理.pdf 00 Packet Coding.docx 掌握如何发送接收 Mrd&#xff08;memory read TLP&#xff09;、Mwr(Memory write TLP)、Cpl(Completion TLP)和Cpld(Completion with data TLP) 命令包 1、 TLP 包是由 PCIE 的 Endpoint 或者 Root Complex…

两数之和-(哈希)

牛客网: BM50 题目: 数组中两数之和为给定值&#xff0c;返回下标 思路: 遍历数组获取idx与value&#xff0c;value为key, idx为val存入map中&#xff0c;每次遍历时判断target-value是否已在map中有值&#xff0c;值即为先前存入的下标&#xff0c;取出与当前坐标组合为数组…

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出

多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出 目录 多输入多输出 | MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向量机多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现PSO-LSSVM粒子群优化最小二乘支持向…

60从零开始学Java之与数字相关的类有哪些?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们在解决实际问题时&#xff0c;会经常对数字、日期和系统设置进行处理&#xff0c;比如在我们的代…

二分搜索算法

二分搜索算法 二分搜索 对于一组有顺序的数据&#xff0c;不采用常见的遍历方式找到需要的数据&#xff0c;而是利用其规律&#xff0c;比中间数据小的一定在中间数据左边&#xff0c;比中间数据大的一定在中间数据右边&#xff0c;每次排除一般的数据&#xff0c;从而提高搜…

【算法基础】数学知识

质数 质数的判定 866. 试除法判定质数 - AcWing题库 时间复杂度是logN #include<bits/stdc.h> using namespace std; int n; bool isprime(int x) {if(x<2) return false;for(int i2;i<x/i;i){if(x%i0) return false;}return true; } signed main() {cin>&g…

SpringBoot+MyBatisPlus+MySQL不能储存(保存)emoji表情问题解决

1.之前在学习过程中不知道utf8和utf8mb4的区别&#xff0c;也没过多去了解&#xff0c;直到最近设置的数据库编码全是utf8后发现问题所在了&#xff0c;居然不能储存表情包&#xff01;&#xff01;&#xff01;整个人直接傻了&#xff0c;后面知道了utf8是3字节不能储存表情&a…

【MTK】【WFD】手机投屏到投影仪不显示画面

问题分析: 在投屏过程中,有时候会出现WFD sink端回复的video 格式表不正确,sink表示是支持VESA(3fffffff),但是当手机根据协商结果得到最优分辨率并发送给sink端时,sink端看上去没有正常播放,其实实际上应该是不支持的。 比如我们这个问题就是CES表中的0001ffff,最大…

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

层次查询和分析函数(LAG、LEAD)在号段选取中的应用

1. 问题的提出 在实际工作中&#xff0c;我们常常会碰到号段选取的问题&#xff0c;例如&#xff1a; 一组连续的数&#xff0c;去掉中间一些数&#xff0c;要求出剩下的数的区间&#xff08;即号段&#xff09;例如&#xff1a;一串数字为1,2,3,4,7,9,10&#xff0c;则号段为…

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…