2017-01-27 1 views
0

Je veux utiliser l'outil de ligne de commande vlc pour capturer une vidéo à partir d'une caméra USB (sur Windows!). Le problème est que ce n'est pas clair, quand arrêter l'enregistrement. Le but est de capturer les utilisateurs face, pendant qu'il exécute le programme. Il est important d'avoir un bon timing. Je lance vlc comme ceci:VLC - Terminer le flux/transcodage interactivement via la ligne de commande sur Windows/python/capture vidéo programmatique sur 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() 

Le problème avec l'appel à tuer est que le processus de transcodage est interrompu, ce qui corrompt le fichier vidéo (il est encore jouable, mais il y a des cadres factices à la fin, et la fréquence d'image/temps d'affichage ne s'aligne pas).

Ma question: Y a-t-il une possibilité de terminer le processus correctement? Tout autre signal que j'ai essayé d'utiliser, comme

signal.SIGINT 
signal.CTRL_C_EVENT 
... 

n'a pas fin vlc ou tué et donc produit la même corruption (je ne me rappelle pas tous les signaux que j'ai essayé)

+0

Si quelqu'un a une meilleure idée de comment capturer de la vidéo à partir d'une webcam programme (c.-à-lancement/fin de script), vous êtes les bienvenus. – knthls

+0

Essayez d'utiliser l'interface [rc] (https://wiki.videolan.org/Documentation:Modules/rc) avec un socket. J'ai un exemple dans [cette réponse] (http://stackoverflow.com/a/8111621/205580). – eryksun

+1

Windows n'a pas de signaux, vous ne pouvez donc envoyer 'CTRL_C_EVENT' et' CTRL_BREAK_EVENT' qu'à un groupe de processus dans la console à laquelle vous êtes connecté - ou à tous les processus liés à la console (y compris le vôtre) par groupe de ciblage 0. Lorsque vous créez un processus, vous pouvez l'assigner en tant que responsable d'un nouveau groupe via l'indicateur de création 'CREATE_NEW_PROCESS_GROUP', qui n'a de sens que s'il s'agit d'un processus console - ou plus tard alloue une console. Ce drapeau de création désactive Ctrl + C dans le processus, donc à moins qu'il ne l'active manuellement tout ce que vous pouvez envoyer de manière fiable est Ctrl + Break. – eryksun

Répondre

0

Ok, donc this réponse fait l'affaire de fermer vlc régulièrement. Dans mon cas, je devais aussi régler le muxer dans le sout standard à « ts » afin d'obtenir une vidéo avec un indice de bonne heure, donc la commande ressemble maintenant à ceci:

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'] 

Ma solution complète peut se trouve ici:

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