实践步骤
1.寻找合适的Python库(安装是否麻烦、使用是否简便、执行会不会太久)
- moviepy 音视频库。分析需要用的API:代码示例
2.定义输入输出
- 输入:一个音视频文件的地址,需要剪出来的时间段
- 输出:剪辑片段的文件
3.设计执行流程并一步步实现(定义函数,与使用具体API相关)
- 读入并创建clip对象。
- 剪辑subclip,输入时间参数可以是时间格式的字符串。
- 导出write_videofile。
4.结论:时间太久,片段多长就花了多久的时间;CPU全跑满了。
*Concat 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
简单的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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" )
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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实现音视频剪辑的详细内容,更多关于python moviepy实现音视频剪辑的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/6973318052586717220