bat监控进程并启动,并隐藏黑窗口
背景:
调研海康威视监控的时,发现实现在前端的实时监控需要用到ffmpeg转码推流技术
但是ffmpeg有一个缺点就是,有时候ffmpeg.exe 进程会异常结束,这是就需要对其进行监控,并重新启动
手动发现并启动在测试环境下还可以应付,但是如果在生产环境下还手动启动,那就是有点难以接受。
在网上查了一大推,决定用windos的批处理来解决问题
目的:
Windos下的进程监控,和启动,
技术:
批处理脚本bat文件,结合vbs文件优化
代码如下:
@echo off
title CheckAndStart
:again
tasklist|findstr -i "ffmpeg.exe"
if ERRORLEVEL 1 (
echo ffmpeg is off in %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2%
start "" "E:\WorkCode\Video\Web\FFmpeg\bin\ffmpeg.exe" -i "rtsp://admin:a123456789@192.168.31.222:554/h264/ch1/main/av_stream" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://120.204.202.124:8058/supersecret
)
choice /t 10 /d y /n > nul
goto again
以上代码直接用TXT文件保存成.bat文件即可
以上bat脚本实现的是,对"ffmpeg.exe"进程的监控,一旦进程不存在,就会启动该进程;
这里面由于ffmpeg.exe程序的启动,需要带参数,所以start后面会有很多的"";
第一个""是为了说明后面的参数可以接受空格;
-i "rtsp://admin:a123456789@192.168.31.222:554/h264/ch1/main/av_stream" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://120.204.202.124:8058/supersecret
以上的一段的参数全部为ffmpeg.exe进程启动时所需要的参数;其中有拉流的地址,和推流的地址,拉流地址是一个单独的字符串
choice /t 10 /d y /n > nul
这段代码可以定义多长时间循环一次,本次定义为10秒循环一次
问题:
以上代码能够解决监控进程,并自启进程的问题
但是并不完善,因为及时把bat设置成电脑的开机自启,bat执行时也会出现一个cmd的黑窗口,而bat调用ffmpeg程序时也会再次弹出ffmpeg程序的黑色窗口
这两个黑色窗口怎么隐藏便是现在急需解决的问题:
隐藏第一个bat文件自己的黑窗口,可以通过在bat文件中添加一个头能解决:
代码如下:
rem 用于静默后台运行,去掉该指令,命令窗口会常驻
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
隐藏后的bat进程变为了后台运行,如果想手动关闭,需要用去任务管理器中关闭
隐藏第二个启动ffmpeg程序的黑窗口,并不简单
我才用的是用vbs脚本文件来启动ffmpeg.exe文件实现隐藏
解决:
vbs脚本文件(.vbs)代码如下:
DIM objShell
set objShell = wscript.createObject("wscript.shell")
command= "E:\WorkCode\Video\Web\FFmpeg\bin\ffmpeg.exe"
objShell.run command,vbhide
vbhide起到的作用就是隐藏ffmpeg程序窗口的目的,若是后面跟参数直接在字符串中添加就行,至于参数中的双引号的解决方法就是用""来代替每一个"
完整如下:
command= "E:\WorkCode\Video\Web\FFmpeg\bin\ffmpeg.exe -i ""rtsp://admin:a123456789@192.168.31.222:554/h264/ch1/main/av_stream"" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://120.204.202.124:8058/supersecret"
最终方案:
编写CheckAndStart.bat文件和Start.vbs文件;CheckAndStart.bat文件用来监控ffmpeg,一旦ffmpeg没有,启动Start.vbs文件;Start.vbs文件用来后台移动ffmpeg文件
最终代码如下:
CheckAndStart.bat文件代码
@echo off
rem 用于静默后台运行,去掉该指令,命令窗口会常驻
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
title CheckAndStart
:again
tasklist|findstr -i "ffmpeg.exe"
if ERRORLEVEL 1 (
echo ffmpeg is off in %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2%
start "" "E:\WorkCode\Video\Web\FFmpeg\bin\start.vbs"
)
choice /t 10 /d y /n > nul
goto again
Start.vbs文件代码
DIM objShell
set objShell = wscript.createObject("wscript.shell")
command= "E:\WorkCode\Video\Web\FFmpeg\bin\ffmpeg.exe -i ""rtsp://admin:a123456789@192.168.31.222:554/h264/ch1/main/av_stream"" -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 http://120.204.202.124:8058/supersecret"
objShell.run command,vbhide
可以把CheckAndStart.bat文件设置为开机自启