2017-06-04 16 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

簡單的答案,但非常聰明:)非常感謝你,它的工作! –