鱼C论坛

 找回密码
 立即注册
查看: 868|回复: 2

[已解决]关于使用moviepy模块报错的求助。

[复制链接]
发表于 2023-10-15 22:04:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源代码如下:
import os
from moviepy.editor import ImageSequenceClip
from moviepy.video.compositing.concatenate import concatenate_videoclips


def convert_gif_to_video(folder_path):
    # 获取文件夹名称
    folder_name = os.path.basename(folder_path)

    # 获取文件夹下的所有gif文件
    gif_files = [file for file in os.listdir(folder_path) if file.endswith(".gif")]

    if len(gif_files) == 0:
        print("该文件夹下没有gif文件")
        return

    # 排序gif文件(可选)
    gif_files.sort()

    # 读入gif文件序列
    frames = [ImageSequenceClip(os.path.join(folder_path, file), fps=10) for file in gif_files]

    # 拼接gif文件序列为一个视频
    video = concatenate_videoclips(frames,method="compose", transition=None, bg_color=None, ismask=False, padding = 0)

    # 保存视频为mp4文件
    output_file = os.path.join(folder_path, f"{folder_name}.mp4")
    video.write_videofile(output_file, codec="libx264")

    print("转换完成,生成的视频文件为:", output_file)


# 指定文件夹路径
folder_path = r"G:\000\40"

# 调用函数进行转换
convert_gif_to_video(folder_path)

想实现的功能是,把某个文件夹下的所有gif文件合并成一个视频mp4文件,以该文件夹命名。
但是报错如下

D:\Python\python.exe E:\【Python项目】\--临时可删除--\000.py
Traceback (most recent call last):
  File "E:\【Python项目】\--临时可删除--\000.py", line 37, in <module>
    convert_gif_to_video(folder_path)
  File "E:\【Python项目】\--临时可删除--\000.py", line 21, in convert_gif_to_video
    frames = [ImageSequenceClip(os.path.join(folder_path, file), fps=10) for file in gif_files]
  File "E:\【Python项目】\--临时可删除--\000.py", line 21, in <listcomp>
    frames = [ImageSequenceClip(os.path.join(folder_path, file), fps=10) for file in gif_files]
  File "D:\Python\lib\site-packages\moviepy\video\io\ImageSequenceClip.py", line 77, in __init__
    for f in os.listdir(sequence)])
NotADirectoryError: [WinError 267] 目录名称无效。: 'G:\\000\\40\\430_t61236y.gif'


搞不懂为什么会报错,报错的居然是个文件。好奇怪,有知道的大佬吗?谢谢

最佳答案
2023-10-15 22:05:24
你的错误信息是 NotADirectoryError: [WinError 267] 目录名称无效。: 'G:\\\\000\\\\40\\\\430_t61236y.gif'。这个错误是因为你在 ImageSequenceClip 函数中传入了一个文件路径,而该函数期望的是一个目录路径。

ImageSequenceClip 函数的设计是用来读取一个目录下的所有图片文件,并将它们合并成一个视频。在你的代码中,你试图将每一个 gif 文件作为一个图片序列来处理,这是不正确的。

如果你想将多个 gif 文件合并成一个视频,你应该首先将每个 gif 文件转换为一个 VideoClip 对象,然后再将这些 VideoClip 对象合并。你可以使用 VideoFileClip 函数来读取 gif 文件并将其转换为 VideoClip 对象。

以下是修改后的代码:
import os
from moviepy.editor import VideoFileClip
from moviepy.video.compositing.concatenate import concatenate_videoclips

def convert_gif_to_video(folder_path):
    # 获取文件夹名称
    folder_name = os.path.basename(folder_path)

    # 获取文件夹下的所有gif文件
    gif_files = [file for file in os.listdir(folder_path) if file.endswith(".gif")]

    if len(gif_files) == 0:
        print("该文件夹下没有gif文件")
        return

    # 排序gif文件(可选)
    gif_files.sort()

    # 读入gif文件序列
    clips = [VideoFileClip(os.path.join(folder_path, file)) for file in gif_files]

    # 拼接gif文件序列为一个视频
    video = concatenate_videoclips(clips)

    # 保存视频为mp4文件
    output_file = os.path.join(folder_path, f"{folder_name}.mp4")
    video.write_videofile(output_file, codec="libx264")

    print("转换完成,生成的视频文件为:", output_file)

# 指定文件夹路径
folder_path = r"G:\\000\\40"

# 调用函数进行转换
convert_gif_to_video(folder_path)

这段代码将读取指定文件夹下的所有 gif 文件,将它们转换为 VideoClip 对象,然后将这些 VideoClip 对象合并成一个视频,并保存为 mp4 文件。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-15 22:04:42 | 显示全部楼层
错误信息显示,程序在执行  ImageSequenceClip  时遇到了异常。异常信息中提到的  'G:\\000\\40\\430_t61236y.gif'  是一个文件而不是一个目录。这表明程序无法正确读取文件夹下的所有文件。



这个问题可能是由于文件夹路径错误或文件夹中存在不是  .gif  格式的文件。你可以尝试使用以下代码来检查文件夹路径是否正确,并过滤掉不是  .gif  格式的文件:


gif_files = [file for file in os.listdir(folder_path) if file.endswith(".gif") and os.path.isfile(os.path.join(folder_path, file))]


如果问题仍然存在,请检查文件夹路径是否正确,并确保文件夹中只有  .gif  格式的文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-15 22:05:24 | 显示全部楼层    本楼为最佳答案   
你的错误信息是 NotADirectoryError: [WinError 267] 目录名称无效。: 'G:\\\\000\\\\40\\\\430_t61236y.gif'。这个错误是因为你在 ImageSequenceClip 函数中传入了一个文件路径,而该函数期望的是一个目录路径。

ImageSequenceClip 函数的设计是用来读取一个目录下的所有图片文件,并将它们合并成一个视频。在你的代码中,你试图将每一个 gif 文件作为一个图片序列来处理,这是不正确的。

如果你想将多个 gif 文件合并成一个视频,你应该首先将每个 gif 文件转换为一个 VideoClip 对象,然后再将这些 VideoClip 对象合并。你可以使用 VideoFileClip 函数来读取 gif 文件并将其转换为 VideoClip 对象。

以下是修改后的代码:
import os
from moviepy.editor import VideoFileClip
from moviepy.video.compositing.concatenate import concatenate_videoclips

def convert_gif_to_video(folder_path):
    # 获取文件夹名称
    folder_name = os.path.basename(folder_path)

    # 获取文件夹下的所有gif文件
    gif_files = [file for file in os.listdir(folder_path) if file.endswith(".gif")]

    if len(gif_files) == 0:
        print("该文件夹下没有gif文件")
        return

    # 排序gif文件(可选)
    gif_files.sort()

    # 读入gif文件序列
    clips = [VideoFileClip(os.path.join(folder_path, file)) for file in gif_files]

    # 拼接gif文件序列为一个视频
    video = concatenate_videoclips(clips)

    # 保存视频为mp4文件
    output_file = os.path.join(folder_path, f"{folder_name}.mp4")
    video.write_videofile(output_file, codec="libx264")

    print("转换完成,生成的视频文件为:", output_file)

# 指定文件夹路径
folder_path = r"G:\\000\\40"

# 调用函数进行转换
convert_gif_to_video(folder_path)

这段代码将读取指定文件夹下的所有 gif 文件,将它们转换为 VideoClip 对象,然后将这些 VideoClip 对象合并成一个视频,并保存为 mp4 文件。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表