用Python实现视频转 Gif 动图打包并配置到自己电脑上

用Python实现视频转 Gif 动图打包并配置到自己电脑上


请添加图片描述


参考

前言

需求:
在写博客的时候发现有时候需要通过动态的图片更好的展示自己的结果。虽然网上也有在线转动图的网站,不过很多都要收费而且会降低画质,因此今天就制作了这款视频转gif的软件。并附采坑记录及解决方案,最后配置到自己的电脑上方便自己使用。

后面按照以下流程进行介绍

  1. python程序的实现
  2. 程序打包成可执行文件
  3. 配置到个人电脑上

一、视频转Gif的Python代码实现?

思路是借助 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程序打包

为什么要打包

简单的说解释打包后生成的可执行文件可以在不安装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模块中包引入的问题,我们需要手动进行修改。在网上查阅后发现主要出错的位置在这个包中videoaudio中的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

总结

重点还是整个后面的程序打包和配置部分。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值