2017-01-27 2 views
0

beenden Ich möchte vlc Befehlszeilenprogramm verwenden, um ein Video von einer USB-Kamera (unter Windows!) Zu erfassen. Das Problem ist, dass nicht klar ist, wann die Aufnahme gestoppt werden soll. Ziel ist es, das Gesicht des Benutzers zu erfassen, während er das Programm ausführt. Es ist wichtig, das richtige Timing zu haben. Ich bin startet vlc wie folgt aus:VLC - Stream/Transcoding interaktiv über die Befehlszeile auf Windows/Python/Programmatic Video Capture auf Windows

cmd = ['C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe', 'dshow://', 
'--dshow-size=640x480', '--dshow-adev=None', '--dshow-fps=30', 
'--dshow-vdev=USB_Camera', 
'--sout=#transcode{vcodec=h264,vb=1024,fps=30,width=640,deinterlace} 
:standard{access=file,mux=ps,dst= 
"path\\to\\dstfile"}', 
'--qt-start-minimized'] 

p = subprocess.Popen(cmd) 

# ... user interaction and stuff ... 

# ???? can i do sth. better here ??? 
p.kill() 

Das Problem mit dem Anruf zu töten, dass der Transcodierungsprozess unterbrochen wird, die die Videodatei korrumpiert (es ist immer noch spielbar, aber es gibt Dummy-Frames am Ende, und Bildrate/Anzeigezeit stimmt nicht überein).

Meine Frage: Gibt es irgendeine saubere Möglichkeit, den Prozess korrekt zu beenden? Jedes andere Signal I zu verwenden versucht, wie

signal.SIGINT 
signal.CTRL_C_EVENT 
... 

fehlgeschlagen vlc zu beenden, oder es getötet und erzeugt somit die gleiche Korruption (ich erinnere mich nicht jedes Signal habe ich versucht)

+0

Wenn jemand eine bessere Idee hat, wie von einer Webcam Video erfassen programmatisch (dh Start/vom Skript beenden) Sie sind willkommen. – knthls

+0

Versuchen Sie, die [rc-Schnittstelle] (https://wiki.videolan.org/Documentation:Modules/rc) mit einem Socket zu verwenden. Ich habe ein Beispiel in [dieser Antwort] (http://stackoverflow.com/a/8111621/205580). – eryksun

+1

Windows hat keine Signale. Daher können Sie "CTRL_C_EVENT" und "CTRL_BREAK_EVENT" nur an eine Prozessgruppe in der Konsole senden, der Sie zugeordnet sind - oder an alle Prozesse, die an die Konsole (einschließlich Ihrer eigenen) angehängt sind 0. Wenn Sie einen Prozess erstellen, können Sie ihn als Lead einer neuen Gruppe über das Erstellungs-Flag "CREATE_NEW_PROCESS_GROUP" zuweisen, was nur sinnvoll ist, wenn es sich um einen Konsolenprozess handelt - oder später eine Konsole zuweist. Dieses Erstellungs-Flag deaktiviert Ctrl + C während des Prozesses. Wenn Sie es also nicht manuell aktivieren, können Sie zuverlässig Ctrl + Break senden. – eryksun

Antwort

0

Ok, so this Antwort hat den Trick, vlc regelmäßig herunterzufahren. In meinem Fall „ts“ Ich auch notwendig, um die muxer im sout-Standard zu setzen, ein Video mit einer korrekten Zeitindex zu erhalten, so dass der Befehl sieht nun wie folgt aus:

cmd = ['C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe', 'dshow://', 
     '--dshow-size=640x480', '--dshow-adev=None', '--dshow-fps=30', 
     '--dshow-vdev=USB_Camera', 
     '--sout=#transcode{vcodec=h264,vb=1024,fps=30,width=640,deinterlace} 
     :standard{access=file,mux=ts,dst= 
     "path\\to\\dstfile"}', 
     '--qt-start-minimized'] 

Meine vollständige Lösung kann finden Sie hier:

https://gist.github.com/knthls/d67f06cbb87f85c4f39ffa2ba2ef66df