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学习相关推荐

  1. webrtc服务器janus通信方法学习二

    webrtc服务器janus通信方法学习二 网关部署了一个客户端可以利用的接口.这个janus.js库以透明的方式使用它,其中与之交流的接口都封装好了,也可以自己使用其他方式进行通信,我不使用js接口 ...

  2. webrtc服务器janus的一点看法

    接触webrtc也有一年多时间了,刚开始由于对webrtc也不熟悉,为了快速开发以及出产品,最终选择了开源webrtc服务器janus,然后做了一些自己的定制开发,下面先对janus做一个简单的介绍. ...

  3. 企业级音视频会议实战之webrtc服务器janus品尝实战

    企业级音视频会议实战之webrtc服务器janus品尝实战 文章目录 企业级音视频会议实战之webrtc服务器janus品尝实战 前言 单纯使用webrtc的缺点 使用webrtc服务器之后(这里以j ...

  4. webrtc服务器-janus房间管理

    1.概要 在Janus的众多插件中,有一个房间插件videoRoom,由于它实现视频会议sfu功能,通过改造能适合我们很多业务场景.而且在Janus众多的业务插件中VideoRoom应该也是最复杂的一 ...

  5. webRTC服务器搭建(基于Janus)与Demo运行

    原文网址:https://blog.csdn.net/newchenxf/article/details/110451532 转载请注明出处^^ 前言 2020年,直播带货不要太火,直播的方案基于啥? ...

  6. webrtc学习--了解webrtc服务器

    文章目录 webrtc 服务器架构 0 前言 1 服务器架构 2 Mesh .MCU.SFU的优缺点 2.1 Mesh 2.2 MCU 2.3 SFU 3 开源服务器 4 学习和感受 5 参考博客 w ...

  7. 如何搭建webrtc服务器系列之一:Janus WebRTC Server

    webrtc服务器有很多,janus/kurento/licode/mediasoup/jitsi,各有优缺.评价较好是janus. 搭建janus可以参考janus主页: https://janus ...

  8. webrtc服务器压测工具使用

      主要介绍3个开源的webrtc压力测试框架–kite,pion及srs_bench,以janus服务器为例. 1.KITE    KITE整合了Selenium和Aullure.Selenium ...

  9. AppRTC(WebRTC)服务器搭建

    转自:https://www.jianshu.com/p/a19441034f17 前言 最近研究了几天 appr.tc 服务器的搭建,主要目的是想在本地搭建一套 webrtc 服务器环境,可以做一些 ...

最新文章

  1. java订单实现的_java订单系统的开发
  2. Bulk_Collect_Performance 比较
  3. mysql binlog_format 三种格式 详解 ---摘抄
  4. ZedGraph曲线图实现X轴与Y轴可拖动,并且对应曲线也一起移动
  5. #include *.c文件的妙用
  6. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(二)
  7. 工业智能网关BL110应用之六十二: 实现西门子S7-200SMART PLC 接入MQTT Client One云平台
  8. MVP简单使用+RecyclerView
  9. 2、CPP 基础语法学习
  10. WPF使用DialogResult.OK报错
  11. MongoTemplate根据时间查询的大坑
  12. python中模块和包是什么_python的模块和包的详细说明
  13. Elasticsearch 之(20)proximity match 近似匹配
  14. [git] fatal: Exiting because of an unresolved conflict.
  15. 【金融项目】尚融宝项目(十四)
  16. 华为鸿蒙是安卓9,鸿蒙“翻车”了?网友发现全新的鸿蒙系统居然是安卓9.0,华为骗我们?...
  17. 移位操作---左移和右移
  18. 计网 ---第8章 网络互联设备
  19. 在使用谷歌时发现一个诡异问题cookie传不过去
  20. 兔子--改动Android Studio的快捷键,改动成eclipse的快捷键

热门文章

  1. 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
  2. ReentrantLock的使用场景
  3. 计算机2010ppt试题,2010年职称计算机:PowerPoint2000试题及答案
  4. 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)
  5. 【LeetCode】剑指 Offer 52. 两个链表的第一个公共节点
  6. Go基础系列:指定goroutine的执行顺序
  7. 关于Js(四)------ jquery ajax 中json接收数据注意事项
  8. python并发运行
  9. Linux查询端口是否被占用的四种方法
  10. Wythoff's game