需求:
在写博客的时候发现有时候需要通过动态的图片更好的展示自己的结果。虽然网上也有在线转动图的网站,不过很多都要收费而且会降低画质,因此今天就制作了这款视频转gif的软件。并附采坑记录及解决方案,最后配置到自己的电脑上方便自己使用。
后面按照以下流程进行介绍
思路是借助
PyQt5
交互式地导入mp4文件,然后借助moviepy
将视频转动图。
具体代码
import sys
from moviepy.editor import *
from PyQt5.QtWidgets import *
import sys
def 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的电脑上也能使用(打包配置会将依赖的那些包都给打包进去)。
工具下载
常用的 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 pkgutil
import 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 pkgutil
import 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
重点还是整个后面的程序打包和配置部分。