未检测到已安装的 ffmpeg。无法转换音频 (python 2.7, mac os x)

installed ffmpeg not detected. Can't convert audio (python 2.7, mac os x)

一般信息:

我在 python 有一个处理音频分类的项目;后端是完整的,但我在前端受苦。后端要求(我无法更改)是音频文件必须为 wav 格式,但我希望用户也能够上传 mp3 文件。我的前端是使用 python 2.7 和 flask 的网络服务器。

所以,我基本上想将 mp3 转换为 wav,但不断出现错误。
(完整代码在最下方,方便大家更清楚地理解问题)

我的尝试:
1- 我使用了 pydub 库

我安装了自制软件、libav 和 ffmpeg
libav安装方法:brew install libav --with-libvorbis --with-sdl --with-theora
ffmpeg安装方法: brew install ffmpeg --with-libvorbis --with-ffplay --with-theora


方法1

sound = AudioSegment.from_file(filename[i], format="mp3") #filename[i]=nameOfFile
sound.export("input.wav", format="wav")


方法2

AudioSegment.from_file(filename[i], format="mp3").export("input.wav", format="wav")


=> 不断收到 "file not found" 和 "cannot detect ffmpeg or avconv" 运行时警告,即使我安装了 ffmpeg 和 libav
=> 当我使用 "from_mp3" 而不是 "from_file" 时出现与上面相同的错误 ("file not found")
=> 尝试使用 "raw" 而不是 "mp3" 并得到 "key error: sample_width"(无法找到此错误的含义)
注意:我确保我在正确的目录中


2- 使用的子进程

import subprocess
subprocess.call(["ffmpeg", "-i",filename[i],"inputAudio.wav"])


=> 得到 "OSError: No such file or directory"


我希望你能帮助我理解问题是什么以及如何解决它......


完整代码:
我把这个放在最上面

app = Flask(__name__)
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
os.chdir(APP_ROOT)


处理音频文件的函数内部

data = request.files.getlist('file') #get all uploaded audio files
fsize = len(data) #number of audio files
i = 0 #index counter

filename = ["" for x in range(fsize)] #LIST TO STORE EACH FILE'S NAME
audiofile = ["" for x in range(fsize)] #LIST TO STORE CLASSIFICATION RESULTS OF EACH FILE


#LOOP THROUGH EACH UPLOADED FILE
for file in data:
    filename[i] = file.filename #ADD FILENAME TO LIST ABOVE
    destination = str(APP_ROOT)

有问题的部分:

    if file.filename.endswith(".mp3"):
        from pydub import AudioSegment
        t = destination + "/" + filename[i]
        file.save(t) #SAVE UPLOADED MP3 FILE TO EXTRACT IT USING PYDUB

        sound = AudioSegment.from_file(filename[i], format="mp3")
        sound.export("input.wav", format="wav")
        os.remove(t) #DELETE MP3 FILE, WE ONLY WANT WAV
        destination +=  "/inputAudio.wav"

代码续:

#STORE AUDIO FILE TO PREPARE FOR PROCESSING (CLASSIFICATION)
    else:
        destination +=  "/inputAudio.wav"
        file.save(destination)

#FINAL STEP
    audiofile[i]=Raudio.start() #AUDIO PROCESSING (CLASSIFICATION)
    os.remove(destination) #DELETE AUDIO FILE TO PREVENT CLUTTERING OF FILES
    i += 1 #INCREMENT FILE INDEX

好的,我找到了解决这个问题的方法。

我最终从 this site 下载了 FFmpeg 二进制文件。
然后我将下载文件的所有内容复制粘贴到以下路径:

Macintosh HD/Library/Frameworks/Python.framework/Versions/2.7

这也是 python exec 所在的位置,我记得在某处读到问题可能是在 python 或其他路径中找不到 ffmpeg。

所以……终于成功了!我想分享解决方案,因为这个问题占据了我周末的大部分时间,我希望它可以帮助其他人解决他们的问题,