2017-06-04 5 views
2

Weird-Problem zu finden, die ich mit diesem Befehl meine Webcam durch ffmpeg aufzeichnen zu können (durch cmd auf Windows):ffmpeg durch Python subprocess versagt hier Kamera

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

und alles funktioniert. Aber wenn ich den gleichen Befehl über Python als Subprozess ausprobiere, scheitert es. Hier ist der Python-Code:

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) 

Ausgänge folgende Fehler und friert:

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

Kann jemand dies herauszufinden, und mir sagen, was ich falsch mache? Oder ist es ein bekannter Fehler in Python oder dem Unterprozessmodul (mit Python 3.6.1, aber nicht an die spezifische Version angefügt, wenn es mir helfen wird, dieses Problem zu lösen)?

Vielen Dank im Voraus!

P.S. Diese Frage ist zu diesem Follow-up, wenn das relevant ist: How to grab laptop webcam video with ffmpeg in windows

+0

Ich hatte ein ähnliches Problem. Probiere 'Popen (" ffmpeg -y -t 300 ... ", shell = True)'. –

+0

Was ist mit versuchen mit 'subprocess.call (cmd)'? –

+0

shell = True macht keinen Unterschied, subprocess.call nicht einfrieren, aber immer noch den gleichen Fehler –

Antwort

4

Das Problem ist, dass in der Kommandozeile, video="Lenovo EasyCamera" die Anführungszeichen verwenden der Raum um sicherzustellen, dass es nicht ein weiteres Argument machen.

Sie diese mit einer Test Python-Datei sehen:

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 denkt, dass Sie sich für ein Gerät suchen genannt "Lenovo EasyCamera" statt Lenovo EasyCamera

Also, müssen Sie ändern Ihr Befehl, so dass es nicht in Anführungszeichen ist, wie Popen wird es nicht auf Leerzeichen aufgeteilt.

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

einfache Antwort, aber sehr smart :) Vielen Dank, es hat funktioniert! –