我正在创建一个使用MoviePy模块的Python脚本,从较大的视频中获取剪辑并将它们连接在一起。
剪辑的时间详见CSV文件;
0.10
11,19
15,20
34,42 等
我所做的是逐行读取CSV文件,然后使用Moviepy中的子剪辑方法创建一个存储在剪辑列表中的剪辑,但是我得到一个IndexError - 列表索引超出范围。
可能是什么问题(如果我不将子剪辑方法与CSV文件中的值一起使用,代码可以正常工作)?
这是我的代码:
video= VideoFileClip('file')
clipsArray = []
import csv
with open('csv file', 'r') as file:
reader = csv.reader(file)
for row in reader:
startTime = row[0]
endTime = row[1]
clip = fullVideo.subclip(startTime, endTime)
clipsArray.append(clip)
错误消息是:
文件" C:\ Anaconda3 \ envs \ py35 \ lib \ site-packages \ spyderlib \ widgets \ externalshell \ sitecustomize.py",第685行,在runfile中 execfile(filename,namespace)
文件" C:\ Anaconda3 \ envs \ py35 \ lib \ site-packages \ spyderlib \ widgets \ externalshell \ sitecustomize.py",第85行,在execfile中 exec(编译(打开(文件名,' rb')。read(),filename,' exec'),命名空间)
文件" C:/spyder2-py3/program.py" ;,第32行,在 clip = fullVideo.subclip(start,end)#为每个时间戳创建剪辑
文件"",第2行,在子剪辑中
文件" C:\ Anaconda3 \ envs \ py35 \ lib \ site-packages \ moviepy \ decorators.py",第86行,在包装器中 for(arg,name)in zip(a,names)]
文件" C:\ Anaconda3 \ envs \ py35 \ lib \ site-packages \ moviepy \ decorators.py",第86行,in for(arg,name)in zip(a,names)]
文件" C:\ Anaconda3 \ envs \ py35 \ lib \ site-packages \ moviepy \ tools.py",第78行,在cvsecs中 finds = re.findall(expr,time)[0]
IndexError:列表索引超出范围
CSV文件:
0,12
16,21
22,29
34,59
89,130
140,160
162,171
答案 0 :(得分:1)
失败的原因是因为当您从此csv文件中读取时,您会将startTime
和endTime
作为字符串,例如第一行中的'0'
和'12'
。
MoviePy只接受两种格式:
'hh:mm:ss.dd'
的字符串(小时,分钟,秒,小数秒),例如'05:12:10.50'
持续5小时12分10.5秒。所以你应该写
startTime = float(row[0])
endTime = float(row[1])
clip = fullVideo.subclip(startTime, endTime)