janus-Gateway的服务端部署

janus-Gateway


需求是前后端的webRTC推拉流,但是后端用的是c++,于是使用了这个库做视频流的推送和拉取,记录踩坑过程。

如果你也需要自己部署janus的服务端并在前端拉流测试,希望对你有所帮助。


由于janus的服务器搭建需要linux环境,源码并不支持windows,因此需要准备局域网下的另一台ubantu电脑通过ssh连接。

服务端的搭建本人并不熟悉,参考的是newchenxf大佬的这篇文章,由于版本更新,有些报错的地方会在下文指正。



服务端搭建

1.下载源码

通过 github 下载源码,也可以在 官网 查看详细的api和在线demo


2.安装Janus依赖库

部分直接命令行安装,部分需要通过源码安装。

2.1 命令行安装

sudo aptitude install libmicrohttpd-dev libjansson-dev \
	libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev \
	libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
	libconfig-dev pkg-config gengetopt libtool automake

请注意安装结果,如果有某一个安装失败,又是官网要求必须装的,则需要手动下载安装,方法参照下面的源码安装↓


2.2 源码安装libnice

libnice是一个建立ice连接必须的库,官方推荐方法依赖比较多,需要Python 3 Meson and Ninja(我直接用的第二种方法)

git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
meson --prefix=/usr build && ninja -C build && sudo ninja -C build install

第二种方法,下载 libnice_0.1.16.orig.tar.gz,下载完后将压缩文件移动到usr/local

cd /usr/local
tar -zxvf libnice_0.1.16.orig.tar.gz
cd /usr/local/libnice_0.1.16
./configure && make && sudo make install

2.3 源码安装libwebsocket

webSocket不是必须的,但是最好装一下,因为websocket也很常用,网页Demo也会用。

下载 libwebsockets (蓝奏云)压缩包,将压缩文件移动到/usr/local

 sudo tar -zxvf libwebsockets.tar.gz
 cd /usr/local/libwebsockets
 mkdir build
 cd build/
 cmake ..
 make && make install

如无报错情况下,build/bin目录下,将生成 example类文件, 此时还需要进入example的源码目录:libwebsockets/minimal-examples-lowlevel/ws-server/minimal-ws-server二次编译。

 cd /usr/local/libwebsockets/minimal-examples-lowlevel/ws-server/minimal-ws-server
 cmake .
 make
 ./lws-minimal-ws-server

终端执行结果应该是这样:
在这里插入图片描述

此时便可以通过本机ip7681端口(如果本机ip为1.1.1.1 则访问 1.1.1.1:7681),访问websocket网页查看服务是否启动↓(网页应该如下图所示)。
在这里插入图片描述
在编译 janus 时,janus 默认会增加对 WebSocket 的集成,或者通过增加编译参数 –enable-websockets 打开 WebSocket 开关。


2.4 源码安装libsrtp

这一个不是绝对必须的,因为前面通过命令行也安装了libsrtp-dev。事实上运行起demo是没有问题的,如果只跑demo可以跳过。只不过Janus官网建议,如果你的libsrtp版本低于1.5,建议升级到最新的,比如2.2,因为之前的版本可能有bug,会引入问题。

sudo apt-get install libsrtp-dev

如果是按步骤来,会提示已经安装过了(安装的是老版本,终端执行结果应该是这样)

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'libsrtp0-dev' instead of 'libsrtp-dev'
libsrtp0-dev is already the newest version (1.4.5~20130609~dfsg-2ubuntu1).

安装新版本,更新到2.2后,不需要pkg-config来修改版本,因为这个库名字和老版本不一样,叫做libsrtp2,不会冲突。如果有libsrtp2Janus会自动选这个库。

wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
tar xfv v2.2.0.tar.gz
cd libsrtp-2.2.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

2.5 源码安装usrsctp

这个也是非必须,如果要起Data Channel才需要,简单来说就是推拉流运行起来后,如果需要文本互相发送会用到。

装好以后,编译janus会默认启用他

git clone https://github.com/sctplab/usrsctp
cd usrsctp
./bootstrap
./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6
make && sudo make install



3. 编译Janus

依赖都准备好了,可以编译janus

git clone https://github.com/meetecho/janus-gateway.git
sh autogen.sh
./configure --prefix=/opt/janus --enable-websockets
make
sudo make install

如果还想生成帮助文档,可以加一个–enable-docs,编译前,还需要装一下doxygen等辅助工具(可选)

aptitude install doxygen graphviz

执行configure

./configure

此时终端的执行结果应该为 ↓ ,没有配置Data Channel不影响demo运行

Compiler:                  gcc
libsrtp version:           2.x
SSL/crypto library:        OpenSSL
DTLS set-timeout:          not available
Mutex implementation:      GMutex (native futex on Linux)
DataChannels support:      yes
Recordings post-processor: no
TURN REST API client:      yes
Doxygen documentation:     no
Transports:
    REST (HTTP/HTTPS):     yes
    WebSockets:            yes
    RabbitMQ:              no
    MQTT:                  no
    Unix Sockets:          yes
    Nanomsg:               no
Plugins:
    Echo Test:             yes
    Streaming:             yes
    Video Call:            yes
    SIP Gateway:           yes
    NoSIP (RTP Bridge):    yes
    Audio Bridge:          yes
    Video Room:            yes
    Voice Mail:            yes
    Record&Play:           yes
    Text Room:             yes
    Lua Interpreter:       no
    Duktape Interpreter:   no
Event handlers:
    Sample event handler:  yes
    WebSocket ev. handler: yes
    RabbitMQ event handler:no
    MQTT event handler:    no
    Nanomsg event handler: no
    GELF event handler:    yes
External loggers:
    JSON file logger:      no
JavaScript modules:        no

4. 运行Janus

Janus运行需要参数配置,安装目录(/opt/janus/etc/janus/)已经有配置的sample

进入以后,发现有很多jcfg.sample文件,比如janus.jcfg.sample janus.transport.websockets.jcfg.sample

需要把这些都复制成可被读取的文件(即去掉.sample结尾),要全部复制。

所以需要复制第一个文件名称,替换命令里面的名字,执行命令,再复制第二个文件名称,替换命令里面的名字,再执行…直到复制完文件夹下的十几个.sample文件

文件名均为 xxx.jcfg.sample 后面的文件名就是xxx.jcfg(即 前面的删掉 .sample

sudo cp -rf 文件名 文件名(去掉最后的sample)

所以假如复制的文件名为 janus.jcfg.sample ,命令就是 ↓ 这条

sudo cp -rf janus.jcfg.sample janus.jcfg

全部完成后,需要生成ssl证书。


5. ssl证书

Janus默认的配置,是没有enable SSL的,意味着,httpswss不支持。而有些浏览器,要拉起摄像头,必须是加密协议下的。所以,如果你Demo运行不起来,可以服务端配置一下SSL

cd ~
mkdir ssl
cd ssl
# Gen ssl certs:
openssl req -new -newkey rsa:4096 -nodes -keyout key.pem -out cert.csr
openssl x509 -req -sha256 -days 365 -in cert.csr -signkey key.pem -out cert.pem
chmod 600 cert.csr
chmod 600 cert.pem
chmod 600 key.pem

生成的过程中会让你输入信息,姓名密码之类的,直接enter跳过即可,不能跳过的随便填。

注意:如果填密码的时候是输入了密码的,那么要记住它,改配置文件需要填密码。

这个是私人证书,访问时会报不安全,如果公司性质的需要另外申请。


5.1 配置文件修改ssl信息

打开刚才改.sample文件的目录 /opt/janus/etc/janus/

使用文本编辑janus.jcfg,注意这里的证书路径需要在文件夹中找一下,不同的用户生成不同

比如我的是root用户,我的ssl证书生成在/root/ssl, 并且由于我填密码时enter跳过了,所以pwd为空

注意前面的#要去掉,填完之后前面三行复制即可

certificates: {
        cert_pem = "/root/ssl/cert.pem"
        cert_key = "/root/ssl/key.pem"
        cert_pwd = ""
        #dtls_accept_selfsigned = false
        #dtls_ciphers = "your-desired-openssl-ciphers"
        #rsa_private_key = false
}

再编辑同目录下的janus.transport.http.jcfg,把https改为true,去掉secure_port的注释#certificates配置跟上面一样

general: {
        #events = true                                  # Whether to notify event handlers about transport events (default=true)
        json = "indented"                               # Whether the JSON messages should be indented (default),
                                                                        # plain (no indentation) or compact (no indentation and no spaces)
        base_path = "/janus"                    # Base path to bind to in the web server (plain HTTP only)
        http = true                                             # Whether to enable the plain HTTP interface
        port = 8088                                             # Web server HTTP port
      
        https = true                                    # Whether to enable HTTPS (default=false)
        secure_port = 8089                              # Web server HTTPS port, if enabled

}


certificates: {
        cert_pem = "/root/ssl/cert.pem"
        cert_key = "/root/ssl/key.pem"
        cert_pwd = ""
        #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
}

再编辑同目录下的janus.transport.websockets.jcfg,把wss改为true,去掉wss_port的注释#certificates配置跟上面一样

general: {

        ws = true                                               # Whether to enable the WebSockets API
        ws_port = 8188                                  # WebSockets server port
        #ws_interface = "eth0"                  # Whether we should bind this server to a specific interface only
        #ws_ip = "192.168.0.1"                  # Whether we should bind this server to a specific IP address only
        wss = true                                              # Whether to enable secure WebSockets
        wss_port = 8989                         # WebSockets server secure port, if enabled
}

certificates: {
        cert_pem = "/root/ssl/cert.pem"
        cert_key = "/root/ssl/key.pem"
        cert_pwd = ""
        #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
}

注意:改的这三个文件均为.jcfg结尾的文件(刚才4. 运行Janus时转化的),如果改到了.sample结尾的文件,配置就不生效了。



6. 运行

所有的准备和配置都搞定了,接下来就是启动服务。

/opt/janus/bin/janus --debug-level=7

终端的执行结果

libwebsockets logging: 0
Websockets server started (port 8188)...
Using certificates:
        /root/ssl/cert.pem
        /root/ssl/key.pem
Secure Websockets server started (port 8989)...
Admin Websockets server disabled
Secure Admin Websockets server disabled

JANUS WebSockets transport plugin initialized!    <---JANUS websocket初始化

        Version: 1 (0.0.1)
           [janus.transport.websockets] JANUS WebSockets transport plugin
           This transport plugin adds WebSockets support to the Janus API via libwebsockets.
           Plugin API version: 8
           Janus API: enabled
           Admin API: disabled
           
WebSockets thread started     <---JANUS websocket启动成功

如果是这样说明启动成功了!

检查运行端口

lsof -i | grep janus

终端运行结果

janus   32306 chenxiaofeng    5u  IPv6  887081      0t0  UDP *:rfe 
janus   32306 chenxiaofeng    6u  IPv6  887082      0t0  UDP *:5004 
janus   32306 chenxiaofeng   13u  IPv6  884414      0t0  TCP *:omniorb (LISTEN)
janus   32306 chenxiaofeng   16u  IPv6  884415      0t0  TCP *:8089 (LISTEN)
janus   32306 chenxiaofeng   21u  IPv4  884417      0t0  TCP *:8188 (LISTEN)
janus   32306 chenxiaofeng   24u  IPv4  884418      0t0  TCP *:8989 (LISTEN)

8089https8188ws8989wss(websocket secure)

STUN server警告

[WARN] Janus is deployed on a private address (192.168.1.107) but you didn't specify any STUN server! Expect trouble if this is supposed to work over the internet and not just in a LAN...

启动的时候还会有STUN警告信息,对于我们运行Demo是没问题的。因为一般运行在局域网,没有P2P打通的需要。

但如果你是正式使用则需要解决这个警告,需要安装STUN server, 也就是coturn

打开/opt/janus/etc/janus/janus.jcfg,修改配置

nat: {
        #stun_server = "stun.voip.eutelia.it"
        #stun_port = 3478
..
        #turn_server = "myturnserver.com"
        #turn_port = 3478
        #turn_type = "udp"
        #turn_user = "myuser"
        #turn_pwd = "mypassword"

安装coturn

git clone https://github.com/coturn/coturn
cd coturn
./configure 
make 
sudo make install

安装coturn服务器不一定和janus一起,也可以一起。总之装好后把信息写到janus的配置文件中。



7. 在线demo


我们可以在服务端通过http-serverdemohtml发布到本地服务器,方便我们使用

首先我们需要在ubantu中安装nodejs,参考ubantu下nodejs安装

安装完成后,全局安装http-server

npm -g install http-server

安装好以后,进入janus源码的html目录。

cd /usr/local/janus-gateway/html

然后执行http-server

注意:webdemo,默认都是走http的,这在有些环境下的浏览器,是无法拉起摄像头的(权限问题),推荐使用https

这里/root/ssl是ssl证书生成的目录

http-server --ssl --cert /root/ssl/cert.pem --key /root/ssl/key.pem

启动后访问即可,由于是私人ssl证书,浏览器会有警告,继续前往即可。
在这里插入图片描述

此时就可以访问在线的demo了。


服务端的部署到这里就结束了,接下来是前端模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/51981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数

jQuery.get(url&#xff0c;[data]&#xff0c;[callback]&#xff0c;[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…

RWEQ模型——土壤风蚀模拟

详情点击链接&#xff1a;基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 前沿 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的…

QObject::connect: No such signal me::sendMsg(QString s) in ...

QObject::connect: No such signal me::sendMsg&#xff08;QString s&#xff09; in ... 解决方案 在使用qt4的connect中&#xff0c;爆的bug&#xff1a; 导致 teacher 的槽函数 receiveMsg(QString s) 一直没有被调用。。。。 解决方案 去掉参数名&#xff0c; 保留类型…

我的第一个flutter项目(Android Webview)

前言&#xff1a;flutter开发环境搭建Flutter的开发环境搭建-图解_☆七年的博客-CSDN博客 第一个flutter简单项目&#xff0c;内容是一个主界面&#xff0c;其中&#xff1a; 1.内容点击数字自增 2.跳转一个空页&#xff0c; 3.跳转一个WebView界面 其中涉及添加主键&#xf…

【C++ 进阶】继承

一.继承的定义格式 基类又叫父类&#xff0c;派生类又叫子类&#xff1b; 二.继承方式 继承方式分为三种&#xff1a; 1.public继承 2.protected继承 3.private继承 基类成员与继承方式的关系共有9种&#xff0c;见下表&#xff1a; 虽然说是有9种&#xff0c;但其实最常用的还…

MySQL 8.0详细安装配置教程

一. 前言 MySQL是目前最为流行的开源数据库产品&#xff0c;是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发&#xff0c;后来被Oracle公司收购&#xff0c;目前属于Oracle公司。因为开源&#xff0c;所以任何人都能从官网免费下载MySQL软件&#xff0c…

Jmeter接口/性能测试,Jmeter使用教程(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、线程组 线程组…

【unity】ShaderGraph学习笔记

【unity】ShaderGraph学习笔记 创建ShaderGraph 创建URP的shaderGraph文件 在Project面板里Create→ShaderGraph→URP→这里主要有几个选项 Lit Shader Graph&#xff1a;有光照三维着色器 Unlit Shader Graph&#xff1a;无光照三维着色器 Sprite Custom Lit Shader Gra…

Flutter 调试工具篇 | 壹 - 使用 Flutter Inspector 分析界面

theme: cyanosis 1. 前言 很多朋友可能在布局过程中、或者组件使用过程中&#xff0c;会遇到诸如颜色、尺寸、约束、定位等问题&#xff0c;可能会让你抓耳挠腮。俗话说&#xff0c;磨刀不误砍柴工&#xff0c;会使用工具是非常重要的&#xff0c;其实 Flutter 提供了强大的调试…

Kafka入门到起飞系列 - 副本机制,什么是副本因子呢?

我们一直在讲一个主题会有多个分区&#xff0c;这多个分区可以分布在一台服务器上&#xff0c;也可以分布在多台服务器上&#xff0c;还可以增加分区&#xff08;Kafka目前只支持分区&#xff09;&#xff0c;这是Kafka提供的一种横向扩展的手段 比如我们创建了一个主题&#x…

机器学习:异常检测

问题定义 anomaly&#xff0c;outlier&#xff0c; novelty&#xff0c; exceptions 不同的方法使用不同的名词定义这类问题。 应用 二分类 假如只有正常的数据&#xff0c;而异常的数据的范围非常广的话&#xff08;无法穷举&#xff09;&#xff0c;二分类这些不好做。另外就…

MySQL数据库配置及创建用户和授权

注意&#xff1a; 都是基于MySQL8.0以上版本 1、检查是否安装过sql [rootlocalhost ~]# rpm -[qa](https://so.csdn.net/so/search?qqa&spm1001.2101.3001.7020) | grep mysql[rootlocalhost ~]# rpm -qa | grep [mariadb](https://so.csdn.net/so/search?qmariadb&…

左值引用与右值引用的区别?右值引用的意义?

左值引用与右值引用的区别&#xff1f;右值引用的意义&#xff1f; 1 区别1.1 功能差异1.2 左值引用1.3 右值引用1.3.1 实现移动语义1.3.2 实现完美转发 2 引用的作用3 区分左值和右值3.1 左值3.2 右值 1 区别 左值引用是对左值的引用&#xff1b;右值引用是对右值的引用。 &…

04 http连接处理(上)

基础知识&#xff1a;epoll、http报文格式、状态码和有限状态机 代码&#xff1a;对服务端处理http请求的全部流程进行简要介绍&#xff0c;然后结合代码对http类及请求接收进行详细分析。 epoll epoll_create函数 #include <sys/epoll.h> int epoll_create(int size)…

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积…

CleanMyMac X4.14.1中文版如何清理 Mac系统?CleanMyMac 真的能断网激活吗?

CleanMyMac X4.14.1中文版如何清理 Mac系统&#xff1f;Mac系统在使用过程中都会产生大量系统垃圾&#xff0c;如不需要的系统语言安装包&#xff0c;视频网站缓存文件&#xff0c;mac软件卸载残留的注册表等。 随着时间推移&#xff0c;mac系统垃圾就会越来越多&#xff0c;电…

美团小图币代挂教程

登陆美团官网获取对应的cookie 美团官网&#xff0c;点击右上角登陆对应账号。登陆成功后使用f12来获取 cookie 此时如果没有任何数据&#xff0c;点击网页刷新。找到如下的网络请求 赋值cookie项的全部内容&#xff0c;此时已经获取到对应账号的cookie 使用cookie登陆代挂…

Web博客项目及jwt的学习

这几天完善了发布博客&#xff0c;完成了收藏博客的功能 博客项目 一共有三种身份&#xff1a; 访客&#xff08;未登录&#xff09;&#xff0c;用户&#xff0c;管理员。 其中管理员拥有的功能最多&#xff0c;其次是用户&#xff0c;然后是访客。 从功能上看&#xff1a…

一文3000字从0到1使用Selenium进行自动化测试

对于很多刚入门的测试新手来说&#xff0c;大家都将自动化测试作为自己职业发展的一个主要阶段。可是&#xff0c;在成为一名合格的自动化测试工程师之前&#xff0c;我们不仅要掌握相应的理论知识&#xff0c;还要进行大量的实践&#xff0c;积累足够的经验&#xff0c;以便快…

7.7 SpringBoot实战 管理员借阅审核列表 --分页和枚举的使用

文章目录 前言一、需求二、定义接口 BookAdminController三、核心实现 BookBorrowService新建 BookBorrowService 接口定义如下&#xff1a;新建 BookBorrowServiceImpl 类&#xff0c;核心实现逻辑&#xff1a;新建 BookBorrowBO 四、图书借阅状态枚举 BookBorrowStatusEnum五…