2017-01-27 19 views
0

Я хочу использовать инструмент командной строки vlc для захвата видео с USB-камеры (на Windows!). Проблема в том, что неясно, когда прекращать запись. Цель состоит в том, чтобы захватить лицо пользователей, когда он запускает программу. Важно иметь правильное время. Я запуск VLC как это:VLC - прерывать поток/транскодирование интерактивно через командную строку на windows/python/программный захват видео на окнах

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

Проблема с вызовом, чтобы убить в том, что процесс перекодировки прерывается, который портит видео файла (он по-прежнему играть, но есть фиктивные кадры в конце концов, и частота кадров/время отображения не выравниваются).

Мой вопрос: Есть ли какая-либо чистая возможность закончить процесс правильно? Любой другой сигнал, я пытался использовать, как

signal.SIGINT 
signal.CTRL_C_EVENT 
... 

не удалось прекратить VLC, или убили его и, таким образом, получают ту же коррупцию (я не помню, каждый сигнал, я пытался)

+0

Если кто-нибудь имеет лучшее представление о том, как захватить видео с веб-камеры программным способом (т.е. запуск/прекратить из сценария), вы радушны. – knthls

+0

Попробуйте использовать интерфейс [rc] (https://wiki.videolan.org/Documentation:Modules/rc) с помощью сокета. У меня есть пример в [этом ответе] (http://stackoverflow.com/a/8111621/205580). – eryksun

+1

Windows не имеет сигналов, поэтому вы можете отправлять команды CTRL_C_EVENT и CTRL_BREAK_EVENT в группу процессов в консоли, к которой вы подключены, или все процессы, подключенные к консоли (включая вашу собственную), с помощью группы таргетинга 0. Когда вы создаете процесс, вы можете назначить его как лидерство новой группы с помощью флага создания 'CREATE_NEW_PROCESS_GROUP', что имеет смысл только в том случае, если это консольный процесс, или позже выделяет консоль. Этот флаг создания отключает Ctrl + C в процессе, поэтому, если он вручную не включает все, что вы можете надежно отправить, это Ctrl + Break. – eryksun

ответ

0

Итак, this Ответ сделал трюк, чтобы регулярно закрывать vlc. В моем случае я также необходимо установить мультиплексор в SOUT-стандарта «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