webrtc服务器janus echotest学习
webrtc服务器janus echotest学习一
Echo测试演示的是发送给服务器网关的音频和视频,服务器会回传给你,效果如下图所示:
代码分析
创建线程
在janus = new Janus()时,调用Janus(gatewayCallbacks)在其中有函数createSession,并且传入下面的回调函数:
createSession创建请求,成功建立一次httpAPICall,输出Created handle: 1747107217737787
Janus.httpAPICall(server, {verb: 'POST',withCredentials: withCredentials,body: request,success: function(json) {Janus.debug(json);if(json["janus"] !== "success") {Janus.error("Ooops: " + json["error"].code + " " + json["error"].reason); // FIXMEcallbacks.error(json["error"].reason);return;}Janus.sessions[sessionId] = that;eventHandler();callbacks.success();
},
成功回调eventHandler以及echoest的sucesss
创建插件
echoest的sucesss函数如下:
定义了插值对象及对应的回调函数。
janus.attach(
{
}
this.attach = function(callbacks) { createHandle(callbacks)} 实际调用createHandle,
并把对应的回调plugin,succecss等传入,如下图。
在函数function createHandle(callbacks) 中,定义了插件的各个函数,并且回调echotest.js中的janus.attach中的success函数,并且输出Plugin attached! (janus.plugin.echotest, id=1747107217737787),其函数的主要作用是传入对应的回调函数,并且定义一个插件及其许多许应的函数,并且与服务器进行通信:
pluginHandles[handleId] = pluginHandle;
callbacks.success(pluginHandle);
echotest = pluginHandle;定义为插件,其中定义许多函数。包括:
var pluginHandle =
{session : that,plugin : plugin,id : handleId,token : handleToken,detached : false,webrtcStuff : {}getId : function() { return handleId; },getPlugin : function() { return plugin; },getVolume : function() { return getVolume(handleId); },isAudioMuted : function() { return isMuted(handleId, false); },muteAudio : function() { return mute(handleId, false, true); },unmuteAudio : function() { return mute(handleId, false, false); },isVideoMuted : function() { return isMuted(handleId, true); },muteVideo : function() { return mute(handleId, true, true); },unmuteVideo : function() { return mute(handleId, true, false); },getBitrate : function() { return getBitrate(handleId); },send : function(callbacks) { sendMessage(handleId, callbacks); },data : function(callbacks) { sendData(handleId, callbacks); },dtmf : function(callbacks) { sendDtmf(handleId, callbacks); },consentDialog : callbacks.consentDialog,iceState : callbacks.iceState,mediaState : callbacks.mediaState,webrtcState : callbacks.webrtcState,slowLink : callbacks.slowLink,onmessage : callbacks.onmessage,createOffer : function(callbacks) { prepareWebrtc(handleId, callbacks); },createAnswer : function(callbacks) { prepareWebrtc(handleId, callbacks); },handleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks); },onlocalstream : callbacks.onlocalstream,onremotestream : callbacks.onremotestream,ondata : callbacks.ondata,ondataopen : callbacks.ondataopen,oncleanup : callbacks.oncleanup,ondetached : callbacks.ondetached,hangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true); },detach : function(callbacks) { destroyHandle(handleId, callbacks); }
}
并且向服务器发起一次请求,通信服务器,如果成功时,才回调echotest.js中的janus.attach中的success函数,即
success: function(pluginHandle) {$('#details').remove();echotest = pluginHandle;Janus.log("Plugin attached! (" + echotest.getPlugin() + ", id=" + echotest.getId() + ")");// Negotiate WebRTCvar body = { "audio": true, "video": true };Janus.debug("Sending message (" + JSON.stringify(body) + ")");echotest.send({"message": body});Janus.debug("Trying a createOffer too (audio/video sendrecv)");echotest.createOffer({// No media provided: by default, it's sendrecv for audio and videomedia: { data: true }, // Let's negotiate data channels as well// If you want to test simulcasting (Chrome and Firefox only), then// pass a ?simulcast=true when opening this demo page: it will turn// the following 'simulcast' property to pass to janus.js to truesimulcast: doSimulcast,success: function(jsep) {Janus.debug("Got SDP!");Janus.debug(jsep);echotest.send({"message": body, "jsep": jsep});},error: function(error) {Janus.error("WebRTC error:", error);bootbox.alert("WebRTC error... " + JSON.stringify(error));}});$('#start').removeAttr('disabled').html("Stop").click(function() {$(this).attr('disabled', true);clearInterval(bitrateTimer);janus.destroy();});},
在这个函数准备向服务器发送相应的信息连接请求。
发送音视频信息
var body = { “audio”: true, “video”: true };
echotest.send({“message”: body});
echotest.send 实际调用sendMessage
发送的请求为:
var request = { “janus”: “message”, “body”: message, “transaction”: transaction };
Sending message to plugin (handle=3650608414117457):
响应
然后调用success函数
后面通过handleEvent 收到信息,调用Onmessage函数。信息如下:
echotest.createOffer函数,实际调用prepareWebrtc
Trying a createOffer too (audio/video sendrecv
打印上面消息,并且调用httpAPICall来进行通信
function eventHandler()
作用是发出httpAPICall请求,然后请求成功执行handleEvent
handleEvent 收到信息,调用Onmessage函数。
创建offer信息
调用echotest.createOffer,实际调用prepareWebrtc函数,其中getUserMedia
获得本地流,并且调用streamsDone。代码:
navigator.mediaDevices.getUserMedia(gumConstraints)
.then(function(stream) {
pluginHandle.consentDialog(false);
streamsDone(handleId, jsep, media, callbacks, stream); })
其中streamsDone 函数建立RTCPeerConnection连接,并且准备本地的sdp,并且调用onlocalstream把本地流显示出来。代码如下:
根据当前条件,选择执行下面功能
config.pc = new RTCPeerConnection(pc_config, pc_constraints);
pluginHandle.onlocalstream(config.myStream);//显示本地流
createOffer(handleId, media, callbacks);//调用函数 createOffe
config.pc.setRemoteDescription//如果已经有sdp信息,远程sdp,调用此处
在函数function createOffer(handleId, media, callbacks)中:
config.pc.createOffer 调用系统的函数,并且成功的话回调。
如果成功回调callbacks.success(jsep);即调用echotest.createOffer里的时,成功回调,准备向服务器发送sdp信息:
success当,当收到本地sdp信息时,成功回调,准备向服务器发送sdp信息:
success: function(jsep) {
Janus.debug(“Got SDP!”);
Janus.debug(jsep);
echotest.send({“message”: body, “jsep”: jsep});
调用sendMessage用来发送消息,如果发送成功,会收到ack包。
收到SDP信息
当服务器处理完成,主动向客户端发这送sdp信息,客户端是通过handleEvent来处理。
else if(json["janus"] === "event") {Janus.debug("Got a plugin event on session " + sessionId);var callback = pluginHandle.onmessage;if(callback !== null && callback !== undefined) {Janus.debug("Notifying application..."); callback(data, jsep);//实际调用echotest.js中函数onmessage}
收到消息,成功回调函数onmessage。收到远程的SDP信息。
并且调用echotest.handleRemoteJsep({jsep: jsep});即执行prepareWebrtcPeer
prepareWebrtcPeer的作用是设置远程的sdp信息,用来建立p2p连接config.pc.setRemoteDescription。
回调streamsDone里面的以下函数来获得远程流config.pc.ontrack,这个是webrtc自已的函数,可能是回调函数,这样拿来显示远程流。
config.pc.ontrack = function(event) {
pluginHandle.onremotestream(config.remoteStream);
并且回调onremotestream用来显示远程流
webrtc服务器janus echotest学习相关推荐
- webrtc服务器janus通信方法学习二
webrtc服务器janus通信方法学习二 网关部署了一个客户端可以利用的接口.这个janus.js库以透明的方式使用它,其中与之交流的接口都封装好了,也可以自己使用其他方式进行通信,我不使用js接口 ...
- webrtc服务器janus的一点看法
接触webrtc也有一年多时间了,刚开始由于对webrtc也不熟悉,为了快速开发以及出产品,最终选择了开源webrtc服务器janus,然后做了一些自己的定制开发,下面先对janus做一个简单的介绍. ...
- 企业级音视频会议实战之webrtc服务器janus品尝实战
企业级音视频会议实战之webrtc服务器janus品尝实战 文章目录 企业级音视频会议实战之webrtc服务器janus品尝实战 前言 单纯使用webrtc的缺点 使用webrtc服务器之后(这里以j ...
- webrtc服务器-janus房间管理
1.概要 在Janus的众多插件中,有一个房间插件videoRoom,由于它实现视频会议sfu功能,通过改造能适合我们很多业务场景.而且在Janus众多的业务插件中VideoRoom应该也是最复杂的一 ...
- webRTC服务器搭建(基于Janus)与Demo运行
原文网址:https://blog.csdn.net/newchenxf/article/details/110451532 转载请注明出处^^ 前言 2020年,直播带货不要太火,直播的方案基于啥? ...
- webrtc学习--了解webrtc服务器
文章目录 webrtc 服务器架构 0 前言 1 服务器架构 2 Mesh .MCU.SFU的优缺点 2.1 Mesh 2.2 MCU 2.3 SFU 3 开源服务器 4 学习和感受 5 参考博客 w ...
- 如何搭建webrtc服务器系列之一:Janus WebRTC Server
webrtc服务器有很多,janus/kurento/licode/mediasoup/jitsi,各有优缺.评价较好是janus. 搭建janus可以参考janus主页: https://janus ...
- webrtc服务器压测工具使用
主要介绍3个开源的webrtc压力测试框架–kite,pion及srs_bench,以janus服务器为例. 1.KITE KITE整合了Selenium和Aullure.Selenium ...
- AppRTC(WebRTC)服务器搭建
转自:https://www.jianshu.com/p/a19441034f17 前言 最近研究了几天 appr.tc 服务器的搭建,主要目的是想在本地搭建一套 webrtc 服务器环境,可以做一些 ...
最新文章
- java订单实现的_java订单系统的开发
- Bulk_Collect_Performance 比较
- mysql binlog_format 三种格式 详解 ---摘抄
- ZedGraph曲线图实现X轴与Y轴可拖动,并且对应曲线也一起移动
- #include *.c文件的妙用
- 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(二)
- 工业智能网关BL110应用之六十二: 实现西门子S7-200SMART PLC 接入MQTT Client One云平台
- MVP简单使用+RecyclerView
- 2、CPP 基础语法学习
- WPF使用DialogResult.OK报错
- MongoTemplate根据时间查询的大坑
- python中模块和包是什么_python的模块和包的详细说明
- Elasticsearch 之(20)proximity match 近似匹配
- [git] fatal: Exiting because of an unresolved conflict.
- 【金融项目】尚融宝项目(十四)
- 华为鸿蒙是安卓9,鸿蒙“翻车”了?网友发现全新的鸿蒙系统居然是安卓9.0,华为骗我们?...
- 移位操作---左移和右移
- 计网 ---第8章 网络互联设备
- 在使用谷歌时发现一个诡异问题cookie传不过去
- 兔子--改动Android Studio的快捷键,改动成eclipse的快捷键
热门文章
- 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
- ReentrantLock的使用场景
- 计算机2010ppt试题,2010年职称计算机:PowerPoint2000试题及答案
- 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)
- 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点
- Go基础系列:指定goroutine的执行顺序
- 关于Js(四)------ jquery ajax 中json接收数据注意事项
- python并发运行
- Linux查询端口是否被占用的四种方法
- Wythoff's game