Skip to main content

moregeek program

体验 python 剪辑视频以及相关问题解决, 一劳永逸!_迷彩编程的博客-多极客编程

前言

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

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

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

体验 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 剪辑视频以及相关问题解决, 一劳永逸!_ide_03

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

​pip3 install moviepy --ignore-install imageio_ffmpeg​

体验 Python 剪辑视频以及相关问题解决, 一劳永逸!_ide_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 剪辑视频以及相关问题解决, 一劳永逸!_ide_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 剪辑视频以及相关问题解决, 一劳永逸!_python_09

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

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

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

然后通过messagebox提示

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

import tkinter.messagebox

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

总结

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

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

©著作权归作者所有:来自51CTO博客作者迷彩编程的原创作品,请联系作者获取转载授权,否则将追究法律责任

花式浪漫爱心代码,爱心树来啦_zhang_shiwei的博客-多极客编程

爱心代码如下:# coding=gbk"""作者:向阳逐梦@时间 : 2022/11/09 21:20"""import turtleimport randomdef love(x, y): # 在(x,y)处画爱心lalala lv = turtle.Turtle() lv.hideturtle() lv.up() lv.goto(x, y) # 定位到(x,y)

python matplotlib 画图神器_domi+1的博客-多极客编程

Matplotlib 是 Python 的一个绘图库。它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形。Matplotlib 和Matlab的绘图功能相似,但前者在图像渲染效果上尤佳matlab绘图参考:​​matlab输出仿真图​​​​1.基础知识(3) --Matlab绘制特殊的图形​​使用matplotlib请现在cmd安装该库 pip inst

django 时区问题处理_胡六六的博客-多极客编程

问题:存储、搜索、展示数据不一致。如何解决和处理那? 设置 ( Django 1.4 之后存在时区问题) # Django 设置 东八区 settings.py USE_TZ = True TIME_ZONE = 'Asia/Shanghai' 是否开启时区 使用 Django 开发项目,DateTime 存在跨区开启时区。否则,建议不开启时区,开启时区意味你要在。存储、查询、格式化DateT

python opencv 图像特效处理_domi+1的博客-多极客编程

最近处理视觉相关的项目,分享一下通过opencv的图像特效处理,原图镇楼1、灰度处理将cv2.imread()方法的第二参数设为0即可得到灰色图像。import cv2img0 = cv2.imread('1.jpg', 0)img1 = cv2.imread('1.jpg', 1)print(img0.shape)print(img1.shape)cv2.imshow('img0', img0)

python面向对象---类的基本使用_domi+1的博客-多极客编程

​✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 🍎个人主页:算法工程师的学习日志 1、面向对象类(class):是一种用来描述具有相同属性和方法的对象的集合。类变量:类变量在整个实例化的对象中是公用的。一般定义在类中且在函数体之外。方法:类中的函数数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。方法重写:如果从父类继承的方法不能满足子类的需求

python stylecloud制作酷炫的词云图_domi+1的博客-多极客编程

这周参加一个创新培训,结束后有个答辩需要制作ppt,为了更好的展示内容,想到用词云图。本文分享一下如何基于Python的stylecloud制作酷炫的词云图。stylecloud是wordcloud优化改良版,操作简单,直接调用。可以使用 Font Awesome 提供的免费图标更改词云的形状;通过 palettable 更改调色板以自定义风格,更改背景颜色;添加梯度使颜色按照特定方向流动。1、基

spring boot核心功能(二)_spring认证的博客-多极客编程

3. 简介Spring Profiles 提供了一种分离应用程序配置部分并使其仅在某些环境中可用的方法。任何​​@Component​​​,​​@Configuration​​​或​​@ConfigurationProperties​​​可以在​​@Profile​​加载时标记为限制,如下例所示:@Configuration(proxyBeanMethods = false)@Profile("p

洛谷b2078含k个三的数_wx634e9df1a3214的博客-多极客编程

自行体会如果实在不会,就调试一下#include<stdio.h>int main(){ long int m; int n,k,num=0; scanf("%ld %d", &m, &k); for (int i = 1; i <= 15; i++) { if (i == 1) { n = m % 10; if (n

花式浪漫爱心代码,爱心树来啦_zhang_shiwei的博客-多极客编程

爱心代码如下:# coding=gbk"""作者:向阳逐梦@时间 : 2022/11/09 21:20"""import turtleimport randomdef love(x, y): # 在(x,y)处画爱心lalala lv = turtle.Turtle() lv.hideturtle() lv.up() lv.goto(x, y) # 定位到(x,y)

为什么说mysql单表行数不要超过2000w?_wx630f055ce23fc的博客-多极客编程

作为在后端圈开车的多年老司机,是不是经常听到过,“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”,“你这个表数据都马上要到 2000w 了,难怪查询速度慢”这些名言民语就和 “群里只讨论技术,不开车,开车速度不要超过 120 码,否则自动踢群”,只听过,没试过,哈哈。下面我们就把车速踩到底,干到 180 码试试…….实验实验一把看看…建一张表CREATE

设计模式-单例模式(最全总结)_wx630f055ce23fc的博客-多极客编程

单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式是创建型模式。饿汉式单例模式在类加载的时候就马上初始化了,此时还没到运行时只是将打包的代码加载到内存的时候就初始化(也就是线程还没有出现以前这个时间段初始化单例对象),所以此时一定是线程安全的,也就不可能存在访问安全问题代码示例public class HungrySingleton { private st

初识c语言(5)_wx633bccf4c79a4的博客-多极客编程

if选择函数:int main(){ int a = 10; int b = 20; if (a < b) //注意if后面要加条件语句且条件语句后不能加“;” printf("a = %d\n ", a); else printf("b = %d\n", b); return 0;}如图:如图:加“;”。while的循环语句:int main(){ int i