我正在尝试使用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.
2条答案
按热度按时间z31licg01#
最有可能发生的是,这一行:
会产生这样的文件名:(假设
path_to_files
是/opt/moviedir
,并且episode.title
是episode1
)这可能与预期的文件名不同:
/opt/moviedir/episode1.mp4
编辑:
在查看反向跟踪和moviepy的源代码之后,特别是here(第244-272行),它看起来像是将一个参数传递给了
ffmpeg
命令,而filename
是不正确的,所以这肯定是我们如何形成文件名的问题。看起来当前尝试形成
video_title
的方法是将单引号作为文件名的一部分,使其不同于没有单引号的预期文件名。请尝试将
video_title =
行更改为:因为它看起来像我们不需要做字符串的explicit转义当它被传递到
subprocess.Popen
没有shell=True
设置(这是moviepy
库是如何传递filename
参数的).请看this获取更多信息.5lwkijsr2#
我得到了这个工作通过添加完整的地址到视频文件,如: