如何将 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
。如果你有很多 textList
s,你可以通过嵌套列表或字典来管理它们:
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
我有一个视频,我想在其中插入动态数量的 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
。如果你有很多 textList
s,你可以通过嵌套列表或字典来管理它们:
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