MCU实现及接口
一:概述
系统目标是对后台提供统一接口,实现对两个或以上由WebRTC推上来的流进行合流,输出合并之后的流至指定服务器。
WebRTC推流所在服务器称为Janus服务器,合流MCU所在服务器称为FreeSwitch服务器,合成输出的Rtmp流所在服务器称为Rtmpd服务器;
系统总体实现由四部分:
1)管理系统:提供RestAPI,负责接口后台指令,判定要合并的流所在Janus服务器,并向其发送合流消息;管理、分配FreeSwitch服务器;分配Rtmpd服务器;
2)Janus服务器:主播所在的推流服务器,负责接收WebRtc流,并根据管理系统的消息向FreeSwitch服务器推流;
3)FreeSwitch服务器:合流服务器,负责对RTC流进行合并,并根据管理系统的消息向Rtmpd服务器输出;提供查询、事件通知管理系统;
4)Rtmpd服务器:接收FreeSwitch合流之后的输出;
二:流程
1):系统后台向管理系统提交要合并的RTC流名称;
2):管理系统查询路由系统,确认RTC流存在,获得RTC流所在Room信息;
3):管理系统选择Janus Relay服务器,并通知其向发布服务器拉流;
4):管理系统分配FS服务器,分配Rtmpd服务器,分配ConferenceID。
5):管理系统通知Janus Relay服务器向FS推流(FS服务器IP、ConferenceID、SIP feedID)
6):Janus Relay服务器向FS服务器推流(注册名称,ConferenceID)
7):FS服务器收到Janus推流请求时,向管理系统请求配置;
8):当合流完成时,管理系统通知FS输出Rtmp流至给定地址;
9):管理系统收到系统后台停止合流请求时,向FS发送停止合流指令;
10):后台需要的状态,只能通过查询获得;
三 管理系统流程图
绿色方块管理模块的出口:是启动fsserver 和向janus server发送set_mcu
caller:
1) prepareFeeds--queryFeedInfo--selectRelayServer 获取最高层(省级)relay sever
2) regconference 从数据库中选fsserver
3) app::startConference
--rtmp::regRtmpAddr
---sysMediator::sendEventTo(case:fs)
---recordingActor::start(开始线程)
--fs::
(1) updateMemberStat
--sysmediator.py(case janus)发送("janus":"set_mcu")
(2) start recording conference(fs command)
主要文件:
- freeSwitch.py :主要是控制作用
1) 给janus发送set_mcu,启动janus relay流工作. 启动fs conference
2) 从db中选fsserver(这个没有什么特别策略) - Janus.py: 业务逻辑调用relay server? 外部通信使用urllib2发送request和接收respond
- SysMediator.py 中介者模式.路由中心. sendEventTo函数实现发给fs,janus,rtmp的命令都要发给它中转.
- class sysAct是基类,所有janus,fs,rmtp,app 模块调用的setEvent都是调用它的,它又wrapper了
- SysMediator类发送,所以所有模块都是SysMediator sendEventTo函数。
等于内部通信全都由基类实现.
四 消息流程图
注意:mcu 连麦是将原来的sfu改成mcu. sfu只有一个publisher,mcu变成2个publisher
fs manager制定两个janus relay server,分别拉这两个publisher的流.
然后relay 流给fs server,最后fs server将mcu 流分别发给relay server
分成两部分:1 是sip信令(交换sdp) 2 janus转一路给freeswitch,然后freeswitch将合流发回给janus
这两部分如何连接的呢? fs manager set_mcu-->janus sip 之后,创建mcu session。 当videoroom转流的时候,遍历mcu session转发.
上图的时序图是对流程图的细化,加上了消息内容.
step1,2 管理系统选出fs server 和janus relay server并发送启动mcu 指令
step4,5 invite消息交互sdp
step8,9,10,11,12 从publish1拉流到relay1 janus1
step13,14,15: relay1 audio/video 给freeswitch
step24: send mcu 合流结果给relay1 janus
step25 relay1 janus将合流结果转发给所有listeners
五:接口
1)管理系统
http://xxxx.abc.domain:8282/start_conference?feed_id=xxx
描述:将rtc流通过sip协议推往freeswitch,freeswitch创建conference(conference的id同feed_id一致)并开启rtc转rtmp功能
http://xxxx.abc.com:8282/start_muxing?caller_feed_id=xxx&&callee_feed_id=xxx
描述:启动合流
http://xxxx.qiyi.domain/freeswitch/conf(内部接口)
描述:服务系统提供给FreeSwitch的配置接口
2)FreeSwitch
http://serverip:8888/api/stat_conference
描述:FreeSwitch提供给管理系统的会议室查询接口
3)Janus
http://serverip:8089/admin(内部接口)
描述:管理系统向Janus服务器发送推流消息(设计到jansus 流的还有roomid, appname, client_info, feed_name等信息)
方法:HTTP POST
body:
http://10.121.32.61::8089/admin
备注:sip用户名和密码的值都为feed_id
开始mcu example
{"janus" : "set_mcu",
"transaction":"123456789012",
"admin_secret":"janusoverlord",
"plugin":"janus.plugin.videoroom"
"room":1,
"feed_id":"1",
"conference_id":4600,
"status":"on",
"mcu_ip":"10.153.3.68",
"mcu_port":5060
}
6:实现
管理系统实现:
1)数据库表
janusServerModel:Janus服务器
janusStreamModel:RTP流freeSwitchServerModel:FS服务器
freeSwitchConferenceModel:FS会议室
小结:
流程图说明了需要的模块,模块作用和总体流向;
时序图+steps说明:具体消息流程的每个消息说明.
外部通信接口实现(sip和python http),内部通信复用;
业务逻辑数据库操作实现+freeswitch 第三方合流
python fs manager:数据库操作,http通信. janus增加一个sip invite,其他就是复用转流
版权声明:本文为CSDN博主「fdsafwagdagadg6576」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fdsafwagdagadg6576/article/details/122615590
暂无评论