【发布时间】:2023-04-05 22:55:01
【问题描述】:
我想使用 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,或将其杀死并因此产生相同的损坏(我不记得我尝试过的每个信号)
【问题讨论】:
-
如果有人对如何以编程方式从网络摄像头捕获视频(即从脚本启动/终止)有更好的想法,欢迎您。
-
尝试使用带有套接字的rc interface。我在this answer 中有一个例子。
-
Windows 没有信号,因此您只能将
CTRL_C_EVENT
和CTRL_BREAK_EVENT
发送到您所附加到的控制台中的进程组 - 或附加到控制台的所有进程(包括您自己的)通过定位组 0。当您创建一个进程时,您可以通过创建标志CREATE_NEW_PROCESS_GROUP
将其分配为新组的领导,这仅在它是控制台进程时才有意义 - 或稍后分配控制台.这个创建标志在这个过程中禁用了 Ctrl+C,所以除非它手动启用它,否则你可以可靠地发送是 Ctrl+Break。 -
@eryksun 您使用 rc_interface 的解决方案非常酷。谢谢。我为我的项目调整了它:gist.github.com/knthls/29f46a2699daea02afe7e389b311b452 它解决了 VLC 以常规方式终止的问题。但是我收到了我见过的怪异错误消息:[0049445c] core interface error: read error: No error 而且它产生的视频仍然没有正确的时间索引,所以我的假设可能是,这不是完全终止 vlc 是错误的。
-
好的,将 sout 中的复用器设置为 ps 就可以了
标签:
python
windows
command-line
subprocess
vlc
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:VLC – 通过 windows/python 上的命令行以交互方式终止流/转码/windows 上的编程视频捕获 - Python技术站