python-3.x 电影播放错误:找不到文件***

laawzig2  于 2023-03-09  发布在  Python
关注(0)|答案(2)|浏览(217)

我正在尝试使用MoviePy将一个mp4视频转换为mp3音频。在下面的“convertToMP3”函数中,我传递了一个episode,它是一个RSS条目对象,具有“title”属性。我已经下载了一个mp4视频,保存文件名周围的一些引号外,它共享了一集的标题。

from moviepy.editor import AudioFileClip, VideoFileClip
    import os
    import feedparser

    #Input: episode, an RSS entry object; cleanup (boolean), a  flag indicating whether 
    or not the old video file should be deleted 
    #Output: None
    #Creates an MP3 version of the video file and optionally deletes the video (cleanup)
    def convertToMP3(self, episode, cleanup = False):

        #Establish path to files
            
        #Try absolute path with quotes
        try:
            path_to_files = os.path.abspath(self.dest)
            video_title = ("\'%s.mp4\'" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)   
            video_version = VideoFileClip(video_dir) 
        except Exception as e: 
            print("ERROR: Absolute path with quotes doesn't work. %s" % e)
       #Try absolute path without quotes
        try:
            path_to_files = os.path.abspath(self.dest)
            video_title = ("%s.mp4" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)   
            video_version = VideoFileClip(video_dir) 
        except Exception as e: 
            print("ERROR: Absolute path without doesn't work. %s" % e)

        #Try implicit path with quotes
        try:
            path_to_files = (self.dest)
            video_title = ("\'%s.mp4\'" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)
            video_version = VideoFileClip(video_dir)
        except Exception as e:
            print("ERROR: Implicit path with quotes doesn't work. %s" % e)

        #Try implicit path without quotes
      
        try:
            path_to_files = (self.dest)
            video_title = ("%s.mp4" % episode.title)
            video_dir = os.path.join(path_to_files, video_title)
            video_version = VideoFileClip(video_dir)
        except Exception as e:
            print("ERROR: Implicit path without quotes doesn't work. %s" % e)  
        try:
            #Create MP3 version of episode
            #video_dir = str(video_dir)
            #TODO: Below line of code cannot find the video file
            mp3_version = video_version.audio
            mp3_version.write_audiofile(path_to_files / episode.title)
            
            #Close the files
            mp3_version.close()
            video_version.close()
        except Exception as e:
            print("ERROR: File conversion failed. %s" % e)

我遇到的问题是MoviePy找不到视频文件。正如你所看到的,我同时使用了隐式路径和绝对路径,但都不起作用。我运行在Ubuntu 20.04机器上,使用Python 3.8.2,并且安装了所有可选的MoviePy依赖项。我还遗漏了什么吗?
追溯:

dLoader1b: Testing file conversion from MP4 to MP3
Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/__main__.py", line 45, in <module>
    cli.main()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 430, in main
    run()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.105369/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "/usr/lib/python3.8/runpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/usr/lib/python3.8/runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/dLoader_tester.py", line 46, in <module>
    dLoader1c.convertToMP3(latest_ep)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/Podcast_DLoader.py", line 128, in convertToMP3
    video_version = VideoFileClip(video_dir) 
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 270, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file /home/caleb/Documents/Programming_Projects/Podcast_DLoader/'NVIDIA CONFIRMS Your PSU Can't Handle RTX 3000 - WAN Show August 28, 2020.mp4' could not be found!
Please check that you entered the correct path.

编辑

def convertToMP3(self, episode, cleanup = False):

path_to_files = (self.dest)
video_title = episode.title + ".mp4"
video_version = VideoFileClip(video_title)

try:
    #Create MP3 version of episode
    #video_dir = str(video_dir)
    #TODO: Below line of code cannot find the video file
    mp3_version = video_version.audio
    mp3_version.write_audiofile(path_to_files / episode.title)
    
    #Close the files
    mp3_version.close()
    video_version.close()
except Exception as e:
    print("ERROR: File conversion failed. %s" % e)

这仍然产生相同的错误:

Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/__main__.py", line 45, in <module>
    cli.main()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 430, in main
    run()
  File "/home/caleb/.vscode/extensions/ms-python.python-2020.8.106424/pythonFiles/lib/python/debugpy/../debugpy/server/cli.py", line 267, in run_file
    runpy.run_path(options.target, run_name=compat.force_str("__main__"))
  File "/usr/lib/python3.8/runpy.py", line 263, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/usr/lib/python3.8/runpy.py", line 96, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/dLoader_tester.py", line 49, in <module>
    dLoader1c.convertToMP3(latest_ep)
  File "/home/caleb/Documents/Programming_Projects/Podcast_DLoader/Podcast_DLoader.py", line 156, in convertToMP3
    video_version = VideoFileClip(video_title)
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/VideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "/usr/local/lib/python3.8/dist-packages/moviepy/video/io/ffmpeg_reader.py", line 270, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: the file %s could not be found!\n"
OSError: MoviePy error: the file NVIDIA CONFIRMS Your PSU Can't Handle RTX 3000 - WAN Show August 28, 2020.mp4 could not be found!
Please check that you entered the correct path.
z31licg0

z31licg01#

最有可能发生的是,这一行:

video_title = ("\'%s.mp4\'" % episode.title)

会产生这样的文件名:(假设path_to_files/opt/moviedir,并且episode.titleepisode1

`/opt/moviedir/'episode1.mp4'`

这可能与预期的文件名不同:/opt/moviedir/episode1.mp4

编辑:

在查看反向跟踪和moviepy的源代码之后,特别是here(第244-272行),它看起来像是将一个参数传递给了ffmpeg命令,而filename是不正确的,所以这肯定是我们如何形成文件名的问题。
看起来当前尝试形成video_title的方法是将单引号作为文件名的一部分,使其不同于没有单引号的预期文件名。
请尝试将video_title =行更改为:

video_title = episode.title + ".mp4"

因为它看起来像我们不需要做字符串的explicit转义当它被传递到subprocess.Popen没有shell=True设置(这是moviepy库是如何传递filename参数的).请看this获取更多信息.

5lwkijsr

5lwkijsr2#

我得到了这个工作通过添加完整的地址到视频文件,如:

c = VideoFileClip(r"C:\Users\...\test.mp4").subclip(0, 5)

相关问题