Python视频处理模块之moviepy的用法教程

目录
  • 楔子
  • moviepy 的简单使用
    • 视频截取
    • 音量调整
    • 在视频上添加文字
  • 获取视频属性
  • 视频合成
  • 修改视频属性
  • 视频音频合成

楔子

随着自媒体时代,现在对视频的处理变得越来越常见。我们可以使用 Adobe 的一些专业工具,但是效率不高;如果只是对视频进行一些简单的处理,或者视频的数量非常多的话,那么使用专业软件显然就不太适合了。

而 Python 有一个专门用于处理视频的第三方库:moviepy,可以非常方便地对视频进行一些简单处理,下面我们就来看一看。

首先是安装:

pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple

个人推荐安装的时候使用清华源,因为moviepy需要依赖另一个库:imageio_ffmpeg,这个库里面包含了一个 50 多 MB 的 ffmpeg 二进制文件,如果网络不行的话,直接从pypi上拉取会花很长时间。当然安装moviepy的时候,imageio_ffmpeg 就顺带安装了。

从这里我们也可以看到,moviepy 底层依赖 ffmpeg,而ffmpeg是跨平台的,所以 moviepy 也可以在任意平台上使用。

moviepy 的简单使用

我们来看 moviepy 都提供了哪些功能,不过在使用之前我们需要一个视频,就使用 you-get 工具从 bilibili 下载一个吧。

下面就使用这个下载的视频进行演示。

视频截取

如果一个视频比较长,我们可以截取感兴趣的片段。

from moviepy import editor

# 调用 `VideoFileClip(文件名)` 即可将视频加载进来
# 并且支持不同的视频格式,比如 flv、mp4 等等
video_clip = editor.VideoFileClip(
    "空城计,但是7Ki7Ki酱酱.mp4")

# 调用subclip方法,传入起始时间和结束时间
# 即可截取视频中的指定部分
"""
video_clip.subclip(): 
   截取视频全部,相当于没做处理
video_clip.subclip(10): 
   从视频的 `第10秒` 截取到 `结尾`
video_clip.subclip(10, -2): 
   从视频的 `第10秒` 截取到结尾的 `前两秒`
video_clip.subclip((1, 35), (3, 10)): 
   从视频的 `第1分35秒` 截取到 `第3分10秒` 
video_clip.subclip((1, 2, 18), (2, 1, 34)): 
   从视频的 `第1小时2分18秒` 截取到 `第2小时1分34秒`
"""

# subclip 会返回一个新的 VideoFileClip 对象
# 所以它支持链式操作
video_clip = video_clip.subclip(30)

音量调整

一个视频,我们也可以调整它的音量。

from moviepy import editor

video_clip = editor.VideoFileClip(
    "空城计,但是7Ki7Ki酱酱.mp4")

# 调整音量,变为原来的0.5
# 同样会返回一个新的对象
video_clip = video_clip.volumex(0.5)

在视频上添加文字

如果你想在视频里面写上一些内容,moviepy 也是支持的。

from moviepy import editor

video_clip = editor.VideoFileClip(
    "空城计,但是7Ki7Ki酱酱.mp4")

# 做一个文本剪贴板,自定义样式、颜色。
text_clip = editor.TextClip("7ki7ki 棒棒",
                            fontsize=40, color="blue")
# 让文本在屏幕的正中间显示
# 持续10秒,设置透明度为 0.6
"""
屏幕左上角的坐标为 (0, 0),右下角的坐标为 (屏幕宽度, 屏幕高度)
set_position((800, 500)): 
    显示在800, 500的位置上
set_position(("center", "center")): 
    显示在屏幕的正中央
set_position((0.4, 0.6), True): 
    显示在距离左边百分之40、距离上边百分之60的位置上

set_duration(10): 持续10秒
set_opacity(0.6): 设置透明度为0.6
"""

text_clip = text_clip.set_position(("center", "center")).\
    set_duration(10).set_opacity(0.8)

# 然后把 `文本剪贴板` 贴在视频上
video_clip = editor.CompositeVideoClip([video_clip, text_clip])

如果你是 Windows 系统,不出意外的话,当你在执行 editor.TextClip() 的时候,会报出如下错误:

这个错误是由于你的电脑上缺少 ImageMagick 造成的,我们需要去官网下载对应操作系统的 ImageMagick。

官网:http://www.imagemagick.org/script/download.php

下载完之后,安装在指定的目录,然后修改site-packages\moviepy\config_defaults.py,在文件的尾部有如下内容:

import os

FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = os.getenv('IMAGEMAGICK_BINARY', 'auto-detect')

# 把 `IMAGEMAGICK_BINARY = ` 后面的内容
# 换成 ImageMagick 安装路径下 magick.exe 的绝对路径:
import os

FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = r'E:\ImageMagick-7.0.10-Q16\magick.exe'

替换完之后,再执行就没有问题了。

我们将上面的几个部分,组合起来演示一下:

from moviepy import editor

video_clip = editor.VideoFileClip(
    "空城计,但是7Ki7Ki酱酱.mp4")

video_clip = (
    # 截取 5 到 20 秒
    video_clip.subclip(5, 20).
    # 设置音量为原来的 0.8
    volumex(0.8)
)

text_clip = (
    editor.TextClip("7ki7ki",
                   fontsize=40, color="blue").
    set_position(("center", "center")).
    set_duration(10).
    set_opacity(0.8)
)

# 把 `文本剪贴板` 贴在视频上
video_clip = editor.CompositeVideoClip([video_clip, text_clip])

# 然后将视频导出
video_clip.write_videofile("空城计,但是7Ki7Ki酱酱_2.mp4")

执行代码,会看到以下输出:

表示正在调用 ffmpeg 处理视频,而视频处理完毕大概需要十几秒钟的时间。处理完毕之后,我们打开看一下。

我们看到此时文字就添加进去了,并且该视频只有15秒,也就是我们截取的 5 到 20 秒的部分。

总结一下整个流程,首先使用 VideoFileClip 对视频进行读取,得到 VideoFileClip 对象,记作 video_clip。我们可以对这个 video_clip 进行任意的操作(剪切、合并、调整亮度、速度、和其它的 video_clip 拼接在一起等等)。

并且需要注意的是,这些操作是可以链式调用的,因为每一次操作都会得到一个新的 video_clip,不会影响原来的。我们上面演示了视频的读取、以及指定部分的截取、音量的调整、以及添加文字等等,下面还会介绍更多操作。

最后我们调用 video_clip 的 write_videofile 方法,可以将处理之后的视频写入本地。当然也可以使用 pygame,或者 jupyter notebook 进行展示。为了方便,我们后面就使用 jupyter notebook。

但是要清楚,moviepy 处理视频使用的是 ffmpeg,生成文字使用的是 ImageMagick。

获取视频属性

一个视频,肯定有大小、宽高、fps、时长等属性,那么 moviepy 要如何获取这些属性呢。

from moviepy import editor

video_clip = editor.VideoFileClip(r"空城计,但是7Ki7Ki酱酱.mp4")
# 获取宽度和高度
print(video_clip.size)
print(video_clip.w, video_clip.h)
"""
[2160, 1080]
2160 1080
"""

# 获取 fps
print(video_clip.fps)
"""
30.0
"""

# 获取时长,单位是秒
print(video_clip.duration)
"""
110.92
"""

# 获取大小,可以直接使用 os 模块
import os
# 大概 13MB
size = os.stat(r"空城计,但是7Ki7Ki酱酱.mp4").st_size
print(size)
print(size / 1024 ** 2)
"""
13324402
12.70713996887207
"""

视频合成

视频合成有两种方式:

1)多个视频按照先后顺序拼接起来,比如一个一分钟和一个两分钟的视频组合起来,变成三分钟。

2)多个视频在同一个画面上显示。

先来看看第一种:

from moviepy import editor
video_clip = editor.VideoFileClip(r"D:\satori\空城计,但是7Ki7Ki酱酱.mp4")

# 截取10到20秒
video_clip1 = video_clip.subclip(10, 20)
# 截取结尾的前两秒
video_clip2 = video_clip.subclip(-2)
# 然后前后拼接起来
video_clip = editor.concatenate_videoclips([video_clip1, video_clip2])
# 使用jupyter进行展示,设置一个宽度
video_clip.ipython_display(width=360)

执行完之后,视频就展示在 jupyter 上了,而且是两个视频拼接在一起的,总共 12 秒钟。此外 concatenate_videoclips 中还可以指定一个transition参数(也是一个VideoFileClip对象),作为衔接之间的过渡。

还是比较简单的,假设我们有 5 个视频,如果只是简单的前后拼接就可以这么做。

from moviepy import editor

videos = ["1.mp4", "2.mp4", "3.flv",
          "4.mp4", "5.flv"]
video_clips = []

for video in videos:
    video_clips.append(editor.VideoFileClip(video))

editor.concatenate_videoclips(
    video_clips).write_videofile("xxx.mp4")

这里值得一提的是,多个 video_clip 进行拼接,并不需要这些 video_clip 之间有相同的尺寸、时长什么的,仅仅是将它们按照顺序拼接起来而已。

另外,当你用 jupyter 进行展示时,视频不要过长,否则报错。当然你也可以给 ipython_display 函数传递一个 maxduration 参数,让它支持显示更大时长的视频文件。但是注意:如果文件过大,在 jupyter 上可能会耗光你的内存。

然后是第二种拼接

有多个视频,可以让它们在同一个画面上显示。

from moviepy import editor

# margin: 设置外边距
video_clip = editor.VideoFileClip(
    r"D:\satori\空城计,但是7Ki7Ki酱酱.mp4").margin(10)

# 截取 10 到 20 秒
video_clip1 = video_clip.subclip(10, 20)
# x 轴镜像
video_clip2 = video_clip1.fx(editor.vfx.mirror_x)
# y 轴镜像
video_clip3 = video_clip1.fx(editor.vfx.mirror_y)
# resize: 等比缩放
video_clip4 = video_clip1.resize(0.5)

# 列表里面有两个列表,所以会将屏幕上下等分
# 上半部分显示 video_clip1, video_clip2
# 下半部分显示video_clip3, video_clip4
video_clip = editor.clips_array([[video_clip1, video_clip2],
                                 [video_clip3, video_clip4]])
video_clip.ipython_display(width=600)

所以 concatenate_videoclips 是将多个视频前后拼接,而 clips_array 则是将多个视频同时显示在一个画面里面。

修改视频属性

from moviepy import editor

video_clip = editor.VideoFileClip(
    r"D:\satori\空城计,但是7Ki7Ki酱酱.mp4").subclip(10, 20)

video_clip = (
    # 调整尺寸,保持比例
    video_clip.fx(editor.vfx.resize, width=460)
        # 倍数播放
        .fx(editor.vfx.speedx, 2)
        # 画面调暗
        .fx(editor.vfx.colorx, 0.5)
)
video_clip.ipython_display(width=600)

虽然截取了 10 秒钟,但是 2 倍数播放,所以变成了 5 秒钟。

视频音频合成

假设有一个视频 A 和一个视频 B,现在要将视频 B 的音频和视频 A 组合起来,怎么做呢?

from moviepy import editor

video_clipA = editor.VideoFileClip(r"A.mp4")
video_clipB = editor.VideoFileClip(r"B.mp4")

# 获取 B 的音频
audioB = video_clipB.audio
"""
# 如果已经是音频格式,那么也可以直接加载
audioB = editor.AudioFileClip("b.mp3")
"""

# 将 B 的音频和 A 组合起来
video_clipA = video_clipA.set_audio(audioB)

以上就是Python视频处理模块之moviepy的用法教程的详细内容,更多关于Python视频处理模块moviepy的资料请关注我们其它相关文章!

(0)

相关推荐

  • MoviePy简介及Python视频剪辑自动化

    视频地址:https://www.bilibili.com/video/BV1mv411k7Qv?p=1 moviepy是啥 MoviePy是一个用于视频编辑的Python模块. 可用于基本操作(如剪切.拼接.字幕插入).视频合成.视频处理或创建高级效果等. 它可以读写最常见的视频(甚至GIF).音频格式. 在一定程度上,它可以取代Premiere. moviepy能做啥 批量加片头.片尾 比如你有一堆已经做好的视频,你想给它们加上片头,但不想用PR一个个地处理: 轻松从MV中提取音乐 比如你有

  • Python中使用moviepy进行视频分割的实现方法

    场景 moviepy官网: https://pypi.org/project/moviepy/ 是一个用于视频编辑的Python库:切割.连接.标题插入.视频合成.非线性编辑,视频处理和定制效果的创建. Github: https://github.com/Zulko/moviepy 实现 首先你需要安装moviepy 打开cmd输入: pip install moviepy 其次需要安装ffmpeg,因为网络问题,这里使用豆瓣镜像 pip install imageio-ffmpeg -i h

  • python基于moviepy实现音视频剪辑

    目录 实践步骤 完整代码 参考 实践步骤 1.寻找合适的Python库(安装是否麻烦.使用是否简便.执行会不会太久) moviepy 音视频库.分析需要用的API:代码示例 2.定义输入输出 输入:一个音视频文件的地址,需要剪出来的时间段 输出:剪辑片段的文件 3.设计执行流程并一步步实现(定义函数,与使用具体API相关) 读入并创建clip对象. 剪辑subclip,输入时间参数可以是时间格式的字符串. 导出write_videofile. 4.结论:时间太久,片段多长就花了多久的时间:CPU

  • Python视频编辑库MoviePy的使用

    moviepy官网: https://pypi.org/project/moviepy/ 是一个用于视频编辑的Python库:切割.连接.标题插入.视频合成.非线性编辑,视频处理和定制效果的创建. Github: https://github.com/Zulko/moviepy MoviePy MoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频合成(又名非线性编辑),视频处理,和自定制效果.可以看gallery中的一些实例来了解用法.MoviePy可以读写

  • MoviePy常用剪辑类及Python视频剪辑自动化

    视频地址:https://www.bilibili.com/video/BV1mv411k7Qv?p=4 导入方式 所有的剪辑类都可以从moviepy.editor模块中导入 Clip 所有剪辑类的基类, 也可以简单的将它称为: VideoClip 所有视频剪辑的基类, 可以简单的将它称为: 很少用, 除非你要从零开始一帧一帧地构建视频. VideoFileClip 最常用的视频剪辑类, 用于导入视频文件(mp4.avi等格式皆可) ImageClip 常用的剪辑类, 用于导入图片文件(png.

  • python moviepy 的用法入门篇

    目录 模块安装使用如下命令即可 截取视频 提取A视频的音频,注入到B视频中 去掉视频声音 获取视频信息 设置视频倍速播放 截取视频封面 提取视频中的音频内容 写在后面 python 中的视频处理模块,有一个叫做 moviepy,今天我们就来唠唠它. 模块安装使用如下命令即可 pip install moviepy 接下来完成第一个 Demo,为后续学习提高信心,截取视频中的一段. 截取视频 下述代码重点使用的是 subclip 方法,但需要提前声明一个 VideoFileClip 对象, Vid

  • python用moviepy对视频进行简单的处理

    楔子 随着自媒体时代,现在对视频的处理变得越来越常见.我们可以使用Adobe的一些专业工具,但是效率不高:如果只是对视频进行一些简单的处理的话,或者视频的数量非常多的话,那么使用专业软件显然就不太适合了. 而python中有专门用于处理视频的库:moviepy,可以非常方便地对视频进行一些简单处理,下面我们就来看一看. 首先是安装:pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple,个人推荐安装的时候使用清华源,因为mo

  • Python视频处理模块之moviepy的用法教程

    目录 楔子 moviepy 的简单使用 视频截取 音量调整 在视频上添加文字 获取视频属性 视频合成 修改视频属性 视频音频合成 楔子 随着自媒体时代,现在对视频的处理变得越来越常见.我们可以使用 Adobe 的一些专业工具,但是效率不高:如果只是对视频进行一些简单的处理,或者视频的数量非常多的话,那么使用专业软件显然就不太适合了. 而 Python 有一个专门用于处理视频的第三方库:moviepy,可以非常方便地对视频进行一些简单处理,下面我们就来看一看. 首先是安装: pip install

  • Python中os模块的12种用法总结

    目录 一.先总结,再详谈 二.详谈各种方法的使用 1.getcwd() :返回当前工作目录 2.chdir(path) :改变工作目录 3.listdir(path) :列举指定目录中的文件名和目录名 4.mkdir(path) :创建单层目录 5.makedirs() :递归创建目录 6.remove(path) :删除文件 7.rmdir(path) :删除单层目录 8.removedirs() :递归删除目录 9.system(command) :运行系统的shell命令 10.renam

  • Python中optionParser模块的使用方法实例教程

    本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. 示例如下: from optparse impo

  • python中logging模块的一些简单用法的使用

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所以Python引入了logging模块来记录我想要的信息. print也可以输入日志,logging相对print来说更好控制输出在哪个地方,怎么输出及控制消息级别来过滤掉那些不需要的信息. 1.日志级别 import logging # 引入logging模块 # 将信息打印到控制台上 loggi

  • Python中使用platform模块获取系统信息的用法教程

    操作系统相关 system() : 操作系统类型(见例) version(): 操作系统版本 release(): 操作系统发布号, 例如win 7返回7, 还有如NT, 2.2.0之类. platform(aliased=0, terse=0): 操作系统信息字符串,扥与system()+win32_ver()[:3] win32_ver(release='', version='', csd='', ptype=''): win系统相关信息 linux_distribution(distna

  • Python中Collections模块的Counter容器类使用教程

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类:排序字典,是字典的子类.引入自2.7. namedtuple()函数:命名元组,是一个工厂函数.引入自2.6. Counter类:为hashable对象计数,是字典的子类.引入自2.7. deque:双向队列.引入自2.4. defaultdict:使用工厂函数创建字典,使不用考虑缺失的字典键.引

  • Python使用cookielib模块操作cookie的实例教程

    cookielib是一个自动处理cookies的模块,如果我们在使用爬虫等技术的时候需要保存cookie,那么cookielib会让你事半功倍!他最常见的搭档模块就是python下的urllib和request. 核心类 1.Cookie 该类实现了Netscape and RFC 2965 cookies定义的cookie标准,基本可以理解为某一条cookie数据. 部分代码如下,很多属性是不是很眼熟? self.domain_initial_dot = domain_initial_dot

  • Windows下Python使用Pandas模块操作Excel文件的教程

    安装Python环境 ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用到的Numpy和Pandas等.更重要的是,不论在哪个平台上,都可以一键安装,自动配置好环境,不需要用户任何的额外操作,非常方便.因此,安装Python环境就只需要到ANACONDA网站上下载安装文件,双击安装即可. ANACONDA官方下载地址:https://www.continuum.io/downloads 安装完成之后,使用windows + r

随机推荐