用Python实现视频转 Gif 动图打包并配置到自己电脑上
用Python实现视频转 Gif 动图打包并配置到自己电脑上
文章目录
- 用Python实现视频转 Gif 动图打包并配置到自己电脑上
- 参考
- 前言
- 一、视频转Gif的Python代码实现?
- 二、Python程序打包
- 三、配置到自己电脑上
- 可执行程序下载链接
- 总结
参考
- https://blog.csdn.net/u012552296/article/details/89295273
- https://blog.csdn.net/sunatmine/article/details/110713054
- 解决 moviepy 打包出错
前言
需求:
在写博客的时候发现有时候需要通过动态的图片更好的展示自己的结果。虽然网上也有在线转动图的网站,不过很多都要收费而且会降低画质,因此今天就制作了这款视频转gif的软件。并附采坑记录及解决方案,最后配置到自己的电脑上方便自己使用。
后面按照以下流程进行介绍
- python程序的实现
- 程序打包成可执行文件
- 配置到个人电脑上
一、视频转Gif的Python代码实现?
思路是借助
PyQt5
交互式地导入mp4文件,然后借助moviepy
将视频转动图。
具体代码
import sys
from moviepy.editor import *
from PyQt5.QtWidgets import *
import sysdef trans(video_path:str, save_path:str):"""## 实现视频转动图:params ``video_path``: 视频的路径:params ``save_path``: 动图保存路径"""if not save_path.endswith(".gif"):save_path += ".gif"video = VideoFileClip(video_path)clip = (video.subclip(0.1,video.duration))# 设置每秒5帧,帧数越大越丝滑不过生成的gif也大clip.write_gif(save_path, fps=int(video.duration) * 5)def VideoPlayer():# 这个是必要的app = QApplication(sys.argv)data = QFileDialog.getOpenFileUrl()videoData = data[0]# 获取文件绝对路径videoFilePath = str(videoData).split("file:///")[1][:-2]trans(videoFilePath, videoFilePath[:-4].split(f"/")[-1])sys.exit(0)if __name__ == '__main__':VideoPlayer()
其实上述代码存在许多可修改的点,比如可以设置传参动态的设置生成Gif的帧数而现在是写死的。
二、Python程序打包
为什么要打包
简单的说解释打包后生成的可执行文件可以在不安装Python的电脑上也能使用(打包配置会将依赖的那些包都给打包进去)。
工具下载
常用的 pyinstaller 是常用的打包工具,可以用以下命令进行安装
pip install pyinstaller -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
下载成功后我们可以选择对python程序进行打包,使用命令如下
pyinstaller -F -c ×××.py
打包成功后会生成许多文件,不过我们想要的就是对应目录下dist文件夹中的同名的exe文件
例如我们对上述的程序打包
打包前
打包后目录结构
若打包成功后我们可以直接双击运行exe即可(也可以用cmd命令窗口运行,可以更好看到报错信息否则可能一闪而过),不过可能会因为打包的虚拟路径问题而出错(也就是说程序可直接运行但是打包后的结果无法直接运行)。此时我们就要针对的修改代码,让打包后的可执行文件也可以运行。
比如我们在这里直接运行打包后的程序,会报出以下错误
出现这个错误的原因是moviepy
模块中包引入的问题,我们需要手动进行修改。在网上查阅后发现主要出错的位置在这个包中video
和audio
中的init.py模块引入方式出错,具体路径可看下图(其中python文件的路径按照自己电脑上的来)。
可以将上述的修改为(黄色框内为注释掉的内容,蓝色框中的为新增的内容)
video/fs/all/_init_py修改后的
"""
Loads all the fx !
Usage:
import moviepy.video.fx.all as vfx
clip = vfx.resize(some_clip, width=400)
clip = vfx.mirror_x(some_clip)
"""
import pkgutilimport moviepy.video.fx as fx__all__ = [name for _, name, _ in pkgutil.iter_modules(fx.__path__) if name != "all"]
# for name in __all__:
# exec("from ..%s import %s" % (name, name))
from moviepy.video.fx.accel_decel import accel_decel
from moviepy.video.fx.blackwhite import blackwhite
from moviepy.video.fx.blink import blink
from moviepy.video.fx.colorx import colorx
from moviepy.video.fx.crop import crop
from moviepy.video.fx.even_size import even_size
from moviepy.video.fx.fadein import fadein
from moviepy.video.fx.fadeout import fadeout
from moviepy.video.fx.freeze import freeze
from moviepy.video.fx.freeze_region import freeze_region
from moviepy.video.fx.gamma_corr import gamma_corr
from moviepy.video.fx.headblur import headblur
from moviepy.video.fx.invert_colors import invert_colors
from moviepy.video.fx.loop import loop
from moviepy.video.fx.lum_contrast import lum_contrast
from moviepy.video.fx.make_loopable import make_loopable
from moviepy.video.fx.margin import margin
from moviepy.video.fx.mask_and import mask_and
from moviepy.video.fx.mask_color import mask_color
from moviepy.video.fx.mask_or import mask_or
from moviepy.video.fx.mirror_x import mirror_x
from moviepy.video.fx.mirror_y import mirror_y
from moviepy.video.fx.painting import painting
from moviepy.video.fx.resize import resize
from moviepy.video.fx.rotate import rotate
from moviepy.video.fx.scroll import scroll
from moviepy.video.fx.speedx import speedx
from moviepy.video.fx.supersample import supersample
from moviepy.video.fx.time_mirror import time_mirror
from moviepy.video.fx.time_symmetrize import time_symmetrize
audio/fs/all/_init_py修改后的
"""
Loads all the fx !
Usage:
import moviepy.audio.fx.all as afx
audio_clip = afx.volume_x(some_clip, .5)
"""import pkgutilimport moviepy.audio.fx as fx__all__ = [name for _, name, _ in pkgutil.iter_modules(fx.__path__) if name != "all"]# for name in __all__:
# exec("from ..%s import %s" % (name, name))from moviepy.audio.fx.audio_fadein import audio_fadein
from moviepy.audio.fx.audio_fadeout import audio_fadeout
from moviepy.audio.fx.audio_left_right import audio_left_right
from moviepy.audio.fx.audio_loop import audio_loop
from moviepy.audio.fx.audio_normalize import audio_normalize
from moviepy.audio.fx.volumex import volumex
修改成功后我们需要重新执行打包命令对程序重新打包,打包成功后即可直接运行。
点击打开后出现以下画面说明成功开始运行(本来想放动图的但是博客图片大小限制了)
成功运行后就可以在运行exe 的目录下看到与视频同名的Gif 图片生成了
成功结果
三、配置到自己电脑上
先随便找个地方创建文件夹,若要长期使用的话最好不要放在桌面,例如下面我再C:\Users\86136
下创建目录Mytools\bin
,然后将生成的exe放到这里面
接下来我们配置系统变量然后打开环境变量,然后找到对应的Path变量并双击进去添加自己刚刚创建文件的绝对路径加
\
,例如我添加的是C:\Users\86136\Mytools\bin\
.
在添加完毕后我们可以在自己电脑的任意位置通过命令窗口执行这个exe而不会报找不到文件的错误
例如我们直接在新建的文件夹下可成功运行运行,而该文件夹下无该exe
可执行程序下载链接
网盘链接
提取码 r8m1
总结
重点还是整个后面的程序打包和配置部分。
用Python实现视频转 Gif 动图打包并配置到自己电脑上相关推荐
- Python实现视频转 gif 动图
Python实现视频转 gif 动图 1. 准备工作 需要准备用于生成 gif的 视频文件 ,另外,就是需要用到 moviepy库,关于这个库更详细的介绍可以查看它的官方文档. https://zul ...
- 用Python代码实现视频转gif动图
下面是一个使用 Python 代码实现视频转 gif 动图的简单示例: import imageio# 读取视频文件 video = imageio.get_reader('input.mp4')# ...
- python 制作gif-怎样用Python制作好玩的GIF动图
原标题:怎样用Python制作好玩的GIF动图 作者: 景略集智 https://jizhi.im/blog/post/pytogif 程序员共读整理发布,转载请联系作者获得授权 之前我们分享过用Py ...
- 怎么把视频压缩成表情包?如何把视频做成GIF动图
平时我们看到的电影.电视剧.综艺.动漫等等的视频其实都可以作为制作gif动图的素材来使用,我们可以截取视频中的一小部分来转换成gif,这样无论是在聊天时或者是新媒体工作者在写文章时都可以方便使用,那么 ...
- 如何把视频转换为gif动图
如何把视频转换为gif动图 使用网站(https://www.mnggiflab.com/video-to-gif)可以很方便的将视频(mp4 等 web 支持的视频格式)转换为 gif 动图格式,本 ...
- FFmpeg进阶: 截取视频生成gif动图
文章目录 1.封装视频滤镜 2.截取视频生成gif 3.gif优化 4.示例效果 现在互联网上很多人都通过表情包来表达自己的情绪,常用的表情包很多都是视频文件的一部分.这里就介绍一下如何通过ffmpe ...
- Java截取视频生成Gif动图
添加jar包依赖 <!-- 视频截图 --> <dependency><groupId>org.bytedeco</groupId><artifa ...
- 如何将视频做成gif动图?
如果说视频是一种记录,那么gif动图就是表达心理情绪的一种方式,在现代的社交方式中,很多小伙伴都热衷于使用gif动图来表达自己的喜怒哀乐,这样就会很轻松而愉快的将自己的心理状态表达给对方,而对方在读取 ...
- android 视频转表情包,视频转gif动图怎么转?一款能制作表情包的软件,年轻人很爱用...
视频转gif动图怎么转?现如今,很多年轻人都喜欢用表情包来进行社交聊天.迅捷视频转换器功能强大,是一款可以制作出有趣表情包的软件.如果你刚好也想制作出自己喜欢的表情包,继续往下看会得到满意答案哦. 打 ...
最新文章
- 【另类见解】秒杀并非高不可攀
- Mongodb最佳实践及使用问题
- 量子位「MEET 2022智能未来大会」启动,邀你一起见证AI价值
- libjpeg编译使用详解
- 单指手势,旋转,缩放
- 中国楼宇自控系统发展规划现状及未来前景预测报告2022-2028年版
- Java多线程:线程间通信之Lock
- SAP UI5 global configuration interface
- AWS还是Firebase?在移动应用后端应该使用哪个?
- ? php 为啥报错,如何解决js里面的php代码报错问题
- python不能安装在中文_无法在Python上安装表
- jquery获取checkbox是否选中
- 严肃贴:内幕 手机行业
- Flink on YARN(下):常见问题与排查思路
- Eero并入Amazon:确保用户隐私政策依然不变
- 一篇文章彻底掌握 HDFS 跨集群跨版本数据同步工具 hadoop disctp
- Linux C语言 vim编辑器 使用 sqlite3数据库 makefile 的网络编程 qq 聊天室项目
- 网页版在线公式编辑器
- 审稿意见的“so what”如何处理?
- 微软出品的Python小白神器,真香
热门文章
- 点击Home键关闭软键盘
- 计蒜客 A1634:划分整数
- python画卡通_Python——turtle绘制动漫形象(魔法少女小圆晓美焰,super beautiful)...
- Python JSON格式与字符串转换(字符串转json、json转字符串)
- 两个清爽的白噪音网站,提高工作效率
- 【机器学习】决策树分类(简介、原理、代码)
- 微信支付后“自动”绑定用户手机号与公众号
- CF1674 F. Desktop Rearrangement(二维转一维, 模拟)
- ChatGLM-6B介绍
- 2018双11手机购买推荐