为什么`subprocess.call`没有调用该命令

时间:2014-06-06 16:47:50

标签: python ffmpeg

我尝试使用以下代码中的subprocess.call(shell=True)通过ffmpeg运行.wav文件,但它似乎无法运行。我知道这是因为output_file没有创建,我在open()方法中获得了异常。 我做错了什么?

try:
    import pocketsphinx

except:
    import pocketsphinx as ps
    import sphinxbase
    import subprocess
    import os

hmmd = "../../Pocketsphinx_Files/en-us-8khz"
lmdir = "../../Pocketsphinx_Files/cmusphinx-5.0-en-us.lm"
dictp = "../../Pocketsphinx_Files/cmu07a.dic"

output_filename = "../../temp/ps_output.wav"

def recognize(filename="../../temp/temp_output.wav"):

    command = "ffmpeg -i "+filename+" -ac 1 -ab 16 -ar 16000 "+output_filename

    subprocess.call(command,shell=True)

    wavFile = open(output_filename,"rb")

    speechRec = ps.Decoder(hmm = hmmd, lm = lmdir, dict = dictp)

    wavFile.seek(44)

    speechRec.decode_raw(wavFile)

    result = speechRec.get_hyp()

    #os.remove(filename)
    #os.remove(output_filename)

    return result

if __name__=="__main__":
    print(recognize())

编辑:我已经安装了ffmpeg。 此外,当我从python解释器运行subprocess.call()命令时,它似乎工作。这就是我难以接受的原因。

1 个答案:

答案 0 :(得分:1)

我建议您尝试使用subprocess.check_call()check_output而不是call。如果您的程序无法正确执行,它们将引发异常,而不是让您想知道为什么没有生成输出。

我猜你可能会在Python环境中遇到可执行文件的路径问题

尝试将此功能与&fffmpeg':

一起使用
def is_exe(prog):
    for path in os.environ["PATH"].split(os.pathsep):
        if os.path.isfile(os.path.join(path, prog)):
            if os.access(os.path.join(path, prog), os.X_OK):
                return os.path.join(path, prog)
            else:
                print "Program '%s' found in '%s', but lacks executable permissions." % (prog, path)
    return False

如果它返回False,你就会遇到运行ffmpeg的Python的问题,否则它的ffmpeg会在你的论证中出现问题。