这篇文章主要介绍“python如何利用moviepy实现音视频剪辑”,在日常操作中,相信很多人在python如何利用moviepy实现音视频剪辑问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何利用moviepy实现音视频剪辑”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1.寻找合适的Python库(安装是否麻烦、使用是否简便、执行会不会太久)
moviepy 音视频库。分析需要用的API:代码示例
2.定义输入输出
输入:一个音视频文件的地址,需要剪出来的时间段
输出:剪辑片段的文件
3.设计执行流程并一步步实现(定义函数,与使用具体API相关)
读入并创建clip对象。
剪辑subclip,输入时间参数可以是时间格式的字符串。
导出write_videofile。
4.结论:时间太久,片段多长就花了多久的时间;CPU全跑满了。
stackoverflowConcat videos too slow using Python MoviePY 里面有个答案说,调用包里封装的ffmpeg函数会快一些:
You have some functions that perform direct calls to ffmpeg: github.com/Zulko/movie… And are therefore extremely efficient, for simple tasks such as yours.
5.重新设计和实现,直接使用moviepy.video.io.ffmpeg_tools里的函数:ffmpeg_extract_subclip(源音视频文件,起,止,输出名)。
这个函数中输入的起止时间参数只能是数字,不能是字符串,而库基本使用的接口函数传入的是字符串。看源码发现是有个把时间字符串转换成数字的装饰器的,一步步找就可以找到那个转换的函数了。
6.结论:时间快了很多,几乎是几秒内就完成。
但并不明白为什么快了这么多
7.优化:一次处理多个时间段
输入由一个起止时间,变为一组起止时间
循环处理每一组起止时间
输出的文件名按顺序拼接
8.优化:每段时间配上名字
输入除了每一组的起止时间,还有后缀名
文件名+后缀得到输出的文件名
9.优化:输入输出的合法性校验
校验输入地址是合法文件
校验时间段(没什么必要)
不可以小于0
不可以大于视频时间
起小于止
需要pip install moviepy
简单的使用
from moviepy.editor import VideoFileClip, concatenate_videoclips clipOri = VideoFileClip("E:/2020-03-29 19-31-39.mkv") #截取两个subclip再拼接 #time_length = int(clipOri.duration) 这句可以获取片子的时 #超过时长会报错,时长默认用秒,也可以写得更细,(00:03:50.54)->3分50秒 cut1 = clipOri.subclip(0, 7053) cut2 = clipOri.subclip(7059, 8941) finalClip = concatenate_videoclips([cut1,cut2]) finalClip.write_videofile("E:/acut.mp4")
import os import moviepy.video.io.ffmpeg_tools as fftool from moviepy.tools import cvsecs def add_suffix(file_name, suffix): # 文件名拼接后缀 index = file_name.rfind('.') # 最后一个点号 res = file_name[:index] + '_' + suffix + file_name[index:] return res # 输入 file_name = r"./XXX.mkv" output_arr = [ ('04:20','05:07', '自我介绍'), ('05:07','17:47', '项目经历'), ('17:37','24:40', 'HTTPS'), ('24:40','28:10', '实现读写锁'), ] if not os.path.isfile(file_name): # 校验 print("不合法的输入", file_name) for startStr, endStr, suffix in output_arr: start = cvsecs(startStr) end = cvsecs(endStr) if start < 0 or start >= end: # 校验 print("不合法的时间",startStr, endStr) continue full_output_name = add_suffix(file_name, suffix) print('处理文件:', file_name, '时间:', startStr, '-', endStr) fftool.ffmpeg_extract_subclip(file_name,start,end,full_output_name) # 剪辑并输出 print('处理功成功,输出:',full_output_name)
到此,关于“python如何利用moviepy实现音视频剪辑”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。