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的使用有基本的认识。具体的细节可以通过阅读源码的方式继续深入了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • RTSP SDP RTP/RTCP 介绍应用层 RTSP、SDP; 传输层 RTP、TCP、UDP; 网络层 IP...
    Atom_Woo阅读 3,844评论 0 7
  • 原文在这里 RTP 参考文档 RFC3550/RFC3551  Real-time Transport Proto...
    舌尖上的大胖阅读 12,321评论 0 21
  • 曾经有人跟我讨论过一个哲学问题,你是愿意和你喜欢的人过下去,还是你愿意和喜欢你的人过下去。 既然说到是哲学问题,那...
    巴图鲁阅读 406评论 0 1
  • 俗话说:“一步一个脚印,方能稳定踏实成长。”如何做好第一步呢?我有以下三点: 001:充分准备 古时打仗讲究天时,...
    沐七月阅读 194评论 3 6
  • 时间已接近晚七点,营业部内还是灯火辉煌。我们所有的人都没有离开,没有人去关注是否该吃饭,是否该下班! 今天临下班棘...
    锦墨hhy阅读 239评论 0 0