处理视频是一个常见的需求。那么在python中如何用代码处理视频呢?最近我无意间发现了一个很好用的python视频处理库moviepy,其使用起来简单易用,而且功能比较强大,这里记录一下分享给大家。

What is moviepy?

以下的介绍来自moviepy的官方文档。

moviepy是一个用于视频编辑的python模块,其可以用来对视频进行一些基础的操作(比如剪切,连接,插入标题等),视频创作(比如非线性编辑),视频处理以及给视频增加一些炫酷的特效等。它可以读写大多数常见的视频格式,包括GIF。

How to install moviepy?

moviepy的安装非常简单,直接使用命令pip install moviepy即可。当然你也可以选择从源码安装,下载源码包,解压缩,然后切换到含有setup.py的目录,执行 python setup.py install 即可。

moviepy的底层依赖于Numpy(用于高效数值处理),imageio(图像处理), Decorator,tqdm(用于显示进度条)。它在Windows/Mac/Unix环境下应该都是可以工作的,支持python2.7+以及python3。moviepy底层的视频读写依赖于ffmpeg,它会在你安装moviepy的时候自动下载,如果你已经安装了ffmpeg或者想使用特定版本的ffmpeg,你可以从moviepy/config_defaults.py中指定。

需要注意的是,还有一些可选模块可以安装,比如ImageMagic。这是一个开源的图像处理库,支持对超过200种格式的图像进行编辑处理,详细的用法可以自行参考官网文档。如果你希望向视频中添加文字,就必须安装这个库。它也可以作为生成GIF的后端,但不是必须的。如果你在Windows下安装这个库就比较简单,可以直接使用可执行文件安装;如果是Unix用户,可以选择源码编译安装,官网文档有详细的说明,不再赘述。

When to use moviepy?

如果你属于以下情况,可以考虑使用moviepy:

你有很多视频需要处理,或者你需要用很复杂的方式处理;

你希望在web服务器上自动生成videos或者GIF(Django,Flask等);

你希望能够自动化一些冗长乏味的工作,比如插入标题,图像场景分割,做一些视频结尾的特效,添加副标题等;

你希望可以使用code实现一些新奇的,其他视频编辑软件都无法做到的特效;

你希望可以从其他python库(比如matplotlib,mayavi,gizeh,scikit-images等)生成的图像中生成动画。

如果你是属于下面的这些情况,使用moviepy未必是最好的选择:

你仅仅需要做逐帧的视频分析(比如面部检测等),这种情况下你也是可以使用moviepy的,但是更建议使用imageio,opencv,simplecv等,因为这些库就是专门干这件事情的。

你仅仅想对视频进行转化,或者想把一系列的图片转化为视频,你最好直接使用ffmpeg(或者avconv,mencoder等),因为这些工具做这些转化会更快,而且更省内存。

moviepy的优点和缺点

优点:

简单和直观。基础的操作一行代码就可以搞定,对于新手来说非常友好。

灵活。你对于视频或者音频的每一帧都有着完全的控制权,创作你自己的特效非常容易。

便携。代码主要依赖numpy和ffmpeg(这两者都是跨平台的),所以moviepy几乎可以在所有的平台以及几乎所有的python版本上运行。

局限性:

无法处理视频流。比如无法实时处理来自摄像头的视频流等。当然,本来这就不是moviepy定位要解决的问题。

*处理大量视频,音频可能会很吃力**。在同时处理大量(>100)的视频,音频,图片的时候可能会有内存问题,这个后面应该会修复。

Basic operations of moviepy

Example code

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# Import everything needed to edit video clips

from moviepy.editorimport *

# Load girl.mp4 and select the subclip 00:00:00 – 00:00:02

clip = VideoFileClip(“sources/girl.mp4”).subclip(0,2)

# Reduce the audio volume (volume x 0.8)

clip = clip.volumex(0.8)

# Generate a text clip. You can customize the font, color, etc.

txt_clip = TextClip(“beautiful girl”,fontsize=20,color=‘red’)

# Say that you want it to appear 1.5s at the center of the screen

txt_clip = txt_clip.set_pos(‘top’).set_duration(1.5)

# Overlay the text clip on the first video clip

video = CompositeVideoClip([clip, txt_clip])

# Write the result to a file (many options available !)

video.write_videofile(“sources/girl_edited.mp4”)

How moviepy works?

moviepy底层使用ffmpeg读取和导出视频以及音频文件。它使用ImageMagic对视频插入文字以及生成GIF(可选)。对于不同的媒体文件的处理是通过python高效的数值计算库numpy来完成的。一些特效处理等使用到了python的图像处理库比如PIL,scikit-images以及科学计算库scipy等。下图1简单说明了moviepy的工作流程:

 图1

关于moviepy的一些基础概念。moviepy的核心概念是clips,可以是AudioCLips 和 VideoClips 。这些clips可以被修改(剪切,降低播放速度,调整亮度等)或者和其他的clips混合到一起组成新的clips。然后这些clips可以通过pygame或者Ipython(jupyter notebook)预览,或者导出为videos文件或者GIF。VideoClips可以通过一个视频文件,图像文件或者文字以及动画来创建,这些VideoClips还可以有音轨(audio track)即 AudioCLips以及mask(这种一种特殊的VideoClips,当其他的clips混合在一起的时候,这个mask决定哪些clips可以显示出来)。具体操作下面我们主要以代码的形式展示。

3.Show how use moviepy with codes

在进行下面的实验之前,你最好准备一些短小的视频以及音频片段(可以随意从网络下载)。

下面是我们使用到的一些视频,音频文件。

视频播放器

00:00

00:03

视频1 girl.mp4

视频播放器

00:00

00:05

视频2 xq.mp4

视频播放器

00:14

00:14

视频3 dogs.mp4

音频播放器

音频1 22.mp3

堆叠和连接clips

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/usr/bin/env python3

# encoding: utf-8

“”“

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: concate_videos.py

@time: 2018/05/19 14:26

@description:

concate two or more videos,reference:http://zulko.github.io/moviepy/getting_started/compositing.html

““”

frommoviepy.editorimportVideoFileClip,concatenate_videoclips

clip1 = VideoFileClip(“sources/girl.mp4”)

clip2 = VideoFileClip(“sources/xq.mp4”)

# concatenate two clips

final_clip = concatenate_videoclips([clip1,clip2],method=‘compose’)

# save to file

final_clip.write_videofile(“sources/concatenate.mp4”)

上面代码的意图应该是很明显了,就是将两个视频(VideoCLip)顺序连接到一起,连接之后得到的视频concatenate.mp4如下:

视频播放器

00:07

00:08

视频4 concatenate.mp4

clip_array的使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: clip_array.py

@time: 2018/05/19 14:38

@description:

stacking is done by clips_array

“””

from moviepy.editorimport VideoFileClip,clips_array,vfx

clip1 = VideoFileClip(“sources/xq.mp4”).margin(10) # 增加10piexl的边框

clip2 = clip1.fx(vfx.mirror_x) # 水平翻转

clip3 = clip1.fx(vfx.mirror_y) # 垂直翻转

# downsize to 60% size

clip4 = clip1.resize(0.6)

# stack all videos together like arrays

final_clip = clips_array([[clip1,clip2],

[clip3,clip4]

]

)

final_clip.resize(width=480).write_videofile(“sources/stack.mp4”)

上面的代码得到的视频如下:

视频播放器

00:00

00:05

视频5 stack.mp4

CompositeVideoClips

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: CompositeVideoClips.py

@time: 2018/05/19 14:51

@description:

CompositeVideoClip class,play sevral videos together

“””

from moviepy.editorimport VideoFileClip,CompositeVideoClip

clip1 = VideoFileClip(“sources/xq.mp4”)

clip2 = VideoFileClip(“sources/girl.mp4”).set_position(“left”).set_start(3).crossfadein(1)

clip3 = VideoFileClip(“sources/dogs.mp4”).set_position(“right”).set_start(6).crossfadein(2)

final_clip = CompositeVideoClip([clip1,clip2,clip3])

final_clip.write_videofile(“sources/composite.mp4”)

上面的代码还是将三个clip组合到一起形成一个新的clip,只不过这次对每一个clip都做了一些操作,比如上面的 set_start 方法就是设置视频开始播放的时间, set_position 是设置clip的位置, crossfadein 是设置连接视频渐变的时间,还有很多其他的方法可以具体参考文档,使用这些方法,我们就可以将视频剪辑的更加丰富多彩,符合我们的要求。上面得到的视频如下:

视频播放器

00:11

00:20

视频6 composite.mp4

Compositing audio clips

我们还可以使用moviepy对音频进行编辑以及给视频添加音频,一个实例代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: set_methods.py

@time: 2018/05/19 15:16

@description:

set_xxx methods

“””

from moviepy.editorimport VideoFileClip,AudioFileClip,vfx

clip = VideoFileClip(“sources/xq.mp4”)

# create a audio clip

aclip = AudioFileClip(“sources/22.mp3”).subclip(50,55)

aclip.write_audiofile(“sources/22_clip.mp3”)

# 设置音频

clip = clip.set_audio(aclip) # 注意一定要赋值,否则不会有任何改变

# 1s 以后开始

clip = clip.set_start(1)

# 设置持续时间为3s

clip = clip.set_duration(3)

clip.write_videofile(“sources/set_xq.mp4”)

# 设置宽度,设置颜色变为更暗,速度变为原来的两倍

clip1 = clip.fx(vfx.resize,width=360).fx(vfx.colorx,0.5).fx(vfx.speedx,2)

clip1.write_videofile(“sources/xq1.mp4”)

上面的代码逻辑不难理解。首先构建了一个 VideoClip 对象,然后使用 subclip 方法截取音频50-55秒,然后保存为新的音频文件。接着对视频clip对象采用 set_audio 方法设置audio track,这里需要注意的是clip的很多方法都是采用”流式”操作,即 clip.set_xxx 放回的仍然是一个clip,因此可以连续使用set_xxx方法,所以需要注意使用set_xxx之后需要将结果保存到一个新的对象,否则设置是无效的。最后需要注意 clip.fx 是通用的设置clip的方法,具体用法可以查看文档。经过上面一系列的处理之后,得到的音频、视频文件如下:

音频播放器

音频2 22_clip.mp3

视频播放器

00:00

00:03

视频7 set_xq.mp4

视频播放器

00:00

00:02

视频8 xq1.mp4

Methods to create custom effects

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: change_attribute.py

@time: 2018/05/19 15:43

@description:

change video attribute

“””

from moviepy.editorimport VideoFileClip

from math import sin

clip = VideoFileClip(“sources/xq.mp4”)

# make video 3 times faster

clip1 = clip.fl_time(lambda x:3*x).set_duration(3)

# 按照正弦timeline 播放,视频播放会非常抖动

clip2 = clip.fl_time(lambda x:1+sin(x)).set_duration(3)

clip1.write_videofile(“sources/xq2.mp4”)

clip2.write_videofile(“sources/xq3.mp4”)

def invert_green_blue(image):

”’

将图片的green channel 和 blue channel 转换

:param image: input image

:return: new image

”’

return image[:,:,[0,2,1]]

clip3 = clip.fl_image(image_func=invert_green_blue)

clip3.write_videofile(“sources/xq4.mp4”)

def scroll(get_frame, t):

“””

This function returns a ‘region’ of the current frame.

The position of this region depends on the time.

“””

frame = get_frame(t)

frame_region = frame[int(20*t):int(20*t)+100,:] # 得到部分区域

return frame_region

clip4 = clip.fl(fun=scroll)

clip4.write_videofile(“sources/xq5.mp4”)

上面的代码展示了如何使用clip的 fl 和 fl_time 以及 fl_image 方法来生成一些特效。

fl_time方法接收一个函数,对video的时间轴进行修改,该函数接收的是视频的时间属性t,所以上面的clip.fl_time(lambdax:3*x) 会让视频的播放速度加快3倍,而

clip.fl_time(lambdax:1+sin(x)) 则让视频按照正弦的timeline播放,视频会有些抖动。 fl_image 对视频每一帧图像进行修改,其接收的也是一个函数作为参数,该函数的参数为image(ndarray),所以上面的 invert_green_blue 函数做的工作就是将图片的green channel 和 blue channel 转换。而 fl函数是一个更一般的函数,其也是接收一个函数作为参数,该函数的参数有两个,一个是 get_frame 函数,一个是当前帧的时间t,函数需要返回一个image(ndarray),而不难看出上面的scroll 函数就是让视频随着时间的变化在水平方向向下移(展示图片的一部分,高度始终不变),在竖直方向上不改变。这里只展示得到的xq4.mp4和xq5.mp4这两个视频。

视频播放器

00:00

00:05

视频9 xq4.mp4

视频播放器

00:00

00:05

视频10 xq5.mp4

Show and preview

在剪辑视频的时候,对于一些复杂的操作,我们很难一下就完成,往往需要多次尝试,调整,才能得到一个更好的结果。如果我们每次都把操作的结果导出到视频然后再打开查看,可以想象这是多么麻烦的一件事情。特别是当视频比较长的时候,也很浪费时间。所以我们要是能一边处理一边预览就好了。虽然moviepy没有GUI界面,但是仍然可以通过pygame以及Ipython进行预览。

通过pygame进行预览

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: clip_show.py

@time: 2018/05/19 16:15

@description:

show clip images

“””

from moviepy.editorimport VideoFileClip

clip = VideoFileClip(“sources/dogs.mp4”)

# show the first frame

clip.show()

# show the frame at 2 seconds

# 开启交互模式

clip.show(2,interactive = True)

# save the first frame

clip.save_frame(“sources/dogs1.jpg”)

# save the 3.5 seconds frame

clip.save_frame(“sources/dogs2.jpg”,t=3.5)

# preview the video that rotate 180 degree

clip.rotate(180).preview(audio = True,fps =25) # 不显示声音

要想通过pygame进行预览,首先你当然得到安装好pygame(pip install pygame)。上面其实主要展示了三个method:show(t) 用来展示视频在第t秒的帧图像, interactive=True 表示开启交互式模式。 save_frame(img,t) 表示将第t秒的帧图像保存到img。 preview(audio,fps) 就是预览视频的方法啦,audio参数可以设定要不要显示音频,fps参数用于设定帧速率。

使用Ipython进行预览

 图1 使用Ipython进行预览的小例子。

除了使用 clip.ipython_display() 这种方式之外,还可以使用 ipython_display(clip,autoplay=1,loop=1) 这种方式进行播放,这里 autoplay=1 表示自动播放, loop=1 表示无限循环播放。使用在ipython中预览的一个好处是视频是内嵌在浏览器里的,所以你可以直接携带的notebook文件进行演示,十分方便。但是这样做也有一个缺点,那就是当视频很大的时候,notebook文件的体积会变得非常大。

和matplotlib进行交互

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: matplotlib_animation.py

@time: 2018/05/19 17:05

@description:

make animation from matplotlib,reference:

http://zulko.github.io/moviepy/getting_started/working_with_matplotlib.html

“””

import matplotlib.pyplotas plt

import numpyas np

from moviepy.editorimport VideoClip

from moviepy.video.io.bindingsimport mplfig_to_npimage

x = np.linspace(–2, 2, 200)

duration = 2

fig, ax = plt.subplots()

def make_frame(t):

# t 是float,以秒作单位

ax.clear()

ax.plot(x, np.sinc(x**2) + np.sin(x + 2*np.pi/duration * t), lw=3)

ax.set_ylim(–1.5, 2.5)

# Converts a matplotlib figure to a RGB frame after updating the canvas

return mplfig_to_npimage(fig)

animation = VideoClip(make_frame, duration=duration)

animation.write_gif(‘sources/matplotlib.gif’, fps=20)

上面的代码展示了如何将matplotlib绘制的图像保存为GIF。首先导入 VideoClip(make_frame,duration) 类, make_frame是一个函数,这个函数默认参数为时间t,表示当前帧的时间,返回时间t时的image(ndarray)。这里自定义的make_frame函数利用matplotlib构造了一个随时间t变化的复杂函数,最后通过 mplfig_to_npimage 函数将matplotlib的fig对象转化为ndarray。要将clip保存为gif,直接使用

write_gif 函数即可。最后得到的matplotlib.gif如下:

 图2 matplotlib.gif

funny scripts using moviepy

最后展示一些使用moviepy写的有趣的脚本(主要来自官方给的demos)

moving circle(跳动的太阳)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: test_gizeh.py

@time: 2018/05/19 17:52

@description:

test for gizeh animation

“””

import gizeh

import moviepy.editoras mpy

def make_frame(t):

surface = gizeh.Surface(128,128) # width, height

radius = 100*(1+ (t*(2–t))**2 )/6 # the radius varies over time

circle = gizeh.circle(radius, xy = (64,64), fill=(1,0,0))

circle.draw(surface)

return surface.get_npimage() # returns a 8-bit RGB array

clip = mpy.VideoClip(make_frame, duration=2) # 2 seconds

clip.write_gif(“sources/circle.gif”,fps=15)

 图3 circle.gif

make videos from list of images

除了之前提到的使用 VideoClip 类可以将一系列的图片转化为视频之外,还有一个 ImageSequenceClip 类也可以实现这个功能。具体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: ImageSequenceClip.py

@time: 2018/05/19 17:15

@description:

create videos or gif from sequences of images

“””

import numpyas np

from glob import glob

from PILimport Image

from scipy.miscimport imresize,imsave

imgs = glob(“sources/images/*.jpg”)

def preprocess_imgs(imgs,size = (900,1200)):

”’

把所有的图片resize成相同大小

:param imgs: list of images names

:param size: resized size

:return: None

”’

for imgin imgs:

m = np.array(Image.open(img))

m = imresize(m,size)

imsave(img,m)

preprocess_imgs(imgs)

from moviepy.editorimport ImageSequenceClip

clip = ImageSequenceClip(imgs,fps=2)

# export gif

clip.write_gif(“sources/xq_new.gif”)

不难发现,使用 ImageSequenceClip更为简单一点,但是要求所有的图片必须具有相同的大小,上面的 preprocess_imgs函数就是将所有的图片resize成相同的大小。

moving letter(跳动的字母)

这个脚本实现了英文字母的跳动特效。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: moving_letters.py

@time: 2018/05/19 18:08

@description:

moving letters animation,reference:http://zulko.github.io/moviepy/examples/moving_letters.html

“””

import numpyas np

from moviepy.editorimport *

from moviepy.video.tools.segmentingimport findObjects

# WE CREATE THE TEXT THAT IS GOING TO MOVE, WE CENTER IT.

screensize = (720, 460)

text = “I love YP” # letters

# kerning = 5 表示使字母的间距在默认值的基础上增加5 pixel

txtClip = TextClip(text, color=‘white’, font=“Amiri-Bold”,

kerning=5, fontsize=100)

cvc = CompositeVideoClip([txtClip.set_pos(‘center’)],

size=screensize)

# THE NEXT FOUR FUNCTIONS DEFINE FOUR WAYS OF MOVING THE LETTERS

# 剩下的四个函数定义了四种移动字母的方式

# helper function

rotMatrix = lambda a: np.array([[np.cos(a), np.sin(a)],

[–np.sin(a), np.cos(a)]])

def vortex(screenpos, i, nletters):

d = lambda t: 1.0 / (0.3 + t ** 8)# damping

a = i * np.pi / nletters# angle of the movement

v = rotMatrix(a).dot([–1, 0])

if i % 2: v[1] = –v[1]

return lambda t: screenpos + 400 * d(t) * rotMatrix(0.5 * d(t) * a).dot(v)

def cascade(screenpos, i, nletters):

v = np.array([0, –1])

d = lambda t: 1 if t < 0 else abs(np.sinc(t) / (1 + t ** 4))

return lambda t: screenpos + v * 400 * d(t – 0.15 * i)

def arrive(screenpos, i, nletters):

v = np.array([–1, 0])

d = lambda t: max(0, 3 – 3 * t)

return lambda t: screenpos – 400 * v * d(t – 0.2 * i)

def vortexout(screenpos, i, nletters):

d = lambda t: max(0, t)# damping

a = i * np.pi / nletters# angle of the movement

v = rotMatrix(a).dot([–1, 0])

if i % 2: v[1] = –v[1]

return lambda t: screenpos + 400 * d(t – 0.1 * i) * rotMatrix(–0.2 * d(t) * a).dot(v)

# WE USE THE PLUGIN findObjects TO LOCATE AND SEPARATE EACH LETTER

letters = findObjects(cvc)# a list of ImageClips

# WE ANIMATE THE LETTERS

def moveLetters(letters, funcpos):

return [letter.set_pos(funcpos(letter.screenpos, i, len(letters)))

for i, letterin enumerate(letters)]

clips = [CompositeVideoClip(moveLetters(letters, funcpos),

size=screensize).subclip(0, 5)

for funcposin [vortex, cascade, arrive, vortexout]]

# WE CONCATENATE EVERYTHING AND WRITE TO A FILE

final_clip = concatenate_videoclips(clips)

final_clip.write_videofile(‘../sources/coolTextEffects.avi’, fps=25, codec=‘mpeg4’)

coolTextEffects 视频11 coolTextEffects.avi

the end effects

给视频的结尾增加”the end”字幕特效。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: add_end.py

@time: 2018/05/19 18:51

@description:

add ‘The end’ string at the end of video

“””

from moviepy.editorimport *

from moviepy.video.tools.drawingimport circle

# 返回实际上是一个全1的mask(完全不透明)

clip = VideoFileClip(“../sources/dogs.mp4”, audio=False). \

add_mask().subclip(3,8)

w, h = clip.size

# The mask is a circle with vanishing radius r(t) = 800-200*t

# color1:circle color

# color2:background color

# blur:a little blur

clip.mask.get_frame = lambda t: circle(screensize=(clip.w, clip.h),

center=(clip.w / 2, clip.h / 4),

radius=max(0, int(800 – 200 * t)),

col1=1, col2=0, blur=4)

the_end = TextClip(“The End”, font=“Amiri-bold”, color=“white”,

fontsize=70).set_duration(clip.duration)

final = CompositeVideoClip([the_end.set_pos(‘center’), clip],

size=clip.size)

final.write_videofile(“../sources/theEnd.mp4”)

视频播放器

00:00

00:05

视频12 theEnd.mp4

blur for videos

将图片的每一帧都变模糊(比如对视频的每一帧使用gaussian blur)。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#!/usr/bin/env python3

# encoding: utf-8

“””

@version: 0.1

@author: lyrichu

@license: Apache Licence

@contact: 919987476@qq.com

@site: http://www.github.com/Lyrichu

@file: blur_videos.py

@time: 2018/05/19 18:39

@description:

using gaussian blur to blur all video frames

“””

from skimage.filtersimport gaussian_filter

from moviepy.editorimport VideoFileClip

img_path = “./sources/xq.mp4”

clip = VideoFileClip(img_path)

def blur(img):

# gaussian blur for an image

return gaussian_filter(img.astype(“float”),sigma = 2)

clip_blur = clip.fl_image(blur)

clip_blur.write_videofile(“sources/xq_blur.mp4”)

python爬取视频自动播放_介绍一个python视频处理库:moviepy相关推荐

  1. python爬取百度百科表格_第一个python爬虫(python3爬取百度百科1000个页面)

    以下内容参考自:http://www.imooc.com/learn/563 一.爬虫简介 爬虫:一段自动抓取互联网信息的程序 爬虫可以从一个url出发,访问其所关联的所有的url.并从每个url指向 ...

  2. 编程python爬取网页数据教程_实例讲解Python爬取网页数据

    一.利用webbrowser.open()打开一个网站: >>> import webbrowser >>> webbrowser.open('http://i.f ...

  3. 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  4. python爬取网易云音乐_我用Python爬取了网易云音乐

    原标题:我用Python爬取了网易云音乐 来源:别动我的猫尾巴 headers需要进行修改,headers设置不对会被屏蔽导致爬取不成功.一个headers用久了也会爬取不成功 代码如下: impor ...

  5. python爬取网页公开数据_如何用Python爬取网页数据

    使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...

  6. python爬取b站数据_如果利用Python爬取B站上千万数据?B站直播都是大屌萌妹吗?...

    粉丝独白 说起热门的B站相信很多喜欢玩动漫的,看最有创意的Up主的同学一定非常熟悉.我突发奇想学Python这么久了,为啥不用Python爬取B站中我关注的人,已经关注的人他们关注的人,看看全站里面热 ...

  7. python爬取知乎评论_从零开始写Python爬虫 --- 爬虫应用:IT之家热门段子(评论)爬取...

    不知道这里有没有喜欢刷it之家的小伙伴,我反正每天早上醒来第一件事就是打开it之家,看看有没有新鲜的段子 逃~ 其实这次是要来抓取it之家的热门评论,因为数量较多(上万),所以我们这次采用MongoD ...

  8. python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)

    一.乱码问题描述 经常在爬虫或者一些操作的时候,经常会出现中文乱码等问题,如下 原因是源网页编码和爬取下来后的编码格式不一致 二.利用encode与decode解决乱码问题 字符串在Python内部的 ...

  9. python爬取知乎文章_大佬分享Python编程实现爬取知乎用户信息的例子

    有一天 , 我发现我心仪已久的妹子在朋友圈里分享了知乎专栏的文章 , 就知道她也刷知乎 . 如果在知乎上关注她 , 我就能知道 , 她最近关注什么 , 心里想些什么 , 了解了解她喜欢的方面 , 还能 ...

最新文章

  1. 使用MapReduce将HDFS数据导入Mysql
  2. android q升级名单,华为升级 Android Q 机型名单敲定 阵容庞大
  3. 分词消除歧义_角色标题消除歧义
  4. git checkout 单个文件_IntelliJ IDEA下的使用 Git
  5. oracle数据库连接名是什么,连接到Oracle数据库的几种命名方式
  6. Linux 禁用msi模式,禁用MSI模式支持
  7. core控制器属性注入的用处_asp.net-core – 如何使用Autofac和ASP.NET Core在控制器上启用属性注入?...
  8. 【java】Java运行时动态生成类几种方式
  9. python中的namespace
  10. 【JAVA程序设计】基本数据类型
  11. Mac如何彻底卸载Mysql
  12. 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系(2)...
  13. 山大计算机学院教务处,山东大学本科生院教务系统
  14. 驱动电路设计(光耦,达林顿管)
  15. 酒店短视频营销,是酒店获客引流的重点推广手段之一
  16. tkinter 小说编写器,文本编辑器,小说阅读器
  17. 【转载】常备JS操作
  18. 三元一次方程组例题_三元一次方程组习题及解答
  19. 网上传的很火的GIF图片
  20. 15.全文检索-ElasticSearch

热门文章

  1. Alibaba微服务整合SkyWalking实现应用性能监控
  2. mysql批量设置自增_mysql自增id怎么批量插入数据
  3. The books I have read...
  4. 女孩需要富养出来的优雅
  5. linux中gz文件怎么解压,Linux解压gz文件的命令使用教程及详解
  6. python下载pymysql_Python pymysql
  7. HTML实体符号记录
  8. hive中如何把unixtimestamp转成小时分钟
  9. 就在今天,微博服务器又双叒叕崩了,微博程序员需要缓口气!
  10. 调音师在演奏中的重要性