美文网首页
实时监控:nginx-rtmp-module搭建流媒体服务器

实时监控:nginx-rtmp-module搭建流媒体服务器

作者: 一千份烧鹅腿 | 来源:发表于2019-11-25 17:17 被阅读0次

    需求:

        搭建流媒体服务器,用户可以通过流rtmp://localhost:1935/live/Xxx推送视频给服务器,其他用户可以通过rtmp://localhost/live/Xxx拉去流实现实时监控

        ps:使用nginx-rtmp-module会有3秒左右的延迟时间

    1:安装nginx-rtmp-module插件

    1:官方github地址:https://github.com/arut/nginx-rtmp-module

    2:以下是在nginx安装了得情况下,安装插件

        查看nginx已有配置

    /usr/local/nginx/sbin/nginx -V

    2:增加nginx-rtmp-module模块

        配置增加 --add-module=/nginx-rtmp-module --with-http_ssl_module

        --prefix为覆盖nginx文件,这里可以不配置,默认地址是 /nginx-1.12.1/objs/ 

        make编译后就会生成nginx文件

    ./configure --prefix=/usr/local/nginx --add-module=/nginx-rtmp-module --with-http_ssl_module

    make

    3:把nginx文件拷贝到 /usr/local/nginx/sbin/nginx,记得备份之前的

    4:重启nginx

    5:查看配置信息,是否更新

    6:nginx.conf文件在http{}同级增加rtmp{},重启,查看error.log文件是否报错

    rtmp {

    }

    注意:配置nginx之前记得关闭nginx服务,否则会报unknown directive "rtmp"错误

    2:配置Nginx.conf

    nginx会通过on_connet回调到地址,返回码为2xx就可以连接成功

    on_publish为推送视频回调地址,在此可以获取rtmp://localhost/live/Xxx的Xxx参数(可以理解为直播中的房间号)

    具体各参数可查看https://www.cnblogs.com/boonya/p/8022117.html

    官方说明:https://github.com/arut/nginx-rtmp-module/wiki/Directives

    rtmp {

        server {

            listen 1935;

            access_log logs/rtmp_access.log;

            on_connect http://localhost:8080/rtmp/on_connect;

            application live {

                live on;

                notify_method get;

    on_publish http:// localhost :8080/rtmp/on_publish;

    on_publish_done http:// localhost :8080/rtmp/on_publish_done;

                notify_update_timeout 10s;

            }

        }

    }

    3:springboot项目

    /**

    * nginx-rtmp-module的回调函数

    * app = 配置application名称 如:live

    * tcurl = 直播流播放地址 rtmp://127.0.0.1:1935/live

    * clientid = 用户id,包括推流的和拉流的

    */

    @RestController

    @RequestMapping(value = "/rtmp")

    @Slf4j

    public class RTMPNotifyController {

        /**

        * 直播间集合

        */

        @Getter

        private static Set<String> streamNames = new HashSet<>();

        /**

        * 这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,直到它返回结果代码。

        * 当HTTP返回2xx成功状态码时,RTMP会话继续。

        * 3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。

        * 其他状态码,连接断开。目前用来做简单的鉴权

        * <p>

        * 特殊参数

        * epoch : 每次都不一样

        */

        @GetMapping(value = "/on_connect")

        public String onConnect(HttpServletRequest request, HttpServletResponse response) {

            info(request, "on_connect");

            return "on_connect";

        }

        /**

        * 主播发布视频

        *

        * @param name    : streamName rtmp://127.0.0.1:1935/live/{streamName}

        * @param clientid : 主播id

        */

        @GetMapping(value = "/on_publish")

        public String onPublish(HttpServletRequest request) {

            String streamName = request.getParameter("name");

            streamNames.add(streamName);

            info(request, "on_publish");

            return "on_publish";

        }

        @GetMapping(value = "/on_publish_done")

        public String onPublishDone(HttpServletRequest request) {

            String streamName = request.getParameter("name");

            streamNames.remove(streamName);

            info(request, "on_publish_done");

            return "on_publish_done";

        }

        private String info(HttpServletRequest request, String action) {

            String str = action + ": " + request.getRequestURI() + " " + request.getQueryString();

            log.info(str);

            return str;

        }

    }

    4:模拟推送rtmp流

    目前使用ffmpeg软件,生成视频流,本章不做说明,可自行了解

    ffmpeg是一款强大的处理视频的软件

    ffmpeg.exe -re -i "test2.mp4" -f flv "rtmp://127.0.0.1:1935/live/bbb"

    5:播放器拉去rtmp流播放

    我使用的是VLC播放器,下载VLC,打开网络串流,输入rtmp://127.0.0.1/live/bbb对应的地址就可以播放了。

    相关文章

      网友评论

          本文标题:实时监控:nginx-rtmp-module搭建流媒体服务器

          本文链接:https://www.haomeiwen.com/subject/zoyjwctx.html