VLC - 通过 windows/python 上的命令行以交互方式终止 stream/transcoding/windows 上的程序化视频捕获

VLC - terminate stream/transcoding interactively via command line on windows/ python / programmatic video capture on windows

我想使用 vlc 命令行工具从 USB 摄像头捕捉视频(Windows!)。问题是不清楚什么时候停止记录。目的是捕捉用户的脸,而他是运行程序。掌握正确的时间很重要。我正在像这样启动 vlc:

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

调用kill的问题是转码过程被打断,破坏了视频文件(还能播放,但最后有假帧,帧率/显示时间没有对齐)。

我的问题:是否有任何干净的可能性来正确终止进程?我尝试使用的任何其他信号,例如

signal.SIGINT
signal.CTRL_C_EVENT
...

未能终止 vlc,或杀死它并因此产生相同的损坏(我不记得我尝试过的每个信号)

好的,所以 this 答案成功地定期关闭了 vlc。在我的例子中,我还需要将 sout-standard 中的 muxer 设置为 "ts" 以获得具有正确时间索引的视频,因此命令现在如下所示:

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

我的完整解决方案可以在这里找到:

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

最好的答案是 mux=ts,如果没有这个神奇的参数,我们就无法在命令行中使用 VLC 来保存文件。当你想将 RTSP 流从 IP 摄像机保存到文件时,我添加了一个案例

vlc -vvv -Idummy "rtsp://admin:yourpassword@192.168.1.12:554/onvif1" --sout #transcode{vcodec=h264,scale=Auto,acodec=none,scodec=none}:standard{access=file,mux=ts,dst="D:\mov.mp4"}" 

例如 10 分钟后,您想停止,请选择

taskkill /f /IM "vlc.exe"

使用上面的命令行可以让VLC变成NVR来录制网络摄像机 PS: 解码,编码需要太多的高级知识,而我们只是想应用到我们的简单案例中。所以最好如果有人可以总结一下 VLC 的使用情况并制作一个 github 页面