背景
人力资源部需要负责公司员工的培训工作,面下提供培训管理和信息发布收集,面上提供资源整合和数据分析。接到主管的新任务:应上级主观部门需要,收集所有培训视频,去除声音并提交数联网系统。能做视频剪辑的软件有很多,比如premiere、剪映等等,但是一个个视频去导入、消音、再导出实在是太痛苦了,还得是python来批量自动化操作。
目的
应对主管的新需求,拒绝傻瓜式重复操作,能偷懒就偷懒
应用
要使用Python进行自动化剪辑视频,您需要使用Python中的视频处理库—MoviePy:MoviePy是Python中的视频处理库,可以帮助您剪辑、合并和裁剪视频。
数据样式
因为涉及到公司保密信息,这里在b站随便下了个视频作为数据
总时长四分半,并且是有声音信息的
视频分割部分
库和路径设置
from moviepy.editor import VideoFileClip
import os
path1 = r"E:\监控室\6.19"
outpath = r"E:\监控室\再分割"
读取、切分及保存
for each in os.listdir(path1):
files = os.listdir(os.path.join(path1, each))
for file in files:
print(path1 + '\\' + each + '\\' + file)
clip = VideoFileClip(path1 + '\\' + each + '\\' + file)
turn = int(float(clip.duration) // 60)
start = 0
end = 60
for i in range(turn):
try:
subclip = clip.subclip(start, end)
subclip.write_videofile(outpath + '\\' + str(file).strip() + str(i) + ".mp4")
start += 70
end += 70
except (IOError, ZeroDivisionError) as encode:
print("错误,错误代码为:" + str(encode))
clip.close()
- 利用os库的listdir()获取第一层文件夹下的所有文件夹
- 用join()将路径和文件夹进行组合形成新路径,再用一次listdir()触及下一层中的文件
- 形成的路径+文件名的组合作为参数传入VideoFileClip()函数中进行切分
- 总时长是4分半,按60秒一切,turn变量就是计算出来的切分次数
- 设置切分的开始时间start和结束时间end,以切分次数进行循环导出程序的操作
- 以导出路径+文件名+第几个+文件格式为参数,输出视频
- 输出当前视频后,切分的时间点发生变化,即起始点和结束点每次循环加个60~70秒
- 第二个视频的输出重复上述操作
- 结束切片
视频消音部分
from moviepy.video.io.VideoFileClip import VideoFileClip
import os
import tqdm
inputs = 'E:/监控室/6.15/'
outputs = 'E:/监控室/视频处理/程序消音'
filenames = os.listdir(inputs)
for idx, element in enumerate(tqdm.tqdm(filenames)):
video = VideoFileClip(inputs+element)
video_without_audio = video.without_audio()
video_without_audio.write_videofile(outputs + "{}.mp4".format(element), threads=8, fps=24)
对于切分好的视频,以enumerate函数进行遍历,以without_audio函数去除声音,然后保存当前视频文件。
threads参数为线程数,线程越多,同时处理的视频数量越多,速度越快,fps为帧速率,一般为24~25,或者更高,太低了视频会很假。
输出结果
切分成了4个,不足一分钟的没有保留,视频每个一分钟多1秒,且音频信息消失了。
问题
当前代码可以作为视频剪辑工具,比较适合轻量级视频(MB级别)的批量操作,对于比较大的视频(GB级别)的视频处理起来会非常慢,这时候或许还不如视频剪辑软件。一般情况下用python处理,开的线程数量越多,电脑GPU性能越好,视频剪辑效率越高。