Python中利用moviepy对视频进行剪辑以及拼接

Posted una_mattina7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中利用moviepy对视频进行剪辑以及拼接相关的知识,希望对你有一定的参考价值。

MoviePy是一个用于视频编辑的Python模块,它可被用于一些基本操作(如剪切、拼接、插入标题)、视频合成(即非线性编辑)、视频处理和创建高级特效。它可对大多数常见视频格式进行读写,包括GIF。

一:安装moviepy

pip安装方式:如果你安装了pip,只需要在终端输入如下命令即可

pip install moviepy

二:截取视频

截取视频主要使用的是 subclip 方法,新建一个python脚本,在其中添加如下内容:

from moviepy.editor import *
import time
clip = VideoFileClip('./video.mp4').subclip(0,7, 20)
new_file =  'new_video.mp4'
clip.write_videofile(new_file)

其中,subclip(t_start,t_end) 方法中的时间参数可以用 (t_start=7) 以秒的时间来表示,也可以用 (t_start=(7,20)) ,以7分20秒的形式来表示,还可以 (t_start=(0,7,20))小时: 分钟: 秒的形式表示, t_end 的默认值就是视频的长度

三:拼接视频

视频拼接我们使用concatenate_videoclips函数来完成

from moviepy.editor import VideoFileClip, concatenate_videoclips
 
clip1 = VideoFileClip("video.mp4")
clip2 = VideoFileClip("video2.mp4").subclip(10,20)
clip3 = VideoFileClip("video3.mp4")
 
finalclip = concatenate_videoclips([clip1, clip2, clip3])
finalclip.write_videofile("concatenate.mp4")

finalclip会按照clip1,clip2,clip3的顺序将这三个clip播放,不加subclip函数默认为整个视频。这些clip并不需要相同的时长或者大小,仅仅是首尾相连而已,同时,如果各剪辑尺寸不同,那么它们将被居中播放

四:去掉视频中的声音

去除声音主要用到without_audio()函数

from moviepy.editor import *

video = VideoFileClip('video.mp4')
video = video.without_audio()
video.write_videofile('asonant_video.mp4')

五:设置视频倍速播放

倍速调用 speedx() 方法,其中设置要加速到的倍数

from moviepy.editor import *
clip = VideoFileClip('./video.mp4')

video = clip.speedx(2)
video.write_videofile('video2.mp4')

六:提取视频中的音频内容

如果想要把目标视频中的某段音频截取出来,可以使用如下代码

from moviepy.editor import *

clip = VideoFileClip('./video').subclip(10, 20)

audioclip1 = clip.audio  # 从视频对象中提取音频
audioclip1.write_audiofile('a.mp3')  # 写入音频文件

七:视频堆叠

当多个视频进行合成时,除了使用上面的视频拼接,还可以使用clip_array函数对视频进行堆叠操作,我们设置如下四种不同的视频展现方式:

from moviepy.editor import VideoFileClip, clips_array, vfx
clip1 = VideoFileClip("myvideo.mp4").margin(10) # 增加10px轮廓
clip2 = clip1.fx( vfx.mirror_x)#x轴镜像
clip3 = clip1.fx( vfx.mirror_y)#y轴镜像
clip4 = clip1.resize(0.60) # 尺寸等比例缩放 60%
final_clip = clips_array([[clip1, clip2],
                          [clip3, clip4]])
final_clip.resize(width=480).write_videofile("my_stack.mp4")

 从而你可以获得一个看起来是这样的画面:

体验 Python 剪辑视频以及相关问题解决, 一劳永逸!

前言

对于使用Python对视频进行剪辑我们最常用的就是Moviepy,我之前也写过一篇​​《必杀技 -- 使用 FFmpeg 命令快速精准剪切视频》​​,这篇文章单纯使用的是FFmpeg,他是通过FFmpeg命令的方式进行视频剪辑,从安装moviepy的截图中可以看到,其实moviepy对视频的剪辑也是使用FFmpeg对视频进行剪辑操作。

体验

从截图中可以看出,moviepy安装的同时需要安装decorator、tqdm、numpy、imageio以及imageio_ffmpeg这些依赖.其中imageio_ffmpeg就是处理视频数据的支撑,当使用imageio读写视频时,其会调用imageio_ffmpeg包以使用ffmpeg对视频进行相关的剪辑操作,不过imageio_ffmpeg的安装可能会出现如下问题

体验

如何解决我们等会介绍.

准备

需要安装的库

​pip install Moviepy​​(这是我们的主角)

既然说到剪辑,怎么少得了操作界面,毕竟对不会编程或者不想敲命令的童鞋来说体验不太好,所以需要封装成可视化操作,GUI库我们常用的有PyQt5,wxPython,TKinter.我们这里为了省事直接使用tkinter,tkinter模块是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

如果你的Python库中没有tkinter,那就是使用下面的命令安装,使用线程安全的方式安装:

​pip install threadsafe-tkinter​

否则就会报以下错误:

体验

我们上面说的安装moviepy报错,主要是由于imageio_ffmpeg无法安装成功导致的,我们可以先忽略他,后面单独安装,主要是因为下载超时所导致,后面单独下载,如果一次不行多尝试几次.而且我使用Git CMD安装成功的,使用系统自带的CMD一直下载超时.​​pip3 install imageio-ffmpeg​​如下图所示:

​pip3 install moviepy --ignore-install imageio_ffmpeg​

体验

体验

成功安装imageio_ffmpeg之后就能成功安装我们的主角moviepy

注意:imageio_ffmpeg版本一定要安装和系统对应的版本,我的系统是64位,所以后面是win_amd64

小试牛刀

视频剪辑

from moviepy.editor import *
clip = VideoFileClip(Rec 0068.mp4).subclip(2,4)
# 存储剪辑好的视频
clip.write_videofile(Rec2.mp4)

体验

体验

视频合并

from moviepy.editor import VideoFileClip,concatenate_videoclips
#待合并的视频
clip_1 = VideoFileClip(__temp__.mp4)
clip_2 = VideoFileClip(2.mp4)
#使用concatenate_videoclips进行合并
file = concatenate_videoclips([clip_1,clip_2])
# 存储合并好的视频
file.write_videofile(save.mp4)

体验

体验

体验

前面我们已经体验了moviepy的剪辑,接下来进行封装到tk中,进行可视化操作

TKinter属性介绍

体验

比如 Label:

Label:标签控件,可以显示文本

# win:父窗体
# text:显示的文本内容
# bg:背景色
# fg:字体颜色
# font:字体
# wraplength:指定text文本中多宽之后换行
# justify:设置换行后的对齐方式
# anchor:位置 n北,e东,w西,s南,center居中;还可以写在一起:ne东北方向
#width设置标签宽度,默认值是 0,自动计算,单位以像素计。
......

封装剪辑功能到GUI

这里button的传参使用的lambda:func(...)的方式

from moviepy.editor import *
import tkinter as tk

def clipvideo(origin, t1, t2, savedir):
print("开始剪辑")

print(origin)
print(t1)
print(t2)
print(savedir)
clip = VideoFileClip(origin).subclip(t1, t2)
# 存储剪辑好的视频
clip.write_videofile(savedir)
#你的剪辑代码
print("结束")

if(__name__=="__main__"):
# 创建窗口
win = tk.Tk()
# 窗口标题
win.title(剪辑视频)
# 设置大小和位置
# 窗口大小
win.geometry(680x300)
# 窗口的初始位置
win.geometry(+300+200)
#上面两句可以合并成一句
#win.geometry("680x300+300+200") #680 300为窗口大小,+300 +200 定义窗口弹出时的默认展示位置

# 标签的控件 也可以自己指定字体
label_1 = tk.Label(win, text=输入原视频文件地址, font=("黑体", 20), fg=black)
label_1.grid(row=0)
label_2 = tk.Label(win, text=开始时间(s), font=("黑体", 20), fg=black)
label_2.grid(row=2)
label_3 = tk.Label(win, text=结束时间(s), font=("黑体", 20), fg=black)
label_3.grid(row=4)
label_4 = tk.Label(win, text=剪辑后视频保存地址, font=("黑体", 20), fg=black)
label_4.grid(row=6)
# 输入框
enter_1 = tk.Entry(win, font=("黑体", 20))
enter_2 = tk.Entry(win, font=("黑体", 20))
enter_3 = tk.Entry(win, font=("黑体", 20))
enter_4 = tk.Entry(win, font=("黑体", 20))


# 设置输入框的位置
enter_1.grid(row=0, column=1)
enter_2.grid(row=2, column=1)
enter_3.grid(row=4, column=1)
enter_4.grid(row=6, column=1)

# 剪辑按钮 填写完输入框,点击按钮完成剪辑
button = tk.Button(win, text=开始剪辑, font=("黑体", 20), command=lambda: clipvideo(enter_1.get(), enter_2.get(), enter_3.get(), enter_4.get()))
# 设置按钮的位置
button.grid(row=10, column=1)
# 显示窗口
win.mainloop()

体验

体验

体验

然后通过messagebox提示

体验

import tkinter.messagebox

def jianjivideo(origin, t1, t2, savedir):
... ...
tkinter.messagebox.showinfo("提示", "完成剪辑!")

总结

需要注意几个相关库的安装,特别是moviepy及其依赖的安装,他的成功安装是实现剪辑视频的关键

上面只是抛转引玉,运用Python进行视频剪辑还有更多高级的操作,而且Python能够对批量处理,减少了重复机械且枯燥的工作

以上是关于Python中利用moviepy对视频进行剪辑以及拼接的主要内容,如果未能解决你的问题,请参考以下文章

Moviepy+OpenCV-python 结合进行音视频剪辑处理的一种建议模式

python也能玩视频剪辑!moviepy操作记录总结

视频剪辑什么鬼?Python 带你高效进行视频切割

PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件

视频剪辑什么鬼?Python 带你高效创作短视频

OpenCV-Python+Moviepy 结合进行视频特效处理