Объединить фильмы из списка Python с помощью MoviePy или FFmpeg - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть около 10 000 коротких видео, из которых я пытаюсь сделать несколько более длинных видео.

Я создал эти видео с помощью MoviePy, но продолжаю получать ошибки памяти при попытке объединить их вместе.

В моем коде у меня есть внешний цикл, проходящий через каждую букву алфавита и получающий файлы, которые начинаются с этой буквы.

Из возвращенных видеоклипов я получаю длительность и обрезаю последние 3,5 секунды (outro_clip_duration) видео, а затем добавляю его в список Python clips.

Там, где я застрял, я хочу взять этот список обрезанных видео и сделать из него одно длинное длинное видео.

У меня есть все файлы, мне просто нужно их обрезать,объединить их, а затем экспортировать их как один.

Я много раз пробовал с разными попытками MoviePy и продолжаю получать MemoryErrors, поэтому я сдался и попробовал решение ffmpeg, замеченное здесь но он тоже не работает.

Последняя версия основной части моего кода находится здесь:

clips = []
outro_clip = mpy.VideoFileClip('Logo_Intro_w_Stinger_Large.mp4')
outro_clip_duration = outro_clip.duration
for def_image in vid_list_long:
    video_item = mpy.VideoFileClip('F:/sm_My_Video/sm_%s.mp4' % def_image)
    video_item_duration = video_item.duration
    clips.append(ffmpeg_extract_subclip(video_item,0,(video_item_duration - outro_clip_duration), targetname = def_image))

# #Append the outro_clip to the end 
clips.append(mpy.VideoFileClip('Logo_Intro_w_Stinger_Large.mp4',target_resolution = (h,w),audio=True))
slided_clips = [CompositeVideoClip([clip.fx( transfx.crossfadein, transition_seconds)]) for clip in clips]
#added 'method = compose' NEED TO TEST - supposedly removes the weird glitches.
c = concatenate_videoclips(slided_clips, method = 'compose')
c.write_videofile('F:/Extended_Play/%s_Extended_Play_vid.mp4' % letter,fps=23.98)

Мой компьютер - Windows 10, и у меня 32 ГБ ОЗУ под управлением Anaconda.и Python 3.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы должны попытаться закрыть клипы, как только вы закончите, используя их, добавив close_clip(video_item) в конце цикла for, что-то вроде

for def_image in vid_list_long:
    video_item = mpy.VideoFileClip('F:/sm_My_Video/sm_%s.mp4' % def_image)
    video_item_duration = video_item.duration
    clips.append(ffmpeg_extract_subclip(video_item,0,(video_item_duration - outro_clip_duration), targetname = def_image))
    close_clip(video_item)

Где close_clip() будет выглядеть примерно как

def close_clip(clip):
  try:
    clip.reader.close()
    if clip.audio != None:
      clip.audio.reader.close_proc()
      del clip.audio
    del clip
  except Exception as e:
    print("Error in close_clip() ", e)
0 голосов
/ 05 февраля 2019

Если это проблема с памятью, возможно, вы могли бы попробовать сделать сцепленное видео для каждой буквы алфавита, а затем в отдельном сценарии попытаться объединить эти видео?Я знаю, что многие форматы видео содержат верхние заголовки, которые могут занимать много места, поэтому, возможно, если вы объедините их поэтапно, у вас будет меньше этих заголовков, загруженных в память.Возможно (чисто предположительно, потому что я действительно не знаю), существует ограничение на формат файла видео, которое вы пытаетесь создать, и вы превышаете его, так что то, чего вы хотите, вообще не может быть достигнуто в этом конкретном формате?Если эти предложения не работают, возможно, вы можете попробовать объединить видео по одному письму за раз (после того, как вы уже связали их по буквам) и посмотреть, где оно разрывается?В крайнем случае вы всегда можете снизить разрешение или опубликовать на YouTube (или что бы вы ни делали) в виде 2 или 3 видео вместо 1. Это по-прежнему значительное улучшение по сравнению с 10000 видео!

...