python用moviepy对视频进行简单的处理
楔子
随着自媒体时代,现在对视频的处理变得越来越常见。我们可以使用Adobe的一些专业工具,但是效率不高;如果只是对视频进行一些简单的处理的话,或者视频的数量非常多的话,那么使用专业软件显然就不太适合了。
而python中有专门用于处理视频的库:moviepy,可以非常方便地对视频进行一些简单处理,下面我们就来看一看。
首先是安装:pipinstallmoviepy -ihttps://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是怎么操作视频的。
frommoviepyimporteditor #调用`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,littleangel",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:MoviePyError:creationofNonefailedbecauseofthefollowingerror: [WinError2]系统找不到指定的文件。. .ThiserrorcanbeduetothefactthatImageMagickisnotinstalledonyourcomputer, or(forWindowsusers)thatyoudidn'tspecifythepathtotheImageMagickbinaryinfileconf.py, orthatthepathyouspecifiedisincorrect 这个错误是由于你的电脑上缺少ImageMagick造成的,我们需要去http://www.imagemagick.org/script/download.php 这个网站上下载对应操作系统的ImageMagick,我这里是Windows。可能下载的比较慢,毕竟是外网。 如果觉得速度无法忍受的话,我提供了相应了网盘链接:链接:https://pan.baidu.com/s/1n1xNohD7V-abQbX81UENJQ提取码:usl3,可以进行保存下载 下载完毕之后,直接安装在指定的目录。 然后修改site-packages\moviepy\config_defaults.py,在文件的尾部有如下内容: importos FFMPEG_BINARY=os.getenv('FFMPEG_BINARY','ffmpeg-imageio') IMAGEMAGICK_BINARY=os.getenv('IMAGEMAGICK_BINARY','auto-detect') 我们把`IMAGEMAGICK_BINARY=`后面的内容,换成你刚才ImageMagick的安装路径下magick.exe的绝对路径: importos 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,或者jupyternotebook进行展示。为了方便,我们后面就使用jupyternotebook。
视频属性
我们说一个视频,肯定有大小、宽高、fps、时长等等属性,下面我们就来看看如何获取这些属性。
frommoviepyimporteditor #调用`VideoFileClip(文件名)`即可将视频加载进来 #可以读取各种格式的视频文件 video_clip=editor.VideoFileClip(r"C:\Users\satori\Desktop\警察蜀黍!!!就是这个人!!!!翻唱.flv") #获取宽度和高度 print(video_clip.size)#[800,600] print(video_clip.w,video_clip.h)#800600 #获取fps print(video_clip.fps)#23.976023976023978 #获取时长,单位是秒 print(video_clip.duration)#155.12 #获取大小,可以直接使用os模块 importos #大概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.多个视频按照先后顺序拼接起来。比如一个一分钟和一个两分钟的视频组合起来,变成三分钟。
frommoviepyimporteditor 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个视频,如果只是简单的前后拼接就可以这么做。
frommoviepyimporteditor videos=["1.mp4","2.mp4","3.flv","4.mp4","5.flv"] clips=[] forvideoinvideos: clips.append(editor.VideoFileClip(video)) editor.concatenate_videoclips(clips).write_videofile("xxx.mp4")
这里值得一提的是,多个clip进行拼接,并不需要这些clip之间有相同的尺寸、时长什么的,仅仅是将它们按照顺序拼接起来而已。
另外,当你用jupyter进行展示时,视频不要过长,否则报错。当然你也可以给ipython_display函数传递一个maxduration参数,让它支持显示更大时长的视频文件。但是注意:如果文件过大,在jupyter上可能会耗光你的内存。
2.多个视频在同一个画面上显示
frommoviepyimporteditor #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是将多个视频同时显示在一个画面里面。
修改视频属性
frommoviepyimporteditor 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组合起来,怎么做呢?
frommoviepyimporteditor 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对视频进行简单的处理的详细内容,更多关于pythonmoviepy对视频处理的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。