在 for 循环中使用多个路径时,MoviePy 无法连接

MoviePy cannot conctenate when using multiple paths in a for loop

我希望问题足够清楚。基本上我有一个数组 "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)

但是,当我尝试在 for 循环中做同样的事情时,我遇到了错误,并且无法设法解决问题所在。真诚感谢任何帮助。这是我一直试图开始工作的代码:

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”等,我正在尝试将代码组合起来,假设 5 个 .mp4 文件用于 1 个视频,并将进入for 循环,直到没有更多的视频可以合并。这是我能想到的唯一方法。我制作了包含 5 个 .mp4 文件的子文件夹,现在我正在尝试为每个文件夹组合这些视频。我认为这不是很有效,所以任何更好的建议都会有所帮助

如果我理解了您要实现的目标,也许是这样的?

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"。然后它移动到下一个文件夹并重复。

这是我设法解决自己问题的方法。可能有更好的方法可以做到这一点,但这对我有用。我相信我在那里发表的一些评论已经很清楚了。

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)