楔子

随着自媒体时代,现在对视频的处理变得越来越常见。我们可以使用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上下载一个吧。

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

一个小栗子

我们以一个小栗子,来演示一下使用moviepy是怎么操作视频的。

from moviepy import editor

# 调用 `VideoFileClip(文件名)` 即可将视频加载进来
# 可以读取各种格式的视频文件
video_clip = editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv") # 调用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秒`
"""
video_clip = video_clip.subclip(5, 20) # 调整音量,变为原来的0.5
video_clip = video_clip.volumex(0.5) # 做一个文本剪贴板,自定义样式、颜色。
text_clip = editor.TextClip("hanser, little angel", fontsize=40, color="blue")
# 让文本在屏幕的正中间显示,持续10秒,设置透明度为0.8
"""
屏幕左上角为(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]) # 然后导出视频,可以是其它的视频格式
video_clip.write_videofile("1.mp4") # 下面很重要:
r"""
如果你是在Windows上执行,不出意外的话,当你在执行 editor.TextClip() 的时候,会报出如下错误: OSError: MoviePy Error: creation of None failed because of the following error: [WinError 2] 系统找不到指定的文件。. .This error can be due to the fact that ImageMagick is not installed on your computer,
or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py,
or that the path you specified is incorrect 这个错误是由于你的电脑上缺少ImageMagick造成的,我们需要去http://www.imagemagick.org/script/download.php
这个网站上下载对应操作系统的ImageMagick,我这里是Windows。可能下载的比较慢,毕竟是外网。
如果觉得速度无法忍受的话,我提供了相应了网盘链接: 链接:https://pan.baidu.com/s/1n1xNohD7V-abQbX81UENJQ 提取码:usl3,可以进行保存下载 下载完毕之后,直接安装在指定的目录。
然后修改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'
"""
# 然后执行就没有问题了

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

那么moviepy是如何工作的呢?

moviepy使用ffmpeg对视频、音频文件进行读取和导出,使用ImageMagick生成文字等等。

首先我们使用VideoFileClip对视频进行读取,得到VideoFileClip对象,我们记作clip。我们可以对这个clip进行任意的操作(剪切、合并、调整亮度、速度、和其它的clip拼接在一起等等)。并且我们需要注意的是,这些操作是可以链式调用的,因为每一次操作都会得到一个新的clip,不会影响原来的。我们上面演示了视频的读取、以及指定部分的截取、音量的调整、以及添加文字等等,我们后面还会介绍更多操作。

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

视频属性

我们说一个视频,肯定有大小、宽高、fps、时长等等属性,下面我们就来看看如何获取这些属性。

from moviepy import editor

# 调用 `VideoFileClip(文件名)` 即可将视频加载进来
# 可以读取各种格式的视频文件
video_clip = editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv")
# 获取宽度和高度
print(video_clip.size) # [800, 600]
print(video_clip.w, video_clip.h) # 800 600 # 获取fps
print(video_clip.fps) # 23.976023976023978 # 获取时长,单位是秒
print(video_clip.duration) # 155.12 # 获取大小,可以直接使用os模块
import os
# 大概16兆
print(os.stat(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv").st_size) # 16852110
print(os.stat(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv").st_size / 1024 ** 2) # 16.07142448425293

视频合成

视频合成有两种方式:

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

from moviepy import editor
video_clip = editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv") # 截取10到20秒
video_clip1 = video_clip.subclip(10, 20)
# 截取1分45秒到结尾的前两秒
video_clip2 = video_clip.subclip((1, 45), -2)
# 然后前后拼接起来
clip = editor.concatenate_videoclips([video_clip1, video_clip2])
# 使用jupyter进行展示,设置一个宽度
clip.ipython_display(width=360)

此时视频就展示在jupyter上了,而且是两个视频拼接在一起的。并且在concatenate_videoclips中还可以指定一个transition参数(也是一个VideoFileClip对象),作为衔接之间的过渡。

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

from moviepy import editor

videos = ["1.mp4", "2.mp4", "3.flv", "4.mp4", "5.flv"]
clips = []
for video in videos:
clips.append(editor.VideoFileClip(video)) editor.concatenate_videoclips(clips).write_videofile("xxx.mp4")

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

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

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

from moviepy import editor
# margin: 设置外边距
video_clip = editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv").margin(10) video_clip1 = video_clip.subclip(10, 20)
# editor.vfx.mirror_x: x轴镜像
video_clip2 = video_clip1.fx(editor.vfx.mirror_x)
# editor.vfx.mirror_y: y轴镜像
video_clip3 = video_clip1.fx(editor.vfx.mirror_y)
# resize: 等比缩放
video_clip4 = video_clip1.resize(0.8)
# 列表里面有两个列表,所以会将屏幕上下等分
# 上半部分显示video_clip1, video_clip2,下半部分显示video_clip3, video_clip4
clip = editor.clips_array([[video_clip1, video_clip2], [video_clip3, video_clip4]])
clip.ipython_display(width=600)

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

修改视频属性

from moviepy import editor

clip = editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!! 翻唱.flv").subclip(10, 20)

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

视频音频合成

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

from moviepy import editor

clipA = editor.VideoFileClip(r"A.mp4")
clipB = editor.VideoFileClip(r"B.mp4") # 获取B的音频
audioB = clipB.audio # 将B的音频和A组合起来
clipA = clipA.set_audio(audioB)
# 然后保存即可 # 或者我们也可以直接加载一个音频
audio = editor.AudioFileClip("b.mp3")

python连接activemq的更多相关文章

  1. python使用stomp连接activemq

    一.安装ActiveMQ服务 1. 当使用windows时,安装参考:https://blog.csdn.net/WuLex/article/details/78323811 启动:运行activem ...

  2. 【初学python】使用python连接mysql数据查询结果并显示

    因为测试工作经常需要与后台数据库进行数据比较和统计,所以采用python编写连接数据库脚本方便测试,提高工作效率,脚本如下(python连接mysql需要引入第三方库MySQLdb,百度下载安装) # ...

  3. python连接mysql的驱动

    对于py2.7的朋友,直接可以用MySQLdb去连接,但是MySQLdb不支持python3.x.这是需要注意的~ 那应该用什么python连接mysql的驱动呢,在stackoverflow上有人解 ...

  4. paip. 解决php 以及 python 连接access无效的参数量。参数不足,期待是 1”的错误

    paip. 解决php 以及 python 连接access无效的参数量.参数不足,期待是 1"的错误 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源 ...

  5. python 连接sql server

    linux 下pymssql模块的安装 所需压缩包:pymssql-2.1.0.tar.bz2freetds-patched.tar.gz 安装: tar -xvf pymssql-2.1.0.tar ...

  6. paip.python连接mysql最佳实践o4

    paip.python连接mysql最佳实践o4 python连接mysql 还使用了不少时间...,相比php困难多了..麻烦的.. 而php,就容易的多兰.. python标准库没mysql库,只 ...

  7. 消费者端的Spring JMS 连接ActiveMQ接收生产者Oozie Server发送的Oozie作业执行结果

    一,介绍 Oozie是一个Hadoop工作流服务器,接收Client提交的作业(MapReduce作业)请求,并把该作业提交给MapReduce执行.同时,Oozie还可以实现消息通知功能,只要配置好 ...

  8. python连接字符串的方式

    发现Python连接字符串又是用的不顺手,影响速度 1.数字对字符进行拼接 s=""  #定义这个字符串,方便做连接 print type(s) for i in range(10 ...

  9. python连接zookeeper的日志问题

    用python连接zookeeper时,在终端里,一直会有zookeeper的日志冒出来,这样会很烦. -- ::,:(: Exceeded deadline by 11ms 解决方法是在连接后设置一 ...

随机推荐

  1. 如何选择K-Means中K的值

    K-Means需要设定一个簇心个数的参数,现实中,最常用于确定K数的方法, 其实还是人手工设定.例如,当我们决定将衣服做成几个码的时候,其实就是在以 人的衣服的长和宽为为特征进行聚类.所以,弄清楚我们 ...

  2. 物料主数据批导bapi

    创建物料主数据,根据模板不同批导原材料,半成品,成品.可根据实际需求对字段进行增删. report zmmr_bapi_mm01 no standard page HEADING. type-POOL ...

  3. 怎样提高js的编程能力

    1,学习js分几个阶段,没入门,入门初学者,中级水平,高级水平,ppt水平. 2,没入门的如何学习? 我当初是先学jquery,有css和html基础,有css基础看jq的语法很简单,就是选择符,jq ...

  4. uni-app编译配置

    Uni-app 编译配置 <!-- #ifdef H5 --> <view>只在H5编译</view> <!-- #endif --> <!-- ...

  5. PJzhang:今天才搞清身份证、银行卡……的编码规则

    猫宁!!! ​​   之前思考过常见证件的编码规则,抽空查了一下,发现挺有意思.   一般查询证件或者手机号归属地都是直接百度小工具,但是背后的查询机制如何,可能大多人不甚了解.   介绍几种生活中最 ...

  6. Java闭包和回调

    Java中的闭包与回调可以通过成员内部类来实现. 简单的来说闭包就是返回一个内部类对象,这个内部类对象包含了外部类对象的信息(因为一个内部类对象定依托于一个外部类对象). 回调就是在闭包的基础上实现的 ...

  7. android webview 添加内置对象

    package com.android.EBrowser; import android.app.Activity;import android.graphics.Rect;import androi ...

  8. Python报错module 'scipy.misc' has no attribute 'xxx'

    Python报错module 'scipy.misc' has no attribute 'imresize' 解决办法: 安装Pillow包,命令如下: pip install Pillow 然后重 ...

  9. 网页设计——HTML(3)布局基础

    为什么要布局? 网页布局,也就是如何安排网页的内容. 一个好的网页布局能够使人眼前一亮,吸引流量. 本篇文章中我们不讨论相关的设计理论,我们只对布局所用到的HTML知识进行学习. 几种简单的布局方式 ...

  10. Source 介绍

    !!!1.Avro Source 监听AVRO端口来接受来自外部AVRO客户端的事件流. 利用Avro Source可以实现多级流动.扇出流.扇入流等效果. 另外也可以接受通过flume提供的Avro ...