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
posted @ 2022-09-07 16:23  eastegg  阅读(3621)  评论(0编辑  收藏  举报