2017-06-04 81 views
2

奇怪的问题,我用这个命令,通过ffmpeg的捕捉到我的网络摄像头(通过CMD在Windows上):的ffmpeg通过蟒子不能在这里找到相机

ffmpeg -y -t 300 -rtbufsize 1024M -f dshow -i video="Lenovo EasyCamera" -c:v libx264 -preset veryslow -crf 25 Desktop.mkv 

,一切工作正常。但是,当我尝试通过Python作为一个子进程非常相同的命令失败。下面是Python代码:

from subprocess import Popen 
cmd = ['ffmpeg', '-y', '-t', '300', '-rtbufsize', '1024M', '-f', 'dshow', '-i', 'video="Lenovo EasyCamera"', '-c:v', 'libx264', '-preset', 'veryslow', '-crf', '25', 'Desktop.mkv'] 
p = Popen(cmd) 

输出下列错误和冻结:

[dshow @ 00000000023a2cc0] Could not find video device with name ["Lenovo EasyCamera"] among source devices of type video. 
video="Lenovo EasyCamera": I/O error 

任何人都可以算出来,并告诉我什么,我做错了什么?或者它是一些在python或子进程模块中的已知错误(使用python 3.6.1,但如果它能帮助我解决这个问题,则不附加到特定版本)?

在此先感谢!

P.S.这个问题是一个跟进这一项,如果是相关的:How to grab laptop webcam video with ffmpeg in windows

+0

我有过类似的问题。试试'Popen(“ffmpeg -y -t 300 ...”,shell = True)'。 –

+0

如何使用'subprocess.call(cmd)'尝试? –

+0

shell = True没有区别,subprocess.call不冻结,但仍然输出相同的错误 –

回答

4

的问题是,在命令行,video="Lenovo EasyCamera"使用引号,以确保空间不会使它的另一个理由。

您可以与测试Python文件看到:

import sys 
print(sys.argv[1:]) 
> python print_argv.py video="Lenovo EasyCamera" 
['video=Lenovo EasyCamera'] 
> python print_argv.py "video=Lenovo EasyCamera" 
['video=Lenovo EasyCamera'] 
> python 
>>> from subprocess import Popen 
>>> cmd = ['python', 'print_argv.py', 'video="Lenovo EasyCamera"'] 
>>> p = Popen(cmd) 
['video="Lenovo EasyCamera"'] 

的ffmpeg认为你正在寻找一个叫做"Lenovo EasyCamera"代替Lenovo EasyCamera

所以设备,你需要改变您的命令,以便它不在引号中,因为Popen不会将其分隔在空格上。

from subprocess import Popen 
cmd = [..., '-i', 'video=Lenovo EasyCamera', ...] 
p = Popen(cmd) 
+0

简单的答案,但非常聪明:)非常感谢你,它的工作! –