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