社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python轻松搞定视频转 gif 动图

Python编程时光 • 3 年前 • 469 次点击  

不知道大家是不是有过类似的经历,在看视频的时候觉得某段非常有意思想弄成动图,但是无从下手!或可以在网上找一些在线工具但是多多少少需要付费或者带有水印之类的,那么!

对,今天我们就来学习用Python搞定这一需求吧!


动图效果


1. 准备工作

需要准备用于生成gif视频文件,我这里用的是上次《用Python制作一个B站视频下载小工具(文末附完整代码)》里案例中的视频。另外,就是需要用到moviepy库,关于这个库更详细的介绍可以查看它的官方文档。

https://zulko.github.io/moviepy/

命令行键入pip安装吧

pip install moviepy

这就搞定第1步了!

2. 初探

这一步也是我们开篇第一张动图的制作脚本。

from moviepy.editor import *

video_path = "F:\PythonCool\视频\【咒术回战】第20集五条悟帅的有些过分了.mp4"
video = VideoFileClip(video_path)
clip = (video.subclip((2,4.5),(2,6.0))
        .resize(0.2))
clip.write_gif("动图搞定了.gif",fps=8)

我们原始视频素材是尺寸1920*1080,帧率是30

视频属性

本次转动图的参数设定如下:

  • subclip((2,4.5),(2,6.0)  选取的是整个视频从2.45秒到2.60秒
  • resize(0.2) 尺寸大小改为原始大小的0.2也就是1/5大小(毕竟动图尺寸大小其文件大小也太大)
  • write_gif("动图搞定了.gif",fps=8) 保存gif的时候将帧率调整为了8

基于上述参数设定下,这个动图一共其实是(2.60-2.45)*8=12张图构成!

动图属性

3. 截取区域转动图

有时候我们可能只需要截取屏幕中指定矩形区域来进行动图的制作,这就要用到crop函数截图区域了。

video.crop(
    x1=None,
    y1=None,
    x2=None,
    y2=None,
    width=None,
    height=None,
    x_center=None,
    y_center=None,
)

参数:

x1y1:矩形区域左上角坐标

x2y2:矩形区域右下角坐标

widthheight:是宽度和高度

x_center y_center:表示x1的坐标为x_center-width/2,x2的坐标为x_center+width/2,y_center类似处理

比如,我们截图人物所在区域制作动图代码如下:

crop = (video.subclip((2,4.5),(2,6.0))
        .resize(0.2)
        .crop(x1=70,y1=0, x2=310,y2=216)) 
crop.write_gif("裁剪.gif",fps=8)
裁剪

这里关于左上角和右下角坐标的确定可以采用preview方法预览视频,然后鼠标点击对应位置来获取。

video.resize(0.2).preview()

4. 固定区域转动图

对于上面那个动图中 的搞定了,我们希望它常驻,那么可以通过截图搞定了出现这一时刻的内容,然后覆盖到原来位置常驻即可。

snapshot = (crop
            # 截图区域
            .crop(x1=100,y1=190, x2=140,y2=216
            # 截取的时间段(1秒的时候)
            .to_ImageClip(1)
            # 设置位置(左上角,和截取区域的左上角一致)
            .set_position((100190))
            .set_duration(crop.duration))
# 合并
composition = CompositeVideoClip([crop, snapshot])
composition.write_gif('覆盖.gif', fps=8)
覆盖

5. 添加自定义文本

对于上面这个操作,我们还有很多方法来完成,比如用一张带有搞定了的图片去覆盖(和上面的案例类似,只是不需要单独截图而是读取一张现成的);另外,我们还可以通过添加蒙版再加上自定义文字的形式来玩。

from moviepy.video.VideoClip import TextClip

# 蒙版
mask = (# 长宽为40*20的颜色为黑色的mask
     ColorClip((4020), (000))
     # 设置位置(同第4节)
        .set_pos((100190))
        .set_duration(crop.duration)
        )
# 文字
text = (TextClip("搞定啦",
                 fontsize=30, color='white',
                 font='SimHei', interline=-25)
        .set_pos((80160))
        .set_duration(crop.duration))

composition = CompositeVideoClip([crop, mask, text])
composition.write_gif('覆盖.gif', fps=8)
自定义文本

以上就是本次的全部内容了,关于moviepy这个库还有很多种好玩的用于视频剪辑的功能,我们后续再慢慢研究分享与学习吧~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/127119
 
469 次点击