windows 桌面ffmpeg流媒体分享 录屏hls推流nginx(windows搭建rtmp服务器/hls服务器)
一、 前言
1.本文目的为实现windows下开机自动启动的桌面直播流媒体服务。
2具体方案为定时任务自动启动ffmpeg脚本开启hls流媒体直播,nginx自动启动hls流web服务。
3.网页使用EasyPlayerjs插件播放流媒体视频。(也可以用别的)
4.windows下搭建nginx的rtmp流媒体服务器(rtmp流媒体服务器/hls流媒体服务器)需要为nginx添加nginx-rtmp-module。
5.不过给nginx添加nginx-rtmp-module需要编译,另外一种更方便的方法就是使用带rtmp的nginx 1.7.11.3 Gryphon可以免去编译的步骤。
二、 环境与准备文件
1.官方ffmpeg下载地址:http://www.ffmpeg.org
2.官方nginx 1.7.11.3 Gryphon下载地址:http://nginx-win.ecsds.eu/download
3.官方nginx-rtmp-module下载地址:https://github.com/arut/nginx-rtmp-module
三、 安装nginx、ffmpeg
1.分别下载 nginx 1.7.11.3 Gryphon 和 ffmpeg,都复制到 D:\test 目录下。nginx 1.7.11.3 Gryphon文件夹改名为nginx-1.7.11.3-Gryphon。
2.然后再将下载好的 nginx-rtmp-module 复制到 D:\test\nginx-1.7.11.3-Gryphon\目录下。保证 stat.xls 的目录为:nginx-1.7.11.3-Gryphon\nginx-rtmp-module\stat.xsl。
3.然后配置环境变量:右键我的电脑 》属性 》高级系统设置 》高级 》环境变量 》双击 Path ,将 D:\test\ffmpeg-4.2.1-win64-static\bin 和 D:\test\nginx-1.7.11.3-Gryphon 都添加到 Path 路径下。
4.测试ffmpeg,调用命令行(windows+R输入cmd)输入“ffmpeg –version”,出现版本号说明配置成功。
注意:直接使用nginx没有 nginx-rtmp-module 插件会报错 nginx: [emerg] unknown directive "rtmp" 。想要自己编译请看第二讲:win7下nginx-rtmp-module的编译方法 - 简书 (jianshu.com)
四、 配置nginx.conf文件,启动nginx
1.在 D:\test\nginx-1.7.11.3-Gryphon\conf\ 下新建nginx-win-hls.conf,内容如下
1 worker_processes 2; 2 3 events { 4 worker_connections 8192; 5 } 6 7 rtmp { 8 server { 9 listen 1935; 10 application live { 11 #rtmp直播 12 live on; 13 } 14 application hls { 15 #hls直播 16 live on; 17 hls on; 18 hls_path D:/test/nginx-1.7.11.3-Gryphon/hls/; 19 hls_fragment 5s; 20 } 21 chunk_size 4096; 22 #数据传输块的大小 23 } 24 } 25 26 27 http { 28 include mime.types; 29 default_type application/octet-stream; 30 31 sendfile off; 32 33 server_names_hash_bucket_size 128; 34 35 client_body_timeout 10; 36 client_header_timeout 10; 37 keepalive_timeout 30; 38 send_timeout 10; 39 keepalive_requests 10; 40 41 server { 42 listen 80; 43 server_name localhost; 44 index web/index.html; 45 # 直播页 46 47 location /hls/ { 48 types { 49 application/vnd.apple.mpegurl m3u8; 50 video/mp2t ts; 51 } 52 alias D:/test/nginx-1.7.11.3-Gryphon/hls/; 53 expires -1; 54 } 55 56 location /stat { 57 rtmp_stat all; 58 rtmp_stat_stylesheet stat.xsl; 59 } 60 location /stat.xsl { 61 root nginx-rtmp-module/; 62 } 63 location /control { 64 rtmp_control all; 65 } 66 67 location / { 68 root html; 69 index index.html index.htm; 70 } 71 72 error_page 500 502 503 504 /50x.html; 73 location = /50x.html { 74 root html; 75 } 76 } 77 }
2.按住 windows 键 +R,输入 cmd,进入 cmd 命令窗口,进入 nginx 目录:cd D:\test\nginx-1.7.11.3-Gryphon
,然后启动 nginx 流转换服务器:
nginx.exe -c conf\nginx-win-hls.conf
3.windows查看nginx是否启动
tasklist /fi "imagename eq nginx.exe"
五、 RTMP 推流测试
1.再打开一个 cmd 命令窗口,启动
ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f hls -hls_time 5.0 -hls_list_size 2 -hls_flags 2 D:/test/nginx-1.7.11.3-Gryphon/hls/tv.m3u8
2.启动没有报错,就可以使用vlc播放器打开测是否能看到。
六、 网页展示
1.找到Easyplayer的gitcode地址,下载解压。修改demo里面的index。
<!DOCTYPE html> <html> <head> <title>Live - HLS</title> <link rel="icon" href="./favicon.ico" /> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="renderer" content="webkit" /> <meta name="force-rendering" content="webkit" /> <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport" /> <script type="text/javascript" src="EasyPlayer-element.min.js"></script> <style> #player .easy-player { height: 900px; width: 3200px; position: relative; } </style> </head> <body> <easy-player id="player" video-url="http://127.0.0.1/hls/tv.m3u8" live="true" aspect="3200:900" debug="true" isresolution="true" resolution="yh,fhd,hd,sd" resolutiondefault="yh" ></easy-player> </body> </html>
2.把 demo 文件夹拷贝到 D:\test\nginx-1.7.11.3-Gryphon\html 中,浏览器访问127.0.0.1/demo即可看到直播画面。
七、 编写脚本服务随系统自启动
1.新建text文本,录入以下内容。保存后修改后缀为nginxDaemon.bat。注意此为单独nginx守护,后面有单独的ffmpeg守护一共两个。
title nginx进程守护 rem nginx服务开机自启动,定时监测自启动脚本。 @echo off rem @echo表示让@后面的命令不显示,@本身也不显示。 rem echo显示消息。 rem echo on启用命令回显。 rem echo off表示下面的指令都只执行而不显示,直到再次出现echo on时。 if "%1" == "nginx" goto begin rem 监测是否是第一次启动,防止无限制启动多个实例。如果不是第一次启动那么进入守护检查流程。 mshta vbscript:createobject("wscript.shell").run("%~nx0 nginx",0)(window.close)&&exit rem 检测脚本是否带nginx参数运行,如果不带参数那么立刻带参数启动新脚本,结束当前进程。 rem 当程序运行到goto时,将自动跳转到冒号定义的部分去执行 :begin rem 此处开始为守护检查流程。 rem goto是个跳转命令,紧跟其之后的是标签名;冒号是一个标签标志,紧跟其之后的是标签名,两者合称标签。 set _task=nginx rem 定义任务名称。 rem 程序名字,不区分大小写,去掉.exe后缀,后续通过qprocess对比进程名称用。 set _runexe=start.vbs rem 设置vbs启动脚本,后续通过vbs脚本启动程序。 :checkstart rem 此处开始为守护检查的进程名对比流程。 echo "检查进程" for /f "tokens=5" %%c in ('qprocess.exe ^| find "%_task%"') do ( if %%c==" " ( @echo ) else goto checkag ) rem 遍历qprocess.exe查找任务名称,提取第五列为变量c。然后对比变量c是否为空,如果不为空进入下次检查流程。如果qprocess.exe中没有查到任务名称,那么进入启动流程。 goto startsvr :startsvr rem 此处开始为任务启动流程。 echo ******开始启动程序******* echo 启动时间 %time% >> restart.log rem 重启日志,记录重启时间。 echo set ws=wscript.createobject("wscript.shell") >> %_runexe% rem 写入启动vbs脚本第一行,为定义变量调用wscript。 echo ws.run "D:\test\nginx-1.7.11.3-Gryphon\nginx.exe",0,false >> %_runexe% rem 写入启动vbs脚本第二行,为调用ws运行任务程序。run函数有三个参数,第一个为执行程序路径,如果有空格需要用双引号包裹。第二个参数为窗口风格0为隐藏窗口,一个有10种风格详见https://blog.51cto.com/alany/1568375。第三个参数为是否等待结果才继续执行。 start /b %_runexe% rem 运行启动脚本,但不创建新窗口。 rem 此处为设置下一次检查流程,意味着当前启动已经完成。等待周期时间后再次进入守护检查流程。 echo Wscript.Sleep Wscript.Arguments(0) >%tmp%\delay.vbs rem 在临时目录下建立延迟执行脚本(定时监控用),写入延迟调用并可以接收1个参数的参数集。 rem 窗口中运行 WSCRIPT,命令行中运行 CScrip。 rem wscript直接用窗口输出,适合调试程序和编写小工具。 cscript //b //nologo %tmp%\delay.vbs 30000 rem 延迟30毫秒执脚本 rem //B 批处理模式;隐藏用户提示和脚本错误在命令行中的显示。默认模式是交互模式。 rem //nologo 防止在运行时显示执行标题。默认设置是 logo。 rem cscript因为把输出放进了控制台,所以可以对它重定向方便程序调用。 del %_runexe% /Q rem 删除启动脚本,/Q 安静模式。删除全局通配符时,不要求确认。 echo *******程序启动完成******** goto checkstart rem 进入守护进程检查流程,进行一次检查。来判断是否需要启动或者开启定时下一次再检查。 :checkag rem 此处开始为定时再次检查流程。 echo Wscript.Sleep Wscript.Arguments(0) >%tmp%\delay.vbs cscript //b //nologo %tmp%\delay.vbs 30000 rem 设置下一次检查脚本 goto checkstart rem 进入守护进程检查流程
2.重复以上步骤制作ffmpeg守护脚本,内容如下。
title ffmpeg进程守护 rem ffmpeg桌面直播流服务开机自启动,定时监测自启动脚本。 @echo off if "%1" == "ffmpeg" goto begin mshta vbscript:createobject("wscript.shell").run("%~nx0 ffmpeg",0)(window.close)&&exit :begin set _task=ffmpeg rem 注释1:程序名字,不区分大小写,去掉.exe后缀 set _runexe=startffmpeg.vbs :checkstart echo "检查进程" for /f "tokens=5" %%c in ('qprocess.exe ^| find "%_task%"') do ( if %%c==" " ( @echo ) else goto checkag ) goto startsvr :startsvr echo ******开始启动程序******* for /f "tokens=5" %%c in ('qprocess.exe ^| find "%_task%"') do (echo %%c==%_task% >> restart2.log ) echo 启动时间 %time% >> restart2.log rem 注释2:重启日志,记录重启时间,方便定位 echo set ws=wscript.createobject("wscript.shell") >> %_runexe% echo ws.run "ffmpeg -f gdigrab -i desktop -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f hls -hls_time 5.0 -hls_list_size 2 -hls_flags 2 D:/test/nginx-1.7.11.3-Gryphon/hls/tv.m3u8",0,false >> %_runexe% rem ffmpeg.exe替换成你的程序全名 start /b %_runexe% echo Wscript.Sleep Wscript.Arguments(0) >%tmp%\delayffmpeg.vbs cscript //b //nologo %tmp%\delayffmpeg.vbs 30000 del %_runexe% /Q echo *******程序启动完成******** goto checkstart :checkag echo Wscript.Sleep Wscript.Arguments(0) >%tmp%\delayffmpeg.vbs cscript //b //nologo %tmp%\delayffmpeg.vbs 30000 goto checkstart
3.打开电脑启动项目录,将需要开机启动就执行的bat脚本快捷方式放入此目录下。(或者也可以打开windows定时任务,配置新增任务。)
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
4.重启测试。
八、 参考资料
Windows 10系统下安装FFmpeg教程详解_SLASH-YONG的博客-CSDN博客_windows 安装ffmpeg
Windows 搭建 nginx RTMP 服务器 - fengMisaka - 博客园 (cnblogs.com)
Windows11实现录屏直播,H5页面直播 HLS ,不依赖Flash - 林诺欧巴 - 博客园 (cnblogs.com)
使用Nginx+FFmpeg 将Rtmp转码显示在前端的解决方案_苏筱没猫的博客-CSDN博客_nginx rtmp转码
nginx搭建rtmp服务器(windows) - 知乎 (zhihu.com)
ffmpeg hls_wrap限制生成文件个数命令不生效_ffmpeg吧_百度贴吧 (baidu.com)
Windows 11实现直播,VLC超简单实现捕获、串流、播放 - 林诺欧巴 - 博客园 (cnblogs.com)
mirrors / tsingsee / EasyPlayer.js · GitCode
Windows cmd(bat) 脚本简单使用 - 腾讯云开发者社区-腾讯云 (tencent.com)
Windows下程序的自启动脚本bat(教你直接用)_望夫山居士的博客-CSDN博客_自启动脚本
windows下bat批处理实现守护进程(有日志)_jiangxinyu的博客-CSDN博客_windows进程守护
批处理 FOR参数/F之tokens详解 _ 【IIS7站长之家】
CreateObject("Wscript.Shell")用法 - youxin - 博客园 (cnblogs.com)
WScript.Shell对象的 run()和exec()函数使用详解_Alan_Y (Upspringing)的技术博客_51CTO博客
批处理脚本遍历指定文件夹下的文件_RuncX的技术博客_51CTO博客
WSCRIPT与CScript区别解释_lovely可爱欧辰的博客-CSDN博客
Arguments 属性(WScript 对象) (jb51.net)
Dos del参数与作用(/f/s/q) - 星火卓越 - 博客园 (cnblogs.com)
批处理命令——goto 和 : - kaizenly - 博客园 (cnblogs.com)
QProcess调用外部的exe,判断外部程序是否在运行_one-rabbit的博客-CSDN博客_qprocess判断是否执行成功
@echo是什么意思?_WTCLLB的博客-CSDN博客_@echo
win10 开机自动启动脚本 - 简书 (jianshu.com)
九、 补充
windows关闭nginx命令()
taskkill /f /t /im nginx.exe