Moviepy - 使用 CSV 文件中的时间创建多个子剪辑

Tar*_*ngh 4 python video-processing moviepy

我正在创建一个使用 MoviePy 模块的 Python 脚本,从较大的视频中获取剪辑并将它们连接在一起。

剪辑的时间在 CSV 文件中详细说明,如下所示;

0,10

11,19

15,20

34,42等

我所做的是逐行读取 CSV 文件,然后使用 Moviepy 中的 subclip 方法创建一个存储在剪辑列表中的剪辑,但是我得到一个 IndexError - 列表索引超出范围。

可能是什么问题(如果我不使用 subclip 方法和 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)
Run Code Online (Sandbox Code Playgroud)

错误信息是:

文件“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 exec(compile(open(filename, 'rb').read(),文件名、'exec')、命名空间)

File "C:/spyder2-py3/program.py", line 32, in 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

Zul*_*lko 5

它失败的原因是因为当您从此 csv 文件读取时,您会得到startTimeendTime作为字符串,例如'0''12'第一行中。

MoviePy 仅接受两种格式的时间:

  • 表示秒数的数字格式(int 或 float)
  • 形式为'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)
Run Code Online (Sandbox Code Playgroud)