MoviePy не может объединяться при использовании нескольких путей в цикле for - PullRequest
0 голосов
/ 09 апреля 2020

Надеюсь, вопрос достаточно ясен. В основном у меня есть массив «output», содержащий все папки, которые я буду использовать (как показано ниже):

output = ['folder1', 'folder2', 'folder3', 'folder4']

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

from moviepy.editor import *
import os
from natsort import natsorted

L =[]

for root, dirs, files in os.walk("/media/pi/videos"):

    #files.sort()
    files = natsorted(files)
    for file in files:
        if os.path.splitext(file)[1] == '.mp4':
            filePath = os.path.join(root, file)
            video = VideoFileClip(filePath)
            L.append(video)


final_clip = concatenate_videoclips(L)
final_clip.to_videofile("output.mp4", fps=24, remove_temp=False)

Но когда я пытаюсь сделать то же самое в течение l oop, я получаю ошибки и не могу получить свою оглянись, что не так. Любая помощь искренне ценится. Вот код, который я пытался заставить работать:

output.sort()

   for i in output:
    if not i == 'System Volume Information':
        path2 = '/media/pi/videos/%s' % i

        L =[]

           for root, dirs, files in os.walk(path2):

               #files.sort()
               files = natsorted(files)
               for file in files:
                   if os.path.splitext(file)[1] == '.mp4':
                       filePath = os.path.join(root, file)
                       video = VideoFileClip(filePath)
                       L.append(video)


           final_clip = concatenate_videoclips(L)
           final_clip.to_videofile("output.mp4", fps=24, remove_temp=False)

По сути, я пытаюсь объединить определенное количество видео. Я переименовал все мои файлы .mp4 в "1.mp4" "2.mp4" "3.mp4" и т. Д. c, и я пытаюсь сделать так, чтобы код объединял, скажем, 5 файлов .mp4 для 1 видео и go в течение l oop, пока не будет больше видео для объединения. Это единственный способ, которым я мог думать об этом. Я создал подпапки, содержащие 5 файлов .mp4, и теперь я пытаюсь объединить эти видео для каждой папки. Я полагаю, что это не очень эффективно, так что любой лучший совет будет полезен

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

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

from moviepy.editor import *
import os
from natsort import natsorted

#directory of videos
source_dir = '/media/video'

for root, dirs, files in os.walk(source_dir):
    for i in dirs:
        #checks the subdirectories
        path2 = "/media/video/" + str(i)  
        L =[]

        #combines all the .mp4 files
        for root, dirs, files in os.walk(path22):
            files = natsorted(files)        
            for file in files:
                if os.path.splitext(file)[1] == '.mp4':
                    filePath = os.path.join(root, file)
                    video = VideoFileClip(filePath)
                    L.append(video)

        #creates the final video          
        final_clip = concatenate_videoclips(L)
        final_clip.to_videofile( "_output.mp4"  , fps=24, remove_temp=False) 
0 голосов
/ 10 апреля 2020

Если я понял, чего вы пытаетесь достичь, может быть, что-то вроде этого?

from pathlib import Path
from moviepy.editor import VideoFileClip, concatenate_videoclips

for resource_path in Path("vids").glob("*"):
    if not resource_path.is_dir():
        continue
    directory_path = resource_path

    clip = concatenate_videoclips(list(map(VideoFileClip, (str(v) for v in directory_path.glob("*.mp4")))))
    clip.to_videofile(str(directory_path.joinpath("output.mp4")), fps=24, remove_temp=False)

По сути, он перебирает все каталоги в каталоге "vids". Затем он захватывает все mp4 внутри текущего каталога и объединяет их вместе, чтобы создать «output.mp4» для этой папки. Затем он переходит к следующей папке и повторяется.

...