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

时间:2017-11-17 20:56:56

标签: macos audio ffmpeg pydub

一般信息:

我在python中有一个处理音频分类的项目;后端已经完成,但我在前端受到了影响。后端要求(我无法改变)是音频文件必须是 wav 格式,但我希望用户也能够上传mp3文件。我的前端是使用python 2.7和flask的Web服务器。

所以,我基本上想将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")


=>保持得到"文件未找到"并且"无法检测到ffmpeg或avconv"运行时警告即使我安装了ffmpeg和libav
=>当我使用" from_mp3"时出现同样的错误("找不到文件")而不是" from_file"
=>尝试使用" raw"而不是" mp3"得到了"关键错误:sample_width" (无法找到此错误的含义)
注意:我确定我在正确的目录中


2-使用过的子过程

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


=>得到" OSError:没有这样的文件或目录"


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


完整代码: 我在顶部有这个

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

1 个答案:

答案 0 :(得分:2)

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

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

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

这也是python exec的地方,我记得在某处读到问题可能是ffmpeg无法在python的路径中找到。

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