Pydub的from_mp3函数提示“[Errno 2] No such file or directory”

7
我发现我在这里遇到了一道难题,仅仅尝试将音频文件加载到pydub进行转换时,它就一直抛出一个"[Errno 2] No such file or directory"的错误。
自然而然地,我花了太多的时间确保路径有效,尝试了相对路径和绝对路径,并确认python方法open()使用完全相同的路径是可以正常工作的。
我正在通过anaconda 2.3 distrib在ubuntu上使用ipython 3.2和python 2.7。
from pydub import AudioSegment
sound = AudioSegment.from_mp3("/absolute/path/to/file.mp3")

尝试在路径中去除空格,因为空格有时会导致问题。以下是完整的错误日志:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-15-8b1ec013ca8e> in <module>()
      1 import pydub
----> 2 sound = pydub.AudioSegment.from_mp3("/absolute/path/to/file.mp3")

/home/ludo/anaconda3/envs/python2/lib/python2.7/site-packages/pydub/audio_segment.pyc in from_mp3(cls, file)
    421     @classmethod
    422     def from_mp3(cls, file):
--> 423         return cls.from_file(file, 'mp3')
    424 
    425     @classmethod

/home/ludo/anaconda3/envs/python2/lib/python2.7/site-packages/pydub/audio_segment.pyc in from_file(cls, file, format, **kwargs)
    404         log_conversion(conversion_command)
    405 
--> 406         p = subprocess.Popen(conversion_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    407         p_out, p_err = p.communicate()
    408 

/home/ludo/anaconda3/envs/python2/lib/python2.7/subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
    708                                 p2cread, p2cwrite,
    709                                 c2pread, c2pwrite,
--> 710                                 errread, errwrite)
    711         except Exception:
    712             # Preserve original exception in case os.close raises.

/home/ludo/anaconda3/envs/python2/lib/python2.7/subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
   1333                         raise
   1334                 child_exception = pickle.loads(data)
-> 1335                 raise child_exception
   1336 
   1337 

OSError: [Errno 2] No such file or directory

我是否忽略了什么非常简单的东西或者是...?

编辑: 我还尝试将路径作为原始文本r"/absolute/path/to/file.mp3"传递,就像Vaulstein所问的那样-但是我得到了相同的错误。


你尝试过将路径作为原始文本传递吗?例如 r"/absolute/path/to/file.mp3",以防它包含特殊字符。 - Vaulstein
是的,我已经尝试了相对路径和绝对路径,但是都出现了同样的错误。它包含的最特殊的字符是下划线和破折号。不过这是个好建议,我会将其添加到问题中! - LudoC
尝试在IDE或Python Shell中运行以下命令:import pydub sound = pydub.AudioSegment.from_mp3("/absolute/path/to/file.mp3") - Vaulstein
好的,我在Kitty会话中尝试了从Python命令行运行(这是您所说的IDE或Python shell吗?): 1/ 导入pydub时出现“RuntimeWarning:找不到ffmpeg或avconv-默认使用ffmpeg,但可能无法正常工作” 2/ 执行与上述相同的操作“from pydub import AudioSegment”会导致相同的错误。 - LudoC
1个回答

8

异常与您提供的文件名无关。从回溯信息可以看出,subprocess.Popen 调用的 conversion_command 找不到。这可能解释了警告,即找不到 avconvffmpeg。解决方法是在控制台中使用 sudo apt-get install libav-tools 命令安装 libav-tools 包。


1
我相信你是正确的 - 这是pydub最常见的问题之一(这也是我们添加RuntimeWarning的原因) - Jiaaro
3
另外需要注意的是,如果ffmpeg/avlib不在你的PATH中,你也可以在实例化任何AudioSegment对象之前手动指定它的位置,例如 AudioSegment.converter = "/path/to/ffmpeg" :) - Jiaaro
非常感谢BlackJack和@Jiaaro - 我成功地按照你们的提示在Python命令行中使它工作了,但是我在我的IPython笔记本中仍然遇到了同样的错误。你们熟悉这个吗?有任何想法它可能来自哪里?虽然我的~/bin在我的路径中,但我尝试从我的笔记本中将ffmpeg的直接路径添加到AudioSegment.converter中。 - LudoC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接