如何修复FileNotFoundError:[WinError 2]系统找不到用AudioSegment.from_mp3()指定的文件

时间:2019-04-13 19:38:26

标签: python-3.x pydub

我一直在尝试寻找视频音频中音频无声空间的位置,但是我无法克服仅使用python 3中的pydub导入音频文件的问题

我已经尝试在项目中将pydub正在检查ffmpeg的目录更改为一个目录,并且该文件位于我正在运行脚本的目录中,但它似乎仍返回相同的错误。

from moviepy import editor
from pydub import silence, AudioSegment
from pathlib import Path
import os
AudioSegment.converter = r"C:\\Users\\ratee\\PycharmProjects\\untitled\\ffmpeg\\bin\\ffmpeg.exe"
vid = editor.VideoFileClip("video.mp4")
print(AudioSegment.ffmpeg)
my_file = Path("audio.mp3")
if not my_file.is_file():
    vid.audio.write_audiofile("audio.mp3")
audio = AudioSegment.from_mp3("audio.mp3")
print(audio)

我希望它将mp3音频段存储到变量audi中,但它返回:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1741, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1735, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\pydevd.py", line 1135, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/ratee/PycharmProjects/untitled/fuc.py", line 12, in <module>
    song = AudioSegment.from_mp3("audio.mp3")
  File "C:\Users\ratee\PycharmProjects\untitled\venv\lib\site-packages\pydub\audio_segment.py", line 716, in from_mp3
    return cls.from_file(file, 'mp3', parameters=parameters)
  File "C:\Users\ratee\PycharmProjects\untitled\venv\lib\site-packages\pydub\audio_segment.py", line 665, in from_file
    info = mediainfo_json(orig_file)
  File "C:\Users\ratee\PycharmProjects\untitled\venv\lib\site-packages\pydub\utils.py", line 263, in mediainfo_json
    res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
  File "C:\Users\ratee\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 756, in __init__
    restore_signals, start_new_session)
  File "C:\Users\ratee\AppData\Local\Programs\Python\Python37\lib\subprocess.py", line 1155, in _execute_child
    startupinfo)
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.1\helpers\pydev\_pydev_bundle\pydev_monkey.py", line 452, in new_CreateProcess
    return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args)
FileNotFoundError: [WinError 2] The system cannot find the file specified
print(AudioSegment.ffmpeg)

按预期返回

  

C:\ Users \ ratee \ PycharmProjects \ untitled \ ffmpeg \ bin \ ffmpeg.exe

print(my_file) returns

按预期返回

  

audio.mp3

并且代码在我尝试导入音频的位置停止运行

  

audio = AudioSegment.from_mp3(“ audio.mp3”)

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但是显然即使添加了ffmpeg路径,它仍然会给出相同的错误。我在Linux中尝试了此操作,没有使用AudioSegment.converter = 'path\to\ffmpeg'这样的附加命令,它工作正常,问题出在Windows IDE(pycharm,spyder等)上。尝试直接从Windows中的提示符(anaconda,cmd等)运行脚本。应该可以。

引用:https://github.com/jiaaro/pydub/issues/319

答案 1 :(得分:0)

这不是一个尝试,只是出于比较原因而尝试重现OP错误的尝试。文件夹名称x,y用于缩短路径长度。

c:\x\lib\site-packages\pydub\utils.py:165: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
  warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
c:\x\lib\site-packages\pydub\utils.py:193: RuntimeWarning: Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work
  warn("Couldn't find ffprobe or avprobe - defaulting to ffprobe, but may not work", RuntimeWarning)
Traceback (most recent call last):
  File "C:\y\lol.py", line 16, in <module>
    audi = AudioSegment.from_mp3("audio.mp3")
  File "c:\x\lib\site-packages\pydub\audio_segment.py", line 716, in from_mp3
    return cls.from_file(file, 'mp3', parameters=parameters)
  File "c:\x\lib\site-packages\pydub\audio_segment.py", line 665, in from_file
    info = mediainfo_json(orig_file)
  File "c:\x\lib\site-packages\pydub\utils.py", line 263, in mediainfo_json
    res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE)
  File "c:\x\lib\subprocess.py", line 676, in __init__
    restore_signals, start_new_session)
  File "c:\x\lib\subprocess.py", line 957, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified

以下代码:

AudioSegment.ffmpeg = os.getcwd()+"\\ffmpeg\\bin\\ffmpeg.exe"
print (AudioSegment.ffmpeg)
  

1)C:\ y \ ffmpeg \ bin \ ffmpeg.exe

并且:

my_file = Path("audio.mp3")
print (my_file) 

给予:

  

2)audio.mp3

建议的解决方案

包括以下特定代码行以指定ffmpeg的位置:

pydub.AudioSegment.converter = r"C:\\path\\to\\ffmpeg.exe",其中 path \ to \ 是实际路径

你应该没事。

更新1

引发您的错误是由于使用了“ my_file”中的文件名而不是AudioSegment.from_mp3(my_file)所要求的“ filepath”。通过提供文件路径,可以解决出现的 [WinError2] 问题。

在以下脚本中运行时,会发生AttributeError: 'WindowsPath' object has no attribute 'read'错误。该错误与pathlib相关,并且应该已经在pydub 0.22版本中进行了修复,如github上的here所述。我在Github上提出了issue

引发的file.read()问题与python版本相关(2.7与3.5),因为它不再存在于内置库中。因此,.read()会触发AttributeError: 'WindowsPath' object has no attribute 'read'错误。

from pydub import silence, AudioSegment
from pathlib import Path

import os, sys

print (sys.version)

#AudioSegment.ffmpeg = os.getcwd()+"\\ffmpeg\\bin\\ffmpeg.exe"

AudioSegment.converter = r"C:\\x\\build\\win\\64\\ffmpeg.exe"
AudioSegment.ffprobe   = r"C:\\x\\build\\win\\64\\ffprobe.exe"

#print (AudioSegment.converter)
#print (AudioSegment.ffprobe)

my_file = Path("C:\\y\\audio.mp3")

print ('ID1 : %s' % my_file) 

audio = AudioSegment.from_mp3(my_file)    # solves ***[WinError2]*** issue.

答案 2 :(得分:0)

我遇到了同样的问题。

pydub.AudioSegment.converter = os.getcwd()+ "\\ffmpeg.exe"                    
pydub.AudioSegment.ffprobe   = os.getcwd()+ "\\ffprobe.exe"
sound = pydub.AudioSegment.from_mp3(os.getcwd()+"\\sample.mp3")

一切正常