python⽤moviepy对视频进⾏简单的处理
⽬录
楔⼦
moviepy的简单使⽤
⼀个⼩栗⼦
那么moviepy是如何⼯作的呢?
视频属性
视频合成
1.多个视频按照先后顺序拼接起来。⽐如⼀个⼀分钟和⼀个两分钟的视频组合起来,变成三分钟。
2.多个视频在同⼀个画⾯上显⽰
修改视频属性
视频⾳频合成
楔⼦
随着⾃媒体时代,现在对视频的处理变得越来越常见。我们可以使⽤Adobe的⼀些专业⼯具,但是效率不⾼;如果只是对视频进⾏⼀些简单的处理的话,或者视频的数量⾮常多的话,那么使⽤专业软件显然就不太适合了。
⽽python中有专门⽤于处理视频的库:moviepy,可以⾮常⽅便地对视频进⾏⼀些简单处理,下⾯我们就来看⼀看。
从这⾥我们也看到,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造成的,我们需要去/script/download.php
这个⽹站上下载对应操作系统的ImageMagick,我这⾥是Windows。可能下载的⽐较慢,毕竟是外⽹。
如果觉得速度⽆法忍受的话,我提供了相应了⽹盘链接: 链接:pan.baidu/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的安装路径下的绝对路径:
import os
FFMPEG_BINARY = os.getenv('FFMPEG_BINARY', 'ffmpeg-imageio')
IMAGEMAGICK_BINARY = r'E:\ImageMagick-7.0.'
"""
# 然后执⾏就没有问题了
我们看到此时⽂字就添加进去了,并且该视频只有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 = atenate_videoclips([video_clip1, video_clip2])
# 使⽤jupyter进⾏展⽰,设置⼀个宽度
clip.ipython_display(width=360)
此时视频就展⽰在jupyter上了,⽽且是两个视频拼接在⼀起的。并且在concatenate_videoclips中还可以指定⼀个transition参数(也是⼀个VideoFileClip对象),作为衔接之间的过渡。
还是⽐较简单的,假设我们有5个视频,如果只是简单的前后拼接就可以这么做。
from moviepy import editor
学python看谁的视频比较好
videos = ["1.mp4", "2.mp4", "3.flv", "4.mp4", "5.flv"]
clips = []
for video in videos:
clips.append(editor.VideoFileClip(video))
这⾥值得⼀提的是,多个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 = size(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(size, width=460) # 调整尺⼨,保持⽐例
.fx(editor.vfx.speedx, 2) # 调整倍数
.fx(lorx, 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⽤moviepy对视频进⾏简单的处理的详细内容,更多关于python moviepy对视频处理的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论