从Python执行ffmpeg

时间:2016-03-24 13:54:07

标签: python python-3.x ffmpeg

我正在尝试在目录中的所有WAV文件上运行ffmpeg以将它们转换为mp3。当我从Fedora Linux机器上的命令行运行它时,此命令正常工作:

/usr/bin/ffmpeg -i "Name With Spaces.wav" Name_With_Spaces.mp3

其中Name With Spaces.wav是当前目录中的文件。但是,在Python 3.2中运行在同一目录中:

import os
files = os.listdir()
os.execl('/usr/bin/ffmpeg', '-i \"' + files[0] + '\"', files[0][:-4].replace(' ', '_') + '.mp3')

给我错误(来自ffmpeg):必须至少指定一个输入文件。我不明白为什么这不起作用,因为'-i \"' + files[0] + '\"'评估为-i "Name With Spaces.wav"files[0][:-4].replace(' ', '_') + '.mp3'评估为Name_With_Spaces.mp3

我尝试使用不同的引号转义空格,使用完整路径(如/home/.../music/Name\ With\ Spaces.wav),并实际用真实文本替换参数,但没有任何效果。我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

如果你想使用os.execl方法,你必须稍微修改你的语法,-i必须作为列表中的不同项目

import os
files = os.listdir()
# Separated the args to make it clear
args = '/usr/bin/ffmpeg', '-i', files[0], files[0][:-4].replace(' ', '_') + '.mp3'
# Yes, the binary appears twice
os.execl('/usr/bin/ffmpeg', *args)
  

各种exec *函数采用新的参数列表   程序加载到进程中。在每种情况下,第一个   参数作为自己的名称而不是作为自己的名称传递给新程序   用户可能在命令行上键入的参数。对于C   程序员,这是传递给程序的main()的argv [0]。对于   例如,os.execv('/ bin / echo',['foo','bar'])只会打印条形图   标准输出; foo似乎会被忽略。

来源https://docs.python.org/2/library/os.html#process-management

答案 1 :(得分:-1)

我认为它与os.execl如何读取您发送的输入有关。从文档中,它将每个参数解释为一个单独的参数,而不是一组参数。因此,它在内部做的事情比" ".join()你给它的论点更聪明。它可能会在您发送的每个参数中转义出引号外的任何空格。

解决问题的一种方法是拆分" -i"参数其余部分的参数的一部分:

os.execl('/usr/bin/ffmpeg', '-i', \"' + files[0] + '\", files[0][:-4].replace(' ', '_') + '.mp3')

为了理智,如果您使用os.system执行相同的代码,它应该有效:

os.system(" ".join(['/usr/bin/ffmpeg', '-i \"' + files[0] + '\"', files[0][:-4].replace(' ', '_') + '.mp3']))

或者,您可以使用子流程:

import subprocess
subprocess.call(['/usr/bin/ffmpeg', '-i', \"' + files[0] + '\", files[0][:-4].replace(' ', '_') + '.mp3'])