如何将 list[] 中的所有事件插入 CompositeVideoClip

How to insert all occurances in list[] into CompositeVideoClip

我有一个视频,我想在其中插入动态数量的 TextClip。我有一个 while 循环,用于处理实际创建不同 TextClip 并为它们提供单独的持续时间 & start_times(这有效)的逻辑。但是,我确实 "compiling" 插入这些文本的视频本身存在问题。

用于创建 TextClip(有效)的代码。

text = mpy.TextClip(str(contents),
    color='white', size=[1700, 395], method='caption').set_duration(
                   int(list[i - 1])).set_start(currentTime).set_position(("center", 85)) 

print(str(i) + " written")
textList.append(text)

编码到 "compile" 视频。 (那行不通)

final_clip = CompositeVideoClip([clip, len(textList)])
final_clip.write_videofile("files/final/TEST.mp4")

我尝试了几种方法,但现在我卡住了,想不出继续下去的方法。在我得到很多 "answers" 告诉我在编译时做一个 while 循环之前,我只想说实际编译大约需要 5 分钟,我有 100-500 个不同的文本需要在最终视频中实现需要几天时间。相反,我想一个一个地添加它们,然后进行 1 个大的最终编译,我知道这将花费 5 分钟多一点的时间,但仍然比 2-3 天快得多。

对于那些之前可能没有使用过 moviepy 的人,我将 post 一段 "my code" 实际有效的片段,虽然不是我需要的方式。

final_clip = CompositeVideoClip([clip, textList[0], textList[1], textList[2]])
final_clip.write_videofile("files/final/TEST.mp4")

这完全符合预期(添加 3 个文本),但是我 dont/can 事先不知道每个视频中会有多少文本,所以我需要以某种方式插入动态数量的 textList[] 进入函数。

亲切的问候,

不确定 clip, 之后的参数是做什么的(你可以澄清一下),但是如果通过插入可变数量的 textList[i] 参数解决了问题,那么解决方案很简单:

CompositeVideoClip([clip, *textList])

星号解压列表(或任何iterable);例如:arg=4,5 -- def f(a,b): return a+b -- f(*arg)==9。如果你有很多 textLists,你可以通过嵌套列表或字典来管理它们:

textListDict = {'1':textList1, '2':textList2, ...}
textListNest = [textList1, textList2, ...] # probably preferable - using for below

# now iterate:
for textList in textListNest:
    final_clip = CompositeVideoClip([clip, *textList])


解压演示:

def show_then_join(a, b, c):
    print("a={}, b={}, c={}".format(a,b,c))
    print(''.join("{}{}{}".format(a,b,c)))

some_list = [1, 2, 'dog']
show_then_sum(*some_list) # only one arg is passed in, but is unpacked into three
# >> a=1, b=2, c=dog
# >> 12dog