Как вставить все вхождения в списке [] в CompositeVideoClip - PullRequest
1 голос
/ 23 сентября 2019

У меня есть видео, где я хочу вставить динамическое количество текстовых клипов.У меня есть цикл while, который обрабатывает логику для фактического создания различных текстовых клипов и дает им индивидуальные длительности и время начала (это работает).У меня, однако, есть проблема с «компиляцией» самого видео с вставкой этих текстов.

Код для создания 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)

Код для «компиляции»видео.(это не работает)

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

Я попробовал несколько подходов, но теперь я застрял и не могу найти способ продолжить.Прежде чем я получу много «ответов», говорящих мне сделать цикл while для компиляции, позвольте мне сказать, что фактическая компиляция занимает около 5 минут, и у меня есть 100-500 различных текстов, которые мне нужно реализовать в финальном видео, которое займетдней.Вместо этого я хочу добавить их один за другим, а затем сделать 1 большую финальную компиляцию, которая, как я знаю, займет чуть больше 5 минут, но все же намного быстрее, чем 2-3 дня.

Для тех из вас, кто, возможно, не использовал moviepy до того, как я опубликую фрагмент кода «мой код», который на самом деле работает, но не так, как мне это нужно.

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

Это работает точно так, как задумано (добавление 3-х текстов), однако я не знаю / не могу знать, сколько текстов будет в каждом видео заранее, поэтому мне нужно как-то вставить динамическое количество textList [] в функцию.

С уважением,

1 Ответ

1 голос
/ 24 сентября 2019

Не уверены, что делают аргументы после clip, (вы могли бы уточнить), но если проблема решается путем добавления переменного числа textList[i] аргументов, решение простое:

CompositeVideoClip([clip, *textList])

Звезда распаковывает список (или любой повторяемый );например: arg=4,5 - def f(a,b): return a+b - f(*arg)==9.Если у вас есть много textList с, вы можете управлять ими через вложенный список или словарь:

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
...