pingos(nginx-rtmp-module)获取实时直播数据

转载请注明出处:https://blog.youkuaiyun.com/impingo
我的开源项目地址:https://github.com/pingostack/pingos
开源项目:https://pingos.io

QQ交流群:193611565

QQ交流二群:193611565
QQ交流一群(已满):697773082

描述

nginx-rtmp-module模块里有个rtmp_stat配置,该功能可以允许用户通过http接口获取单个worker进程上的正在直播的rtmp推拉流连接和对应的流量。

但是这个功能有很大的缺陷:

  • 有多个worker进程的情况下,每次请求只能随机获取到其中一个worker进程的流信息。
  • 通过这个接口只能统计到rtmp连接的信息,对于pingos项目里的http-flv、http-ts、hls+等协议的连接是无法统计到的。

1. pingos中的解决方案

先看pingos中的配置:

location /sys_stat {
    sys_stat;
}

location /sys_stat_proxy/ {
        rewrite ^/proxy/(.*) /sys_stat break;
        proxy_pass http://$1:;
}

location /bs {
    broadcast unix:/tmp/http /sys_stat_proxy;
    broadcast_rewrite_prefix " " [;
    broadcast_suffix ];
}
  • sys_stat配置
    该功能是通过http接口把当前worker进程的直播流信息以json的格式返回,其中包含详细的流量、带宽、并发信息,但是这样操作跟原生的rtmp_stat一样存在致命缺陷,不能获取全局的信息。

  • broadcast配置
    该功能是将请求广播给所有的worker进程,然后将多个worker进程返回的json数据汇总。

2. APP列表和流列表

  • Get请求 URL:http(s)://ip:port/bs

  • 返回JSON内容的结构是:worker进程 -> live_stream -> serverid -> appid -> stream -> publish会话和play会话

也就是说通过这个接口你将获取到一个数据,其中每个节点元素都是对应一个worker进程上的数据。

json最外层的整体结构例如:

[ {worker0}, {worker1}, {worker3} ... ]

2.1 worker 结构

{
    "ngx_worker": 0,
    "ngx_process_slot": 0,
    "ngx_pid": 29809,
    "live_stream": { ... }
}
字段类型描述
ngx_workerintworker进程的编号
ngx_process_slotintworker进程指针在master进程数组里的下标
ngx_pidintworker进程id
live_streamjson object直播流列表

2.2 live_stream 结构

{
    "server_version": "1.17.5",
    "compiler": "gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ",
    "built": "Apr 11 2021",
    "pid": 29809,
    "timestamp": 1618637886,
    "naccepted": 178,
    "in": {
        "bw": 3764096,
        "bytes": 3421950282
    },
    "out": {
        "bw": 4984816,
        "bytes": 3643226942
    },
    "server_array": [ ... ]
}
字段类型描述
server_versionstring服务器版本
compilerstring编译器版本
builtstring编译日期
pidstring线程id
timestamptime当前请求时候的系统时间
nacceptedint当前进程接收到的请求总数
inobject当前worker进程的网络入流情况
outobject当前worker进程的网络出流情况
bwint当前worker进程的带宽(注意:是当前一个worker进程,而且全部worker进程;在in里就是入网带宽,在out里就是出网带宽)
bytesint从该worker进程开启到目前为止的流量总和
server_arrayjson array以serverid为索引的不同serverid下的流状态信息

2.3 server_array 结构

{
    "serverid": "112.121.178.154",
    "total_clients": 1,
    "rtmp_clients": 1,
    "flv_clients": 0,
    "hls_clients": 0,
    "ts_clients": 0,
    "stream_array": [ ... ]
}
字段类型描述
serveridstringserverid
total_clientsint当前时刻下的worker进程下的serverid下的所有客户端连接了
rtmp_clientsintrtmp客户端的连接量
flv_clientsinthttp-flv客户端的连接量
hls_clientsinthls+客户端的连接量(注意,只能统计hls+的连接量,普通hls无法被统计)
ts_clientsinthttp-ts客户端的连接量
stream_arrayjson array在线流列表

2.4 stream_array 结构

{
    "name": "112.121.178.154/live/111",
    "time": 102641,
    "in": {
        "bw": 3677064,
        "bytes": 30479426
    },
    "video_in": {
        "bw": 3295320,
        "bytes": 26164007
    },
    "audio_in": {
        "bw": 376040,
        "bytes": 4251276
    },
    "out": {
        "bw": 4836912,
        "bytes": 42234918
    },
    "meta": {
        "video": {
            "width": 1920,
            "height": 1080,
            "frame_rate": "24.0",
            "codec": "H264",
            "profile": "High",
            "compat": "4.0"
        },
        "audio": {
            "codec": "AAC",
            "profile": "LC",
            "channels": 6,
            "sample_rate": 48000
        }
    },
    "total_clients": 1,
    "rtmp_clients": 1,
    "flv_clients": 0,
    "hls_clients": 0,
    "ts_clients": 0,
    "active": true,
    "client_array": [ ... ]
}
字段类型描述
namestringserverid/app/流名 的组合
timeint流存在的时长
injson object这条流在这个worker进程上的入网网络情况
outjson object这条流在这个worker进程上的出网网络情况
video_injson object这条流的视频在这个worker进程上的入网网络情况
audio_injson object这条流的音频在这个worker进程上的入网网络情况
metajson object这条流的音视频信息
total_clientsint这条流在这个worker进程上的所有客户端连接量
rtmp_clientsint这条流在这个worker进程上的所有rtmp客户端连接量
flv_clientsint这条流在这个worker进程上的所有http-flv客户端连接量
hls_clientsint这条流在这个worker进程上的所有hls+客户端连接量
ts_clientsint这条流在这个worker进程上的所有http-ts客户端连接量
activebool这条流在这个worker进程上是否处于激活状态
client_arrayjson object这条流在这个worker进程上的所有客户端连接列表

2.5 client_array 结构

[
    {
        "id": 430680,
        "address": "0.0.0.0:1935",
        "remote_address": "101.228.192.22",
        "time": 82155,
        "flashver": "LNX 9,0,124,2",
        "dropped": 0,
        "avsync": 4294967284,
        "timestamp": 0,
        "active": true,
        "publishing": false,
        "relay": false,
        "interprocess": false,
        "protocol": "rtmp"
    }, {
        "id": 0,
        "address": "0.0.0.0:1935",
        "remote_address": "",
        "time": 102638,
        "flashver": "FMLE/3.0 (compatible; Lavf58.77.100)",
        "dropped": 0,
        "avsync": 4294967284,
        "timestamp": 0,
        "active": true,
        "publishing": false,
        "relay": true,
        "interprocess": false,
        "protocol": "rtmp"
    }, {
        "id": 430653,
        "address": "0.0.0.0:1935",
        "remote_address": "101.228.192.22",
        "time": 102917,
        "flashver": "FMLE/3.0 (compatible; Lavf58.77.100)",
        "dropped": 0,
        "avsync": 4294967284,
        "timestamp": 102666,
        "active": true,
        "publishing": true,
        "relay": false,
        "interprocess": false,
        "protocol": "rtmp"
    }
]
字段类型描述
idint客户端id
addressstring该链接对应的服务器端监听的ip和端口
remote_addressstring客户端的公网ip
timeint客户端的连接时长
flashvarstring如果是rtmp连接,则展示客户端的版本
droppedint丢包量
avsyncint音视频时间戳差值(单位毫秒)
timestampint媒体数据时间戳(毫秒)
activebool客户端是否被激活
publishingbool是否为推流连接
relaybool是否为转发连接(如push、pull连接)
interprocessbool是否为进程间回源连接
protocolstring客户端使用的协议(rtmp、flv、ts、hls等)

2.6 完整的返回demo

[{
    "ngx_worker": 0,
    "ngx_process_slot": 0,
    "ngx_pid": 29809,
    "live_stream": {
        "server_version": "1.17.5",
        "compiler": "gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ",
        "built": "Apr 11 2021",
        "pid": 29809,
        "timestamp": 1618637886,
        "naccepted": 178,
        "in": {
            "bw": 3764096,
            "bytes": 3421950282
        },
        "out": {
            "bw": 4984816,
            "bytes": 3643226942
        },
        "server_array": [{
                "serverid": "112.121.178.154",
                "stream_array": [{
                        "name": "112.121.178.154/live/111",
                        "time": 102641,
                        "in": {
                            "bw": 3677064,
                            "bytes": 30479426
                        },
                        "video_in": {
                            "bw": 3295320,
                            "bytes": 26164007
                        },
                        "audio_in": {
                            "bw": 376040,
                            "bytes": 4251276
                        },
                        "out": {
                            "bw": 4836912,
                            "bytes": 42234918
                        },
                        "client_array": [{
                                "id": 430680,
                                "address": "0.0.0.0:1935",
                                "remote_address": "101.228.192.22",
                                "time": 82155,
                                "flashver": "LNX 9,0,124,2",
                                "dropped": 0,
                                "avsync": 4294967284,
                                "timestamp": 0,
                                "active": true,
                                "publishing": false,
                                "relay": false,
                                "interprocess": false,
                                "protocol": "rtmp"
                            }, {
                                "id": 0,
                                "address": "0.0.0.0:1935",
                                "remote_address": "",
                                "time": 102638,
                                "flashver": "FMLE/3.0 (compatible; Lavf58.77.100)",
                                "dropped": 0,
                                "avsync": 4294967284,
                                "timestamp": 0,
                                "active": true,
                                "publishing": false,
                                "relay": true,
                                "interprocess": false,
                                "protocol": "rtmp"
                            }, {
                                "id": 430653,
                                "address": "0.0.0.0:1935",
                                "remote_address": "101.228.192.22",
                                "time": 102917,
                                "flashver": "FMLE/3.0 (compatible; Lavf58.77.100)",
                                "dropped": 0,
                                "avsync": 4294967284,
                                "timestamp": 102666,
                                "active": true,
                                "publishing": true,
                                "relay": false,
                                "interprocess": false,
                                "protocol": "rtmp"
                            }],
                        "meta": {
                            "video": {
                                "width": 1920,
                                "height": 1080,
                                "frame_rate": "24.0",
                                "codec": "H264",
                                "profile": "High",
                                "compat": "4.0"
                            },
                            "audio": {
                                "codec": "AAC",
                                "profile": "LC",
                                "channels": 6,
                                "sample_rate": 48000
                            }
                        },
                        "total_clients": 1,
                        "rtmp_clients": 1,
                        "flv_clients": 0,
                        "hls_clients": 0,
                        "ts_clients": 0,
                        "active": true
                    }],
                "total_clients": 1,
                "rtmp_clients": 1,
                "flv_clients": 0,
                "hls_clients": 0,
                "ts_clients": 0
            }]
    }
}]
cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I ../modules/nginx-client-module -I ../modules/nginx-multiport-module -I ../modules/nginx-toolkit-module -I src/core -I src/event -I src/event/modules -I src/os/unix -I ../modules/nginx-rtmp-module -I objs -I src/http -I src/http/modules -I ../modules/nginx-rtmp-module -I ../modules/nginx-rtmp-module/http -I ../modules/nginx-rtmp-module/hls -I ../modules/nginx-rtmp-module/mpegts \ -o objs/src/http/ngx_http_parse.o \ src/http/ngx_http_parse.c cc1: all warnings being treated as errors make[1]: *** [objs/Makefile:995: objs/src/event/ngx_event_openssl.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make[1]: Leaving directory '/home/ubuntu/pingos-master/nginx' make: *** [Makefile:8: build] Error 2 make -f objs/Makefile install make[1]: Entering directory '/home/ubuntu/pingos-master/nginx' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I ../modules/nginx-client-module -I ../modules/nginx-multiport-module -I ../modules/nginx-toolkit-module -I src/core -I src/event -I src/event/modules -I src/os/unix -I ../modules/nginx-rtmp-module -I objs \ -o objs/src/event/ngx_event_openssl.o \ src/event/ngx_event_openssl.c src/event/ngx_event_openssl.c: In function ‘ngx_ssl_load_certificate_key’: src/event/ngx_event_openssl.c:722:9: error: ‘ENGINE_by_id’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 722 | engine = ENGINE_by_id((char *) p); | ^~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:336:31: note: declared here 336 | OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_by_id(const char *id); | ^~~~~~~~~~~~ src/event/ngx_event_openssl.c:731:9: error: ‘ENGINE_load_private_key’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 731 | pkey = ENGINE_load_private_key(engine, (char *) last, 0, 0); | ^~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:638:11: note: declared here 638 | EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, | ^~~~~~~~~~~~~~~~~~~~~~~ src/event/ngx_event_openssl.c:735:13: error: ‘ENGINE_free’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 735 | ENGINE_free(engine); | ^~~~~~~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:493:27: note: declared here 493 | OSSL_DEPRECATEDIN_3_0 int ENGINE_free(ENGINE *e); | ^~~~~~~~~~~ src/event/ngx_event_openssl.c:739:9: error: ‘ENGINE_free’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 739 | ENGINE_free(engine); | ^~~~~~~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:493:27: note: declared here 493 | OSSL_DEPRECATEDIN_3_0 int ENGINE_free(ENGINE *e); | ^~~~~~~~~~~ src/event/ngx_event_openssl.c: In function ‘ngx_ssl_dhparam’: src/event/ngx_event_openssl.c:1335:5: error: ‘PEM_read_bio_DHparams’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 1335 | dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); | ^~ In file included from /usr/include/openssl/ssl.h:36, from src/event/ngx_event_openssl.h:15, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/pem.h:469:1: note: declared here 469 | DECLARE_PEM_rw_attr(OSSL_DEPRECATEDIN_3_0, DHparams, DH) | ^~~~~~~~~~~~~~~~~~~ src/event/ngx_event_openssl.c:1345:5: error: ‘DH_free’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 1345 | DH_free(dh); | ^~~~~~~ In file included from /usr/include/openssl/dsa.h:51, from /usr/include/openssl/x509.h:37, from /usr/include/openssl/ssl.h:31, from src/event/ngx_event_openssl.h:15, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/dh.h:204:28: note: declared here 204 | OSSL_DEPRECATEDIN_3_0 void DH_free(DH *dh); | ^~~~~~~ src/event/ngx_event_openssl.c: In function ‘ngx_ssl_error’: src/event/ngx_event_openssl.c:3066:13: error: ‘ERR_peek_error_line_data’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 3066 | n = ERR_peek_error_line_data(NULL, NULL, &data, &flags); | ^ In file included from src/event/ngx_event_openssl.h:16, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/err.h:425:15: note: declared here 425 | unsigned long ERR_peek_error_line_data(const char **file, int *line, | ^~~~~~~~~~~~~~~~~~~~~~~~ src/event/ngx_event_openssl.c: In function ‘ngx_ssl_session_ticket_key_callback’: src/event/ngx_event_openssl.c:3976:9: error: ‘HMAC_Init_ex’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 3976 | if (HMAC_Init_ex(hctx, key[0].hmac_key, size, digest, NULL) != 1) { | ^~ In file included from /usr/include/openssl/ssl.h:37, from src/event/ngx_event_openssl.h:15, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/hmac.h:43:27: note: declared here 43 | OSSL_DEPRECATEDIN_3_0 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, | ^~~~~~~~~~~~ src/event/ngx_event_openssl.c:4020:9: error: ‘HMAC_Init_ex’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 4020 | if (HMAC_Init_ex(hctx, key[i].hmac_key, size, digest, NULL) != 1) { | ^~ In file included from /usr/include/openssl/ssl.h:37, from src/event/ngx_event_openssl.h:15, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/hmac.h:43:27: note: declared here 43 | OSSL_DEPRECATEDIN_3_0 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, | ^~~~~~~~~~~~ src/event/ngx_event_openssl.c: In function ‘ngx_openssl_engine’: src/event/ngx_event_openssl.c:5151:5: error: ‘ENGINE_by_id’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 5151 | engine = ENGINE_by_id((char *) value[1].data); | ^~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:336:31: note: declared here 336 | OSSL_DEPRECATEDIN_3_0 ENGINE *ENGINE_by_id(const char *id); | ^~~~~~~~~~~~ src/event/ngx_event_openssl.c:5159:5: error: ‘ENGINE_set_default’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 5159 | if (ENGINE_set_default(engine, ENGINE_METHOD_ALL) == 0) { | ^~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:708:27: note: declared here 708 | OSSL_DEPRECATEDIN_3_0 int ENGINE_set_default(ENGINE *e, unsigned int flags); | ^~~~~~~~~~~~~~~~~~ src/event/ngx_event_openssl.c:5164:9: error: ‘ENGINE_free’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 5164 | ENGINE_free(engine); | ^~~~~~~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:493:27: note: declared here 493 | OSSL_DEPRECATEDIN_3_0 int ENGINE_free(ENGINE *e); | ^~~~~~~~~~~ src/event/ngx_event_openssl.c:5169:5: error: ‘ENGINE_free’ is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations] 5169 | ENGINE_free(engine); | ^~~~~~~~~~~ In file included from src/event/ngx_event_openssl.h:22, from src/core/ngx_core.h:83, from src/event/ngx_event_openssl.c:9: /usr/include/openssl/engine.h:493:27: note: declared here 493 | OSSL_DEPRECATEDIN_3_0 int ENGINE_free(ENGINE *e); | ^~~~~~~~~~~ cc1: all warnings being treated as errors make[1]: *** [objs/Makefile:995: objs/src/event/ngx_event_openssl.o] Error 1 make[1]: Leaving directory '/home/ubuntu/pingos-master/nginx' make: *** [Makefile:11: install] Error 2
最新发布
06-09
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值