WebRTC Gateway Janus入门:从配置到编写插件

本文首发于WebRTC中文网,转载请注明出处

作者: 张鹏,资深音视频工程师

janus介绍

janus是Meetecho开发的一个WebRTC网关,janus的主要作用就是它可以和你的内网设备和浏览器同时建立连接,并将浏览器发来的音视频数据包如rtp/rtcp包,通过自定义插件转发给你的内网设备,也可以将你发给janus的音视频数据包,加密后转发给浏览器。

这样就完成了内网音视频服务器和外网浏览器的互通。

janus为我们完成了与浏览器建立会话的复杂逻辑,并且提供给我们简单的插件机制来处理音视频数据。

对于PeerConnection连接的建立过程,涉及到复杂的NAT穿透的ICE协议的实现,SDP的交换,DTLS-SRTP的握手和数据包加密发送,数据包接收后解密的复杂逻辑。 janus将我们从与浏览器交互的PeerConnection建立的过程中解脱出来,更专注于音视频业务逻辑。

janus的设计思想

janus基于插件思想,通过实现基础架构,完成了与浏览器链接的建立过程。

janus的插件主要完成一些必须的函数实现,如RTP/RTCP数据的接收。

我们通过实现自己的插件,来完成在将浏览器RTP数据转发到内网服务器的业务逻辑。

janus的用途

janus一般用于拓展已有视频会议系统,提供对浏览器客户端的支持。

##janus的安装

官网安装步骤

按照官网的安装步骤可以顺利的完成安装。

本文在ubuntu16.04系统下测试。

首先安装全新虚拟机ubuntu16.04

下载源码,需要先安装git

    git clone git@github.com:meetecho/janus-gateway.git
复制代码

然后安装janus依赖库

  sudo apt-get install aptitute
      sudo aptitude install libmicrohttpd-dev libjansson-dev libnice-dev \
    	libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev \
    	libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
    	pkg-config gengetopt libtool automake
复制代码

安装libsrtp 2.0

    wget https://github.com/cisco/libsrtp/archive/v2.0.0.tar.gz
    tar xfv v2.0.0.tar.gz
    cd libsrtp-2.0.0
    ./configure --prefix=/usr --enable-openssl
    make shared_library && sudo make install
复制代码

编译安装janus

    git clone https://github.com/meetecho/janus-gateway.git
    cd janus-gateway
    sh autogen.sh
    ./configure --prefix=/opt/janus
    make
    sudo make install
复制代码

到此为止,janus安装到了/opt/janus目录

##janus的配置文件

janus的运行需要进行一些配置

使用命令生成一些默认配置文件

    cd janus-gateway
    make configs
复制代码

对于最基本的演示用途,配置到此就结束了。

详细的配置可以打开文件/opt/janus/etc/janus/janus.cfg按照注释进行配置。

运行janus服务器

直接启动janus的可执行程序即可前台运行janus

    cd /opt/janus/bin
    ./janus
复制代码

运行janus http server

我们需要研究janus提供的demo,比如EchoTest。我们需要在浏览器中打开测试网页才可以进行测试。所以,我们需要一个http server

    cd /opt/janus/share/janus/demos
    python -m SimpleHTTPServer
    命令行输出:Serving HTTP on 0.0.0.0 port 8000 ...
复制代码

这样就搭建了简单的http server,监听端口为8000 使用浏览器打开地址,假设ubuntu 16.04的ip为10.1.32.146

    http://10.1.32.146:8000/
复制代码

即可看到janus的官网运行起来了。

运行echotest

  • 首先确保你有摄像头和麦克风

  • 选择Demos->Echo Test

  • 点击start就能够正常运行演示程序。

  • Echo Test完成了将浏览器发来的音视频数据,发回给浏览器。

  • 演示了会话建立,插件编写等基本功能。

  • Echo Test对应的插件源码为janus-gateway/plugins/janus_echotest.c 通过阅读janus-gateway/plugins/plugin.h中的注释,可以基本了解插件编写的规则。

janus.js的作用

在echo test的例子中,前端部分使用了janus.js。janus.js是和janus服务器进行通信的javascript库,通过使用janus.js简化了webrtc api的使用,以及前端与janus服务器建立连接,交换sdp等功能。如果你不依赖于janus.js你可以自行实现这些逻辑,不过会比较复杂。

janus服务器和浏览器建立会话的过程

整个会话建立的过程符合标准的webrtc peerconnection连接建立的过程。这里的janus服务器就像另一个浏览器端一样。两端分别通过stun server拿到自己的外网地址,以及内网地址。推荐看一下ICE协议文档,深入了解下NAT穿透的过程。

然后交换sdp方面。在生成sdp的过程中,我们可以通过设置需要使用的音视频编解码参数,来要求浏览器使用我们希望使用的音视频编码。

sdp交换后,双方进行连通性测试,即UDP打洞过程。由于echo test中我们并没有配置stun server,所以无法获取到外网IP。所以最终打洞成功的只有本地局域网地址。

janus的插件机制介绍

janus的关键概念是它的插件机制。janus底层完成了连接建立的通用部分,而把具体业务部分作为插件来提供。对于会话的整个生命周期,都会有对应的插件回调产生。插件在自己的实现中,完成了需要的业务逻辑。如echo test就在它的业务逻辑中给浏览器原样返回了RTP数据。而我们公司的业务就是将数据转发到媒体服务器的某个会议中。

janus如何编写插件

janus plugin需要实现的接口

在plugins.h头文件中,定义了插件结构体struct janus_plugin。我们只需要按照struct janus_plugin中定义的函数,逐个实现,就可以完成插件的编写。

需要实现的接口有:

    struct janus_plugin {
    	int (* const init)(janus_callbacks *callback, const char *config_path);
    	void (* const destroy)(void);
    	int (* const get_version)(void);
    	const char *(* const get_package)(void);
    	void (* const create_session)(janus_plugin_session *handle, int *error);
    	struct janus_plugin_result * (* const handle_message)(janus_plugin_session *handle, char *transaction, json_t *message, json_t *jsep);
    	void (* const setup_media)(janus_plugin_session *handle);
    	void (* const incoming_rtp)(janus_plugin_session *handle, int video, char *buf, int len);
    	void (* const incoming_rtcp)(janus_plugin_session *handle, int video, char *buf, int len);
    	void (* const incoming_data)(janus_plugin_session *handle, char *buf, int len);
    	void (* const destroy_session)(janus_plugin_session *handle, int *error);
    	...
    };
复制代码

这些接口体现了整个会话的生命周期。对于incoming_rtp,incoming_rtcp,incoming_data来说,分别代表收到的浏览器发来的rtp,rtcp,自定义数据。这是我们媒体处理的重点。你可以根据业务需求去实现自己的逻辑。

使用janus_callbacks转发数据给浏览器

当我们希望janus帮助我们把数据发给对方时,我们需要使用janus暴露给我们的callback:

    struct janus_callbacks {
    	void (* const relay_rtp)(janus_plugin_session *handle, int video, char *buf, int len);
    	void (* const relay_rtcp)(janus_plugin_session *handle, int video, char *buf, int len);
    	void (* const relay_data)(janus_plugin_session *handle, char *buf, int len);
    	void (* const close_pc)(janus_plugin_session *handle);
    	void (* const end_session)(janus_plugin_session *handle);
    	...
    };
复制代码

其中relay_rtp,relay_rtcp,relay_data分别是用来发送rtp,rtcp,自定义数据的。 janus的插件都有唯一的标识符,如echo test插件的标识符为:

    #define JANUS_ECHOTEST_PACKAGE			"janus.plugin.echotest"
复制代码

在前端js中需要指定需要与哪个插件建立会话,在调用janus.js的janus.attach接口时指定:

    janus.attach({
    				plugin: "janus.plugin.echotest",
    				...
    			})
复制代码

总结

本文介绍了janus的环境搭建,janus的设计思想,和插件的编写方法。阅读本文后,你能够对janus的使用有基本的认识。具体的细节可以通过阅读源码的方式继续深入了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值