| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Nginx rtmp 转推push和relay(pull) -> 正文阅读 |
|
[系统运维]Nginx rtmp 转推push和relay(pull) |
push,pull config:Nginx-rtmp模块实现流媒体play、push、pull功能_莫失莫忘的博客-CSDN博客 config:启用push功能,将本机(172.16.6.36)/mypush,app中的数据流推送至172.16.6.39服务器下的/myapp app中
配置实现pull功能,172.16.6.39服务器能够从172.16.6.36服务器上拉取数据流,并保存在本机/mypull app中.
两种情况转推:
分成两种情况:在publish之后转推和在pull之后转推 在publish之后转推: 1) 向转推server发送publish信令 2)将转推的server a作为subscribe,接收本机的推流转发. ?实际r就是将push server,变成一个play subsribe. 在转发给其他subscribers的时候也转发给它一份. ngx_rtmp_relay_on_result 真正的relay enter ?? publish?????????在完成以上步骤后客户端和服务器建立了一个网络流,接下来就可以传输媒体数据了。 在pull之后转推: ????scenario2: 拉流: pull scenario:pull的本质也是创建一个subsribe.请publisher server转发过来 relay分成两种情况,可以push也可以pull;pull分成静态 or非静态 pull??rtmp的信令交互图:客户端rtmp连接观看时函数调用? ? ?和ffmpeg推送视频一样,客户端连接服务器观看时流程也分为:建立rtmp连接–>建立网络连接–>建立网络流–>传输媒体数据。 ????此部分为客户端连接nginx-rtmp时的交互,没有推送视频流。其中建立rtmp连接和建立网络连接过程和2.2.1、2.2.2节相同,参考对应章节内容。 ????而建立网络流过程与2.2.3区别于两点: ????????????1、第一步中,从客户端接收一个protocol_message,推送时该message转到ngx_rtmp_set_chunk_size处理,而观看时该message未被处理; ????????????2、第二步中,接收客户端一个amf控制消息,推送时是连续3个; ????而媒体数据传输步骤中,在服务器没有接收推送时,过程如下: ????????????1、从客户端(观看端)接收两个amf命令消息; ????????????2、然后服务器会利用ngx_rtmp_cmd_publish_init来初始化发布环境。该函数会读取刚接收端amf信息,然后设置参数; ????????????3、和2.2.4类似,初始化其他子模块: ????????????????A、ngx_rtmp_notify_module.c -> ngx_rtmp_notify_play ????????????????B、ngx_rtmp_exec_module.c -> ngx_rtmp_exec_play ????????????????C、ngx_rtmp_relay_module.c -> ngx_rtmp_relay_play ????????????????D、ngx_rtmp_live_module.c -> ngx_rtmp_live_play,会向客户端发送两个amf状态消息 ????????????????E、ngx_rtmp_access_module.c -> ngx_rtmp_access_play ????????????????F、ngx_rtmp_cmd_module.c -> ngx_rtmp_cmd_play ????????????4.客户端向服务器发送set_buflen的用户消息ngx_rtmp_user_message_handler将对其处理 ????????????5、因为没有推送数据,所以现在不会有媒体数据交互。? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Scenario3 relay:ngx_rtmp_relay_module: pull模型分析1:?播放器端发起play 2: ngx_rtmp_relay_play() 3: ngx_rtmp_relay_pull() --主要建立pull请求, 将远程拉流的上下文和本地上下文放到链表中 ????ngx_rtmp_relay_create_local_ctx()创建本地上下文 ????ngx_rtmp_relay_create_remote_ctx()创建远端上下文 4: ngx_rtmp_relay_create_remote_ctx详解: ?创建远端session, 开始rtmp信令交互 ???????1: ngx_rtmp_relay_create_connection ? ????????2: ngx_rtmp_init_session 注意:此时session中的flashver为“ngx-local-relay“ 5: rtmp信令交互流程 核心函数: ngx_rtmp_relay_on_result主要用来接收对端服务端发送的amf消息包,而后按正常rtmp协议请求进行下一步交互,这个主要是当前服务端做为客户端发起远程rtmp请求流程 例如:???ngx_rtmp_client_handshake(发起握手) ?????????握手完成后调用回调函数: ngx_rtmp_relay_handshake_done ???????ngx_rtmp_relay_send_connect:发起连接请求, 接着参考rtmp信令交互图 other:?rtmp推流地址:rtmp://ip/live0/stream-name
relay 模块整体结构:? 采用hash表+链表的结构;横向:同一个流名的链表: 用play串起来;纵向:不同流名用next串起来 ? QA:pull和play什么关系?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 2:49:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |