【问题标题】:VLC - terminate stream/transcoding interactively via command line on windows/ python / programmatic video capture on windowsVLC - 通过 windows/python 上的命令行以交互方式终止流/转码/windows 上的编程视频捕获
【发布时间】: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_EVENTCTRL_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