WebRTC 服务器之Janus概述和环境搭建

1 概述

          Janus 是由 Meetecho 开发的通用 WebRTC 服务器,它为构建 WebRTC 应用程序提供了一个模块化框架。服务器目标:Janus WebRTC 网关被设计为轻量级、通用的 WebRTC 服务器,除了实现以下方法外,它本身不提供任何功能:

  • 设置与浏览器的 WebRTC 媒体通信
  • 在客户端和服务器之间交换 JSON 消息
  • 在浏览器和服务器端应用程序逻辑之间中继 RTP/RTCP 和消息

        实际功能是在浏览器通过 Janus 核心连接的服务器端插件中实现的。这种模块化架构允许占用空间小,同时提供最大的灵活性。

1.1 主要特点

  • 模块化架构:将核心 WebRTC 功能与应用程序特定逻辑分离
  • 轻量级核心:用 C 语言编写,占用空间小
  • 插件系统:可通过各种应用程序(视频会议、流媒体、SIP 网关等)的插件进行扩展
  • 多种传输机制:支持 HTTP/REST、WebSockets、RabbitMQ、MQTT 和 Unix 套接字
  • 会话管理:处理连接、WebRTC 会话和插件附件
  • 媒体处理:处理媒体协商、编码和传输
  • 录制功能:支持录制 WebRTC 会话

2 janus搭建

云服务器端口开放(本地虚拟机环境则关闭防火墙即可)需要在安全组开放端口:

TCP/UDP 3478

UDP 30000-60000

2.1基础环境

sudo aptitude install libmicrohttpd-dev libjansson-dev libnice-dev libsofia-sip-ua-dev libopus-dev libogg-dev libcurl4-openssl-dev pkg-config gengetopt libtool automake libglib2.0-dev cmake libconfig-dev libssl-dev doxygen graphviz libavcodec-dev libavformat-dev libswscale-dev libavutil-dev

2.2 源码安装依赖

2.2.1 安装 WebSocket

git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
git branch -a 查看选择最新的稳定版本, 
git checkout v4.3.0 切换到较新稳定版本
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make && sudo make install

2.2.2 安装 libsrtp

git clone https://gitee.com/MediaNext/libsrtp.git
cd libsrtp
git checkout v2.3.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

2.2.3 安装libmicrohttpd

wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.71.tar.gz
tar zxf libmicrohttpd-0.9.71.tar.gz
cd libmicrohttpd-0.9.71/
./configure
make
sudo make install

2.2.4安装nginx

wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar xvzf nginx-1.15.8.tar.gz
cd nginx-1.15.8/# 配置,一定要支持https
./configure --with-http_ssl_module make
sudo make install 

2.3 编译 Janus

git clone https://github.com/meetecho/janus-gateway.git
git tag 查看当前的 tag,选择最新稳定的版本v0.10.4
git  checkout v0.10.4
sh autogen.sh
./configure --prefix=/opt/janus --enable-websockets --enable-post-processing 
make
sudo make install

3 配置文件和运行janus

3.1 基础环境配置

3.1.1 基于https生成ssl证书

mkdir -p ~/cert
cd ~/cert
# CA私钥
openssl genrsa -out key.pem 2048
# 自签名证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

3.1.2设置全局域名IP对应关系

后面需要填写一大堆ip,为了方便修改ip我们在 Ubuntu 中将 IP 作为全局域名的常见设置。

vim /etc/hosts

#新增域名 格式你的云服务器ip+本地环境的域名。后续填写域名即可
#本地就用127.0.0.1
117.111.111.111 janusserver.com

3.1.3修改nginx配置文件

janus服务器程序文件夹在/opt/janus/

基于nginx配置文件重定向至 /opt/janus/share/janus/demos

# HTTPS serverserver {listen       443 ssl;server_name  localhost;# 配置相应的keyssl_certificate      /home/ubuntu/cert/cert.pem;ssl_certificate_key  /home/ubuntu/cert/key.pem;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {# 指向janus demo所在目录root   /opt/janus/share/janus/demos;index  index.html index.htm;}}

启动nginx

sudo /usr/local/nginx/sbin/nginx

然后通过访问 https://127.0.0.1/ 。可以看到界面,但此时还不能正常通话。

3.1.4 安装和启动coturn

打洞服务器,本地测试可忽略。

sudo apt-get install libssl-dev
sudo apt-get install libevent-dev#git clone https://github.com/coturn/coturn 
#cd coturn
# 提供另一种安装方式turnserver是coturn的升级版本
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7./configure 
make && sudo make installsudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用户名:密码-v -f -r nort.gov &

3.2 janus 配置文件之Video room功能

janus配置

janus安装目录在/opt/janus。文件结构:

./bin

./etc

./include

./lib

./share

可执行文件

janus配置文件

janus头文件

janus库

存放脚本或者文档,web demo也在这里

需要配置的文件为(目录/opt/janus/etc/janus)先备份。先把.sample后缀的文件拷贝成jcfg后缀

# 进到对应的目录
cd /opt/janus/etc/janus
# 拷贝文件cp janus.jcfg.sample janus.jcfgcp janus.transport.http.jcfg.sample janus.transport.http.jcfgcp janus.transport.websockets.jcfg.sample janus.transport.websockets.jcfgcp janus.plugin.videoroom.jcfg.sample janus.plugin.videoroom.jcfgcp janus.transport.pfunix.jcfg.sample janus.transport.pfunix.jcfgcp janus.plugin.streaming.jcfg.sample	 janus.plugin.streaming.jcfgcp janus.plugin.recordplay.jcfg.sample janus.plugin.recordplay.jcfgcp janus.plugin.voicemail.jcfg.sample janus.plugin.voicemail.jcfgcp janus.plugin.sip.jcfg.sample janus.plugin.sip.jcfgcp janus.plugin.nosip.jcfg.sample janus.plugin.nosip.jcfgcp janus.plugin.textroom.jcfg.sample  janus.plugin.textroom.jcfgcp janus.plugin.echotest.jcfg.sample janus.plugin.echotest.jcfg

3.2.1 配置janus.jcfg

#大约202行左右,设置udp端口范围。
rtp_port_range = "50000-60000"
# 237行
stun_server = janusserver.comstun_port = 3478nice_debug = false
# 大概267行 填写云服务器外网ip地址
nat_1_1_mapping = janusserver.com#打洞服务器配置大概274行
# credentials to authenticate...turn_server = janusserver.comturn_port = 3478turn_type = "udp"turn_user = 用户名turn_pwd = 密码
rtp_port_range = "50000-60000"

3.2.2 配置janus.transport.http.jcfg

general: {json = "indented"                              base_path = "/janus"                    threads = "unlimited"                  http = true                                            port = 8088                                           https = true                                   secure_port = 8089                             
}certificates: {cert_pem = "/root/cert/cert.pem"cert_key = "/root/cert/key.pem"#cert_pwd = "secretpassphrase"#ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
}

3.2.3 配置janus.transport.websockets.jcfg 

general: {json = "indented"                             ws = true                                             ws_port = 8188                                 wss = true                                             wss_port = 8989                       
}
certificates: {cert_pem = "/root/cert/cert.pem"cert_key = "/root/cert/key.pem"#cert_pwd = "secretpassphrase"#ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
}

3.3 修改.js文件,指定wss协议

/opt/janus/share/janus/demos/videoroomtest.js

var server = "wss://" + window.location.hostname + ":8989";

3.4 配置coturn地址

本地测试无需打洞,部署云服务且使用打洞才需要这一步。

/opt/janus/share/janus/demos/videoroomtest.js

这里要写你的服务器ip,使用本地域名方式解析不出来

#83行添加server: server,iceServers :[{urls: ["turn:127.0.0.1(这里要写你的服务器ip,使用域名解析不出来):3478?transport=udp","turn:127.0.0.1(同理):3478?transport=tcp"      ],username: "jbj",credential: "123456"},{urls: ["stun:127.0.0.1:3478"]}],success: function() 

3.5 运行

涉及服务启动有点多,在这里进行总结。

#nginx启动
sudo /usr/local/nginx/sbin/nginx  
#启动coturn
sudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用户名:123456 -v -f -r nort.gov &
#jauns运行
/opt/janus/bin/janus --debug-level=5 --log-file=$HOME/janus-log

访问

https://IP/
或者
https://IP/videoroomtest.html

4.效果 

学习资料分享

0voice · GitHub

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19:常见的Halcon数据格式

遍历文件夹与文件选择 1)遍历文件夹: list_files( : : Directory, Options : Files) Directory:目录(文件夹路径) Options:选项 files 指定搜索的格式为文件 directories 指定搜索的格式为文件夹 re…

QML图像提供器 (Image Provider)

QML 中的图像提供器是一种自定义图像加载机制,允许你从非文件源(如数据库、网络或程序生成的内容)提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …

计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践

双目立体匹配 一、双目立体匹配算法理论与OpenCV、matlab实践一、双目立体匹配理论二、OpenCV实践三、优化建议四、算法对比与适用场景二、双目立体匹配算法理论及Matlab实践指南一、双目立体匹配理论二、Matlab实践步骤三、算法对比与优化建议四、完整流程示例五、常见问题与解…

AI国学智慧语录视频,条条视频10W+播放量

家人们!图书类带货玩法真的非常多,之前也分享过蛮多,例如情感语录、育儿教育、爆款图书金句类、AI历史人物解说类等等。 本期继续来分享一个对于普通人来说,上手相当简单,容易起号,可作为长线深耕的AI带货…

echart图表使用

2、接口编写 该部分代码定义了UserController控制器类,用于处理与用户相关的请求。包含一个用于跳转页面的方法和一个返回用户详细数据(以 JSON 格式呈现)的接口。前者负责将用户导航至指定页面,后者通过构建ChartVO对象并填充数…

Android短信监控技术实现:合法合规的远程采集方案

一年经验的全栈程序员,目前头发健在,但不知道能撑多久。 该项目已成功部署并稳定运行于企业生产环境,如需个性化定制方案,欢迎联系作者进行深度合作。 文章目录 前言 一、页面设计 1.页面显示 2.代码实现 二、具体代码实现 1.添加…

前端跨域问题怎么在后端解决

目录 简单的解决方法: 添加配置类: 为什么会跨域 1. 什么是源 2. URL结构 3. 同源不同源举🌰 同源例子 不同源例子 4. 浏览器为什么需要同源策略 5. 常规前端请求跨域 简单的解决方法: 添加配置类: packag…

【中间件】brpc_基础_execution_queue

execution_queue 源码 1 简介 execution_queue.h 是 Apache BRPC 中实现 高性能异步任务执行队列 的核心组件,主要用于在用户态线程(bthread)中实现任务的 异步提交、有序执行和高效调度。 该模块通过解耦任务提交与执行过程,提…

java学习之数据结构:一、数组

主要是对数组所有的东西进行总结,整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1)静态创建 2)动态创建 1.3数组遍历 1)for和while遍历 2)foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…

[Survey]SAM2 for Image and Video Segmentation: A Comprehensive Survey

BaseInfo TitleSAM2 for Image and Video Segmentation: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2503.12781Journal/Time2503Author四川大学,北京大学 1. Introduction 图像分割专注于识别单个图像中的目标、边界或纹理,而视频分割则将这…

用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本(推荐)3.3 使…

穿越数据森林与网络迷宫:树与图上动态规划实战指南

在 C 算法的浩瀚宇宙中,树与图就像是神秘的迷宫和茂密的森林,充满了未知与挑战。而动态规划则是我们探索其中的神奇罗盘,帮助我们找到最优路径。今天,就让我们一起深入这片神秘领域,揭开树与图上动态规划的神秘面纱&am…

UDP / TCP 协议

目录 一、前言: 数据封装与分用: 二、网络协议分层模型: 三、UDP / TCP 协议 UDP 协议: 1、UDP 协议段格式: 2、UDP 的特点: TCP 协议: 1、TCP 协议段格式: 2、TCP 协议的十…

Python 实现的运筹优化系统数学建模详解(动态规划模型)

相关代码链接:https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在计算机科学与数学建模的广阔领域中,算法如同精密的齿轮,推动着问题的解决与系统的运行。当面对复杂的优化问题时&…

langfuse本地安装

目录 安装命令项目准备用openai测试 安装命令 本地(docker compose):使用 Docker Compose 在你的机器上于 5 分钟内运行 Langfuse。 # 获取最新的 Langfuse 仓库副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 运行 …

每天学一个 Linux 命令(35):dos2unix

每天学一个 Linux 命令(35):dos2unix 命令简介 dos2unix 是一个用于将 Windows/DOS 格式的文本文件转换为 Unix/Linux 格式的实用工具。它主要处理行尾符的转换(将 CRLF 转换为 LF),同时也能处理编码问题和字符集转换。这个命令在跨平台文件共享、代码迁移和系统管理场…

第6章 Python 基本数据类型详解(int, float, bool, str)细节补充

文章目录 Python 基本数据类型深入解析(int, float, bool, str)一、整型(int)的底层机制二、浮点型(float)的陷阱与解决方案三、布尔型(bool)的底层本质四、字符串(str)的不可变性与优化五、类型间的隐式转换与陷阱六、性能优化与工具总结:关键细节与最佳实践Python…

19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?

引言:当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践,揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…

Java快速上手之实验六

1. 编写ItemEventDemo.java,当选中或取消选中单选钮、复选钮和列表框时显示所选的结果。 2.编写GUIExample.java,当选中或取消选中单选钮、复选钮时在标签中显示相应结果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):阅读与注释单选框这个类型的按钮 QRadioButton,及各种属性验证,

&#xff08;1&#xff09;按钮间的互斥&#xff1a; &#xff08;2&#xff09;源码来自于头文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…