Moviepy - 使用 CSV 文件中的时间创建多个子剪辑
Moviepy - Create multiple subclips using times from CSV file
我正在创建一个 Python 脚本,它使用 MoviePy 模块,从较大的视频中提取片段并将它们连接在一起。
剪辑的时间在 CSV 文件中有详细说明;
0,10
11,19
15,20
34,42
等等
我所做的是逐行读取 CSV 文件,然后使用 Moviepy 的子剪辑方法创建了一个剪辑,该剪辑存储在剪辑列表中,但是我得到一个 IndexError - 列表索引超出范围。
可能是什么问题(如果我不对 CSV 文件中的值使用 subclip 方法,代码工作正常)?
这是我的代码:
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 行,在运行文件中
execfile(文件名,命名空间)
文件 "C:\Anaconda3\envs\py35\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py",第 85 行,在 execfile 中
执行(编译(打开(文件名,'rb')。读取(),文件名,'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 行,位于
for (arg, name) in zip(a, names)]
文件 "C:\Anaconda3\envs\py35\lib\site-packages\moviepy\tools.py",第 78 行,在 cvsecs 中
发现 = re.findall(expr, time)[0]
IndexError: 列表索引超出范围
CSV 文件:
0,12
16,21
22,29
34,59
89,130
140,160
162,171
失败的原因是当您从这个 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)
我正在创建一个 Python 脚本,它使用 MoviePy 模块,从较大的视频中提取片段并将它们连接在一起。
剪辑的时间在 CSV 文件中有详细说明;
0,10
11,19
15,20
34,42 等等
我所做的是逐行读取 CSV 文件,然后使用 Moviepy 的子剪辑方法创建了一个剪辑,该剪辑存储在剪辑列表中,但是我得到一个 IndexError - 列表索引超出范围。
可能是什么问题(如果我不对 CSV 文件中的值使用 subclip 方法,代码工作正常)?
这是我的代码:
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 行,在运行文件中 execfile(文件名,命名空间)
文件 "C:\Anaconda3\envs\py35\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py",第 85 行,在 execfile 中 执行(编译(打开(文件名,'rb')。读取(),文件名,'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 行,位于 for (arg, name) in zip(a, names)]
文件 "C:\Anaconda3\envs\py35\lib\site-packages\moviepy\tools.py",第 78 行,在 cvsecs 中 发现 = re.findall(expr, time)[0]
IndexError: 列表索引超出范围
CSV 文件:
0,12
16,21
22,29
34,59
89,130
140,160
162,171
失败的原因是当您从这个 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)