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é)
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
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
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