猿问

FFMpeg 使用 python 子进程给出无效参数错误

我正在尝试将文件或麦克风流转换为 22050 采样率并将速度更改为双倍。我可以使用带有以下代码的终端来做到这一点;

#ffmpeg -i test.mp3 -af asetrate=44100*0.5,aresample=44100,atempo=2 output.mp3

但我不能用 python 子进程运行这个终端代码。我尝试了很多事情,但每次都失败了。一般来说,我正在采用请求的输出格式“asetrate”或“aresample”或“atempo”不适合输出格式错误。无效的论点。我如何运行它并使用管道获取流?

song = subprocess.Popen(["ffmpeg.exe", "-i", sys.argv[1], "-f", "asetrate", "22050", "wav", "pipe:1"],
                        stdout=subprocess.PIPE)


慕村9548890
浏览 200回答 2
2回答

临摹微笑

你的两个命令是不同的。尝试:song = subprocess.Popen(["ffmpeg", "-i", sys.argv[1], "-af", "asetrate=22050,aresample=44100,atempo=2", "-f", "wav", "pipe:1"],-af用于音频过滤器。-f是手动设置复用器/输出格式

猛跑小猪

ffmpeg将所提供的任何内容解释-af为单个参数,然后它将在内部解析为单独的参数,因此在传递之前将它们分开Popen不会达到同样的效果。使用终端的初始示例应使用Popenas创建subprocess.Popen([    'ffmpeg', '-i', 'test.mp3', '-af', 'asetrate=44100*0.5,aresample=44100,atempo=2',    'output.mp3',])因此,对于您使用管道的实际示例,请尝试以下操作:song = subprocess.Popen(    ["ffmpeg.exe", "-i", sys.argv[1], "-f", "asetrate=22050,wav", "pipe:1"],    stdout=subprocess.PIPE)然后,您将需要调用song.communicate()以获取由ffmpeg.exe.
随时随地看视频慕课网APP

相关分类

Python
我要回答