Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)

一、目前只有一个Live节点存在 

单节点获取方式如下:

 public function getStreamByIp($outerIP, $streamName)
    {
        //查询录像模块的IP地址外网,根据这个可以查看到相应的流
        $url = $outerIP . "/rtmp/stat";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        //所有流的信息,解析Xml
        $outputs = $this->FromXml($output);
//        $streamInfo = $outputs['server']['application']['live']['stream'];
        $streamInfo = $outputs['server']['application']['live']['stream'];

        if (array_key_exists("name", $streamInfo)) {
            //判断该设备是否在这个数组中,真:获取这个设备的所有打流信息
            if ($streamName == $streamInfo['name']) {
                $totalInfo['status'] = 200;
                $totalInfo['message'] = 'The server is normal and is currently streaming';
                $totalInfo['dataList']['name'] = $streamInfo['name'];
                $totalInfo['dataList']['bw_in'] = $streamInfo['bw_in'];
                $totalInfo['dataList']['bw_out'] = $streamInfo['bw_out'];

            } else {
                $totalInfo['status'] = 500;
                $totalInfo['message'] = 'The server has a problem or is not currently streaming information 1';
                $totalInfo['dataList']['name'] = $streamName;
                $totalInfo['dataList']['bw_in'] = 0;
                $totalInfo['dataList']['bw_out'] = 0;
            }
        } else {
            //存放所有的设备号到一个数组中
            foreach ($streamInfo as $key => $val) {
                $deviceInfo[] = $val['name'];
            }
            //判断该设备是否在这个数组中,真:获取这个设备的所有打流信息
            if (in_array($streamName, $deviceInfo)) {
                $totalInfo['status'] = 200;
                $totalInfo['message'] = 'The server is normal and is currently streaming';
                foreach ($streamInfo as $val) {
                    if ($val['name'] == $streamName) {
                        $totalInfo['dataList']['name'] = $val['name'];
                        $totalInfo['dataList']['bw_in'] = $val['bw_in'];
                        $totalInfo['dataList']['bw_out'] = $val['bw_out'];
                    }
                }
            } else {
                $totalInfo['status'] = 500;
                $totalInfo['message'] = 'The server has a problem or is not currently streaming information 2';
                $totalInfo['dataList']['name'] = $streamName;
                $totalInfo['dataList']['bw_in'] = 0;
                $totalInfo['dataList']['bw_out'] = 0;
            }
        }
        return $totalInfo;
    }

二、目前有两个节点Live节点和Live2节点存在 

 多节点获取方式如下:

 public function getStreamByIp($outerIP, $streamName)
    {
        //查询录像模块的IP地址外网,根据这个可以查看到相应的流
        $url = $outerIP . "/rtmp/stat";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        //所有流的信息,解析Xml
        $outputs = $this->FromXml($output);
        $streamInfo = $outputs['server']['application'][0]['live']['stream'];  //主要看这里哦!!!!!!!!!!!!!!!!这里获取的时候是一个二维数组

        if (array_key_exists("name", $streamInfo)) {
            //判断该设备是否在这个数组中,真:获取这个设备的所有打流信息
            if ($streamName == $streamInfo['name']) {
                $totalInfo['status'] = 200;
                $totalInfo['message'] = 'The server is normal and is currently streaming';
                $totalInfo['dataList']['name'] = $streamInfo['name'];
                $totalInfo['dataList']['bw_in'] = $streamInfo['bw_in'];
                $totalInfo['dataList']['bw_out'] = $streamInfo['bw_out'];

            } else {
                $totalInfo['status'] = 500;
                $totalInfo['message'] = 'The server has a problem or is not currently streaming information 1';
                $totalInfo['dataList']['name'] = $streamName;
                $totalInfo['dataList']['bw_in'] = 0;
                $totalInfo['dataList']['bw_out'] = 0;
            }
        } else {
            //存放所有的设备号到一个数组中
            foreach ($streamInfo as $key => $val) {
                $deviceInfo[] = $val['name'];
            }
            //判断该设备是否在这个数组中,真:获取这个设备的所有打流信息
            if (in_array($streamName, $deviceInfo)) {
                $totalInfo['status'] = 200;
                $totalInfo['message'] = 'The server is normal and is currently streaming';
                foreach ($streamInfo as $val) {
                    if ($val['name'] == $streamName) {
                        $totalInfo['dataList']['name'] = $val['name'];
                        $totalInfo['dataList']['bw_in'] = $val['bw_in'];
                        $totalInfo['dataList']['bw_out'] = $val['bw_out'];
                    }
                }
            } else {
                $totalInfo['status'] = 500;
                $totalInfo['message'] = 'The server has a problem or is not currently streaming information 2';
                $totalInfo['dataList']['name'] = $streamName;
                $totalInfo['dataList']['bw_in'] = 0;
                $totalInfo['dataList']['bw_out'] = 0;
            }
        }
        return $totalInfo;
    }

三、解析Xml

    public function FromXml($xml)
    {
        if (!$xml) {
            $totalInfo['status'] = 500;
            $totalInfo['message'] = '没有该设备的相应信息';
            $totalInfo['dataList'] = null;
            return $totalInfo;
        }
        //将XML转为array
        $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $values;
    }

以上为在录像时候遇到问题,已经解决!

 

时间: 2024-10-16 10:40:53

Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)的相关文章

Nginx模块之————RTMP模块的FFmpeg的配置问题是FFmpeg的连续退出

  rtmp { server { listen 1935; application live { allow publish all; allow play all; live on; exec /root/bin/ffmpeg -i rtmp://localhost/live/$name -c:v libx264 -c:a libfdk_aac -b:v 256k -b:a 32k -f flv rtmp://localhost/hls/$name_low -c:v libx264 -c:a

详解Nginx服务器的nginx-http-footer-filter模块配置_nginx

nginx-http-footer-filter想必大家都觉得很陌生,那我们就来认识一下它吧,这是淘宝开发的nginx模块. 它用于nginx在响应请求文件底部追加内容. 今天抽空研究下这个插件,希望对大家有所帮助.为什么发现了这个插件,因为这几天公司需要在所有shtml文件后面追加一个js代码用来做统计(之前统计代码没加齐全),在寻求解决方法的过程中找到了它认识了它最后喜欢上了它,你可能以为我用这个插件去实现了我要的功能,其实在认识他之前我用shell脚本替换齐全了. 不过我还是决定研究测试一

NGINX 加载动态模块(NGINX 1.9.11开始增加加载动态模块支持)

NGINX 1.9.11开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展.目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块. tinywan@tinywan:~/nginx-1.12.0$ ./configure --help | grep dynamic --with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module --with-http_image_filter_modu

使用Lua编写Nginx服务器的认证模块的方法

  这篇文章主要介绍了使用Lua编写Nginx服务器的认证模块的方法,即诸如当今流行的社交应用接入等功能,需要的朋友可以参考下 过去两天里,我解决了一个非常有趣的问题.我用一个nginx服务器作为代理,需要能够向其中添加一个认证层,使其能够使用外部的认证源(比如某个web应用)来进行验证,如果用户在外部认证源有账号,就可以在代理里认证通过. 需求一览 我考虑了几种解决方案,罗列如下: 用一个简单的Python/Flask模块来做代理和验证. 一个使用subrequests做验证的nginx模块(

源码编译更新nginx到最新版本,并开始nginx支持http2协议模块.

最近因为迁移公司vm上的代码,遇到一些问题.有一台vm配置了https协议,原以为迁移安全证书以后,配置nginx就可以了,但是修改nginx配置文件以后,执行 nginx -t 命令后,报如下错误: nginx: [warn] invalid parameter "spdy": ngx_http_spdy_module was superseded by ngx_http_v2_module in /usr/local/nginx/conf/sites-enable 在网上googl

详解Nginx服务器中map模块的配置与使用_nginx

map指令使用ngx_http_map_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_map_module. ngx_http_map_module模块可以创建变量,这些变量的值与另外的变量值相关联.允许分类或者同时映射多个值到多个不同值并储存到一个变量中,map指令用来创建变量,但是仅在变量被接受的时候执行视图映射操作,对于处理没有引用变量的请求时,这个模块并没有性能上的缺失.一. ngx_http_map_module模块指令说明ma

vbs 字符统计功能模块_vbs

字符统计功能模块 复制代码 代码如下: Sub TongJi() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("ok.txt", 1) strText = objFile.ReadAll All = Len(strText) S="` ~ ! @ # $ % ^ & * ( ) - _ = + \ | [ { ]

nginx中使用rewrite模块的参数及示例

本文中的内容收集整理自互联网,在nginx中使用rewrite模块的一些方法.参数及示例文件,供以后学习,特归纳出来供大家来参考. &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 正则表达式匹配,其中: * ~ 为区分 大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: * -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在

Nginx服务器基本的模块配置和使用全攻略_nginx

1. 安装nginx 1.1 选择稳定版本我们编译安装nginx来定制自己的模块,机器CentOS 6.2 x86_64.首先安装缺少的依赖包: # yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话可以下载源码来编译安装,只是要注意编译时默认安装的目录,确保下面在安装nginx时能够找到这些动态库文件(ldconfig). 从