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)
Wenn jemand eine bessere Idee hat, wie von einer Webcam Video erfassen programmatisch (dh Start/vom Skript beenden) Sie sind willkommen. – knthls
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
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