前言

生活中视频使用的场景越来越多,生活中不免会碰到要对视频进行处理。

现在的视频剪辑软件也非常好用,可以进行精细化制作,但是效率就低了许多,如果有很多视频要处理,那就需要非常多的时间去处理。

所以作为一个开发希望能通过程序来处理视频,即便不能达到使用剪辑软件效果那么好,也可以先对视频进行一次处理,可以减少不少时间,把时间花在真正需要精细调整的地方。

像普通的视频截取、添加文字、视频组合、设置音频这些简单的用程序来批量处理就非常高效了。

安装

要处理视频这里要用到 PythonMoviePy 这个库,它是基于 FFmpeg 的跨平台库。

使用之前和其它库一样要先安装,非常简单使用 pip 安装就行了

1
pip install moviepy

国内安装会比较慢,建议使用国内的镜像,像清华或者阿里的速度都不错。

处理流程

MoviePy 的一般处理流程是:

  1. 加载视频
  2. 处理(截取、设置声音、裁剪…)
  3. 保存处理后的视频

提取片段

根据上面的流程,在使用之前需要把视频加载到程序中,需要使用到 VideoFileClip ,把视频文件的路径当成参数传进去。

如果只想要其中一段,我们可以通过 sub_clip 方法进行截取,里面参数是开始截取的时间和停止截取的时间。

最后 VideoFileClipwrite_video_file 可以把处理过得程序保存到文件中,参数就是要保存的文件路径。

1
2
3
clip = VideoFileClip("input.mp4") # 加载视频
sub_clip = clip.subclip(6, 8) # 截取6s-8s的视频
sub_clip.write_videofile("output.mp4") # 保存道 output.mp4

添加文字

MoviePy 中文字使用 TextClip 表示,与视频不同的是,文字的属性比较多。

通常会为文字设置字体、大小颜色、还有时长,这些设置好了才会在视频中显示出来,在调试的过程中经常会发现文字不显示,很有可能就是这些忘记设置了。

来看下简单的往视频添加 你好,MoviePy 如何实现

1
2
3
4
5
clip = VideoFileClip("input.mp4")
text = TextClip("你好, MoviePy", fontsize=30, font="STKaiti", color="black") # 创建文本,并设置字体、颜色、大小
text = text.set_duration(clip.duration) # 设置文字显示时长
final_clip = CompositeVideoClip([clip, text]) # 把视频和文字混合
final_clip.write_videofile("output.mp4")

可以看到左上角多了 你好,MoviePy

组合多个视频

如果我们有多个视频想要把它们组合成一个可以通过 concatenate_videoclips 来合成,里面的参数就是我们需要组合的视频。

这里要注意,两个视频的尺寸大小要一样,不一样的话后面的会花掉。所以在组合之前最好把两个视频的尺寸大小调成一样。

这里使用的两个视频的尺寸是一样的,一个是没加文字之前的,另个一是加了文字的。

1
2
3
4
video1 = VideoFileClip("input1.mp4")
video2 = VideoFileClip("input2.mp4")
final_clip = concatenate_videoclips([video1, video2]) # 连接 input1.mp4 和 input2.mp4
final_clip.write_videofile("output.mp4")

提取音频

碰到一个喜欢的视频,想要提取其中的音频怎么办?

MoviePy 中视频的对象是 VideoFileClip ,而音频对应的是 AudioFileClip ,视频包含了音频所以在 VideoFileClip 中有 audio 属性,它就是对应的音频,我们可以直接把他保存下来,就得到了对应的音频。

与保存视频类似,保存音频的方法是 write_audiofile

1
2
3
clip = VideoFileClip("input.mp4")
audio = clip.audio # 提取音频
audio.write_audiofile("output.mp3") # 保存音频到output.mp3

更改音频

有了上面的经验,更改音频就很简单了,我们只要用自己的音频文件把视频中的替换掉就可以了。

如果音频和视频的时长不一样,需要设置一下音频的时长,不然视频播完了,后面的画面是黑的。

1
2
3
4
5
clip = VideoFileClip("input.mp4")
audio = AudioFileClip("input.mp3") # 加载要替换的音频
audio = audio.set_duration(clip.duration) # 设置音频的时长和视频一样,避免视频播完之后黑屏
final_clip = clip.set_audio(audio) # 把音频替换成我们加载的
final_clip.write_videofile("output.mp4")

参考

关注公众号[devbins],回复[moviepy]获取源码