5

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

 1 year ago
source link: https://blog.51cto.com/micai01/5840783
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

推荐 原创

迷彩编程 2022-11-10 13:31:24 博主文章分类:Python ©著作权

文章标签 ide python 封装 视频剪辑 自动化 文章分类 Python 编程语言 阅读数433

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

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

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

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

如何解决我们等会介绍.

需要安装的库

​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​

否则就会报以下错误:

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

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

​pip3 install moviepy --ignore-install imageio_ffmpeg​

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

成功安装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')
体验 Python 剪辑视频以及相关问题解决, 一劳永逸!_视频剪辑_06

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

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')

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

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

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

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

TKinter属性介绍

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

比如 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()
体验 Python 剪辑视频以及相关问题解决, 一劳永逸!_封装_12
体验 Python 剪辑视频以及相关问题解决, 一劳永逸!_ide_13

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

然后通过messagebox提示

体验 Python 剪辑视频以及相关问题解决, 一劳永逸!_视频剪辑_15
import tkinter.messagebox

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK