基于Janus的WebRTC服务器部署与实时通信Demo实战
1. 从零开始:为什么选择Janus搭建你的WebRTC服务器?
如果你对实时音视频开发感兴趣,无论是想做一个在线会议应用、一个直播连麦功能,还是一个简单的视频聊天Demo,那你肯定绕不开WebRTC。WebRTC是个好东西,它让浏览器和移动端能直接进行P2P音视频通信,但光有前端技术还不够,你还需要一个“中间人”来帮忙协调——这就是信令服务器。信令服务器负责在两端建立连接前,交换一些必要的信息,比如“我是谁”、“我在哪”、“我用什么编码”。
市面上信令服务器的方案不少,有自己用Node.js、Go从头写的,也有现成的开源项目。Janus就是其中一个非常流行且强大的选择。我最早接触Janus是在几年前做一个内部视频评审系统的时候,当时也试过其他方案,但Janus给我的感觉是“功能全、文档相对清晰、社区活跃”。它不仅仅是一个简单的信令服务器,更是一个WebRTC网关,内置了像视频房间(VideoRoom)、流媒体转发(Streaming)、回声测试(EchoTest)等多个开箱即用的插件,你几乎不用写后端逻辑,就能搭建起一个功能丰富的实时通信应用。
不过,Janus的部署对于新手来说,确实有点“劝退”。网上教程很多,但要么年代久远,要么步骤跳跃,我在第一次部署时就踩了不少坑,比如依赖库版本冲突、SSL证书配置不对、Demo页面死活打不开摄像头等等。这篇文章,我就结合自己多次部署的经验,手把手带你走一遍完整的流程。我们的目标很明确:在一台Ubuntu服务器上,从源码编译安装Janus,配置好HTTPS和WSS(WebSocket Secure),最后分别用网页和Android客户端跑通Demo。我会把过程中可能遇到的“坑”和解决办法都列出来,让你一次成功。
2. 搭建前的准备:环境与依赖库安装全攻略
工欲善其事,必先利其器。在开始编译Janus之前,我们需要把它的“左膀右臂”——各种依赖库给安装好。这个过程有点像搭积木,缺一块都不行。我强烈建议你使用一台干净的Ubuntu 18.04或20.04 LTS系统,可以减少很多不必要的麻烦。
2.1 系统基础环境更新
首先,登录你的服务器,更新一下软件包列表,确保我们安装的都是最新版本的依赖。
sudo apt-get update
sudo apt-get upgrade -y
接下来,安装一些编译所需的通用工具,比如git、build-essential、pkg-config、autoconf、automake、libtool等。这些是编译大多数开源项目的标配。
sudo apt-get install -y git build-essential pkg-config autoconf automake libtool cmake
2.2 通过包管理器安装核心依赖
Janus依赖的库不少,其中一部分可以通过Ubuntu的官方仓库直接安装,省时省力。下面这条命令基本上涵盖了大部分基础依赖。
sudo apt-get install -y 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 gengetopt
这里有个大坑需要注意:命令里的libcurl4-openssl-dev一定要安装成功。我曾经有一次安装时网络问题导致这个包没装上,后来运行Demo时,流媒体插件(Streaming)的RTSP拉流功能就一直报错,排查了好久才发现是这个问题。安装完成后,可以用dpkg -l | grep libcurl来确认一下。
2.3 源码编译安装关键依赖
有些库对版本有要求,或者Ubuntu仓库里的版本太老,我们就需要从源码编译安装。这是整个准备过程中最容易出错的地方。
2.3.1 安装libnice(ICE连接核心)
libnice是实现ICE(交互式连接建立)协议的库,对于NAT穿透至关重要。Janus官方推荐用meson和ninja来构建新版本,但实测在有些环境下配置比较繁琐。
# 官方方法(可能遇到Python3或Meson版本问题)
git clone https://gitlab.freedesktop.org/libnice/libnice
cd libnice
meson --prefix=/usr build && ninja -C build && sudo ninja -C build install
如果你像我一样,觉得meson那一套有点复杂,或者编译失败了,可以退而求其次,使用老版本的autotools方式来编译。我们可以从Ubuntu的旧源码包网站下载一个稳定版本。
wget https://launchpad.net/ubuntu/+source/libnice/0.1.16-1/+build/18937448/+files/libnice_0.1.16.orig.tar.gz
tar -xzvf libnice_0.1.16.orig.tar.gz
cd libnice-0.1.16
./configure --prefix=/usr
make
sudo make install
这种方式通常更稳妥,虽然版本旧一点,但对于跑通Demo和大多数基础功能来说完全足够。
2.3.2 安装libwebsockets(WebSocket支持)
WebSocket是现代Web应用与服务器通信的标配,Janus也支持通过WebSocket传输信令。安装libwebsockets:
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
# 如果你想要稳定版,可以切换分支,例如:git checkout v4.3-stable
mkdir build
cd build
# 注意这个参数,是为了解决一个已知的编译问题
cmake -DLWS_MAX_SMP=1 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make
sudo make install
安装成功后,后续编译Janus时会自动检测并启用WebSocket支持。
2.3.3 升级libsrtp(安全实时传输协议)
系统可能已经通过apt安装了libsrtp-dev,但版本可能较低(如1.x)。Janus官方建议使用2.x版本以获得更好的安全性和功能。我们可以并行安装新版本,两者不会冲突。
# 检查现有版本
apt-cache policy libsrtp-dev
# 下载并编译安装libsrtp2
wget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz
tar -xzvf v2.5.0.tar.gz
cd libsrtp-2.5.0
./configure --prefix=/usr --enable-openssl
make shared_library
sudo make install
新版本库文件名为libsrtp2,Janus在编译时会优先链接它。
2.3.4 可选安装:usrsctp(支持Data Channel)
如果你需要用到数据通道(Data Channel)功能,比如在音视频流之外传输文本、文件等,就需要安装usrsctp库。对于初次体验,这个不是必须的。
git clone https://github.com/sctplab/usrsctp.git
cd usrsctp
./bootstrap
./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6
make
sudo make install
3. 编译与安装Janus网关
依赖库全部就位,现在可以请出我们的主角Janus了。从GitHub拉取最新代码进行编译。
git clone https://github.com/meetecho/janus-gateway.git
cd janus-gateway
在编译之前,我们需要生成配置脚本。Janus使用了GNU的构建系统。
sh autogen.sh
接下来是关键的configure步骤。这里我们可以指定安装目录和启用哪些功能。我习惯将其安装到/opt/janus目录下,方便管理。
./configure --prefix=/opt/janus --enable-websockets --enable-post-processing
--enable-websockets确保WebSocket支持被编译进去。--enable-post-processing是用于录制文件的后处理功能,可按需添加。如果你之前成功安装了usrsctp,并且希望启用数据通道,可以加上--enable-data-channels。
执行configure后,终端会打印出一份详细的摘要,一定要仔细看一下!这会告诉你哪些功能被启用了,哪些因为依赖缺失被禁用了。以下是我这边成功的输出片段,你需要重点关注:
Compiler: gcc
libsrtp version: 2.x
SSL/crypto library: OpenSSL
DataChannels support: yes (因为安装了usrsctp)
Transports:
WebSockets: yes
Plugins:
Echo Test: yes
Video Room: yes
... (其他插件)
确认关键功能(如WebSockets、VideoRoom)都是yes后,就可以开始编译和安装了。
make
sudo make install
编译过程可能需要几分钟。安装完成后,所有文件都会存放在/opt/janus目录下。其中,bin/janus是可执行文件,etc/janus/是配置文件目录,share/janus/存放了一些示例用的媒体文件。
4. 关键配置:SSL证书与服务器安全设置
Janus安装好了,但直接运行还不行,我们需要对它进行配置,尤其是安全相关的配置。现在大多数浏览器(如Chrome)都要求访问音视频设备(摄像头、麦克风)的页面必须使用HTTPS协议,我们的WebSocket连接最好也使用安全的WSS。这就需要我们配置SSL证书。
4.1 生成自签名SSL证书
对于开发和测试,我们可以自己生成一个自签名证书。在生产环境,你需要使用由可信CA(如Let‘s Encrypt)签发的证书。
mkdir -p ~/ssl
cd ~/ssl
# 生成私钥和证书签名请求(CSR)
openssl req -new -newkey rsa:2048 -nodes -keyout key.pem -out cert.csr
# 生成自签名证书
openssl x509 -req -sha256 -days 365 -in cert.csr -signkey key.pem -out cert.pem
# 设置适当的权限
chmod 600 key.pem cert.pem
在执行openssl req命令时,会交互式地询问你一些信息,比如国家、省份、城市、组织名称等。对于自签名证书,这些都可以随意填写,或者一路回车用默认值。但请注意Common Name (e.g., server FQDN or YOUR name) 这一项,最好填写你服务器的IP地址或域名,如果只是本地测试,写localhost也行。
4.2 修改Janus核心配置文件
Janus的配置文件都在/opt/janus/etc/janus/目录下,里面有很多以.sample结尾的示例文件。第一步就是复制这些文件,去掉.sample后缀。
cd /opt/janus/etc/janus/
sudo cp janus.jcfg.sample janus.jcfg
sudo cp janus.transport.http.jcfg.sample janus.transport.http.jcfg
sudo cp janus.transport.websockets.jcfg.sample janus.transport.websockets.jcfg
# 复制你计划使用的插件配置文件,例如视频房间
sudo cp janus.plugin.videoroom.jcfg.sample janus.plugin.videoroom.jcfg
接下来,逐个修改关键配置文件。
首先修改janus.jcfg,这是主配置文件。我们需要找到certificates部分,指定我们刚生成的证书路径。
sudo nano /opt/janus/etc/janus/janus.jcfg
找到类似下面的部分,取消注释并修改路径:
certificates: {
cert_pem = "/home/你的用户名/ssl/cert.pem"
cert_key = "/home/你的用户名/ssl/key.pem"
# cert_pwd = "yourpassphrase" # 如果你的私钥有密码,在此填写
}
接着修改janus.transport.http.jcfg,启用HTTPS并指定端口。
sudo nano /opt/janus/etc/janus/janus.transport.http.jcfg
修改general和certificates部分:
general: {
... 其他配置 ...
http = true
port = 8088 # HTTP端口
https = true # 启用HTTPS
secure_port = 8089 # HTTPS端口
}
certificates: {
cert_pem = "/home/你的用户名/ssl/cert.pem"
cert_key = "/home/你的用户名/ssl/key.pem"
}
最后修改janus.transport.websockets.jcfg,启用安全的WebSocket(WSS)。
sudo nano /opt/janus/etc/janus/janus.transport.websockets.jcfg
general: {
ws = true
ws_port = 8188 # 普通WebSocket端口
wss = true # 启用安全WebSocket
wss_port = 8989 # WSS端口
}
certificates: {
cert_pem = "/home/你的用户名/ssl/cert.pem"
cert_key = "/home/你的用户名/ssl/key.pem"
}
4.3 处理STUN服务器警告
如果你在局域网内测试,且客户端和服务器在同一网络,可以暂时忽略STUN。但Janus启动时会有警告。如果你想消除它,或者为未来公网访问做准备,可以安装一个STUN/TURN服务器,比如Coturn。安装很简单:
git clone https://github.com/coturn/coturn
cd coturn
./configure
make
sudo make install
安装后,在janus.jcfg中找到nat部分,配置你的STUN服务器地址(如果Coturn和Janus装在同一台机器,可以填本机IP或stun:your_server_ip)。
nat: {
stun_server = "你的服务器IP或域名"
stun_port = 3478
# 如果需要TURN,还需配置turn_server, turn_port, turn_user, turn_pwd等
}
5. 启动Janus与问题排查
配置完成后,终于可以启动Janus了。我们以调试模式启动,方便查看日志。
/opt/janus/bin/janus --debug-level=7
如果一切顺利,你会看到一大串启动日志。别被吓到,我们关注几个关键点:
- 插件加载成功:寻找类似
JANUS VideoRoom plugin initialized!和JANUS EchoTest plugin initialized!这样的行,这表示核心插件加载正常。 - 传输层启动:找到
WebSockets thread started和Secure WebSockets server started (port 8989)...,这说明WSS服务已经监听在8989端口。 - HTTP/S服务:找到
HTTP webserver started (port 8088, /janus path listener)...和HTTPS的相关日志。 - 警告信息:注意看有没有
[FATAL]或[ERR]级别的错误。常见的警告如Data Channels support not compiled(没装usrsctp)或配置文件找不到(.jcfg没复制对),只要不影响你需要的核心功能(EchoTest, VideoRoom),可以暂时不管。
你可以另开一个终端,用netstat或lsof命令检查端口是否在监听:
sudo lsof -i -P -n | grep janus
应该能看到janus进程监听着8088(HTTP)、8089(HTTPS)、8188(WS)、8989(WSS)等端口。
常见启动问题:
- 端口被占用:修改对应配置文件(
janus.transport.http.jcfg,janus.transport.websockets.jcfg)中的端口号。 - 证书路径错误:检查
cert_pem和cert_key的路径是否正确,以及文件权限(Janus进程用户是否有读取权限)。 - 插件配置缺失:确保你计划使用的插件(如
videoroom)的配置文件(janus.plugin.videoroom.jcfg)已从sample复制。
6. 运行网页端Demo:从HTTP到HTTPS的跨越
Janus源码包里自带了一个非常棒的网页Demo,位于janus-gateway/html目录下。我们需要一个简单的HTTP服务器来托管这些静态文件。
一个轻量级的选择是http-server,一个基于Node.js的零配置命令行HTTP服务器。
# 安装Node.js和npm(如果尚未安装)
sudo apt-get install -y nodejs npm
# 安装http-server
sudo npm install -g http-server
进入Demo目录并启动服务器:
cd /path/to/janus-gateway/html
http-server -p 8000
现在,用浏览器访问 http://你的服务器IP:8000。你会看到一个列表页面,里面有Echo Test、Video Room、Streaming等多个Demo。
但是! 当你点击“Echo Test”或“Video Room”并尝试“Start”时,浏览器很可能不会弹出摄像头权限请求,或者直接报错。这是因为现代浏览器(特别是Chrome)要求访问媒体设备(摄像头/麦克风)的页面必须运行在HTTPS下(或localhost)。
所以,我们必须用HTTPS来服务Demo页面。这就需要用到之前为Janus生成的SSL证书。用http-server启动HTTPS服务:
http-server -p 8443 -S -C /home/你的用户名/ssl/cert.pem -K /home/你的用户名/ssl/key.pem
-S启用SSL,-C指定证书,-K指定私钥。
现在访问 https://你的服务器IP:8443。浏览器会提示“您的连接不是私密连接”,这是因为我们用的是自签名证书,不受浏览器信任。这是正常的,在开发环境直接点击“高级”->“继续前往”即可。
第二个关键点:Demo页面的信令服务器地址需要修改。默认情况下,网页Demo尝试连接本地的WebSocket(ws://localhost:8188)。现在我们的Janus服务器在另一台机器上,并且使用了WSS。我们需要修改对应的JavaScript文件。
打开html目录下的janus.js文件(这是所有Demo共用的核心库),找到大约第90行左右的server变量定义,或者更简单的方法是,在Demo页面本身就有设置服务器的地方。以videoroomtest.js为例,你可以直接修改它,或者在页面加载后,在浏览器控制台里设置全局变量。更一劳永逸的方法是修改源码:
cd /path/to/janus-gateway/html
# 备份原文件
cp videoroomtest.js videoroomtest.js.bak
# 使用sed命令替换服务器地址,将localhost替换为你的服务器IP,ws替换为wss,端口改为8989
sed -i 's/var server = "ws:\/\/" + window.location.hostname + ":8188"/var server = "wss:\/\/你的服务器IP:8989"/g' videoroomtest.js
修改后,重启http-server,再次用HTTPS访问页面。点击“Video Room”,输入一个显示名,加入默认的“1234”房间。如果一切配置正确,你应该能看到自己的摄像头画面。打开另一个浏览器标签页,用另一个名字加入同一个房间,就能实现简单的视频通话了!Echo Test同理,它会把你本地摄像头的画面推送给Janus服务器,然后服务器立刻把同样的流拉回来给你看,用来测试音视频环路是否通畅。
7. 运行Android客户端Demo
对于移动端,Janus官方也提供了Android的SDK和示例项目。项目地址是:https://github.com/meetecho/janus-mobile-sdk。这个仓库里包含了核心的C语言库(需要交叉编译)和一个Android Studio示例工程。
编译准备:
- 克隆仓库:
git clone https://github.com/meetecho/janus-mobile-sdk.git - 进入目录,首先执行
make。这个make目标会自动下载并编译一些必要的依赖,比如boringssl(Google的OpenSSL分支)。这里可能会遇到第一个坑:网络问题导致依赖下载失败。你可能需要配置代理或者手动下载。 - 官方
Makefile里可能还会调用go语言工具,如果系统没有安装,需要sudo apt install golang。
导入Android Studio:
- 用Android Studio打开
janus-mobile-sdk/examples/android目录。 - 等待Gradle同步完成。这里可能会遇到第二个坑:NDK版本兼容性问题。你可能需要根据项目
build.gradle里指定的ndkVersion,在Android Studio的SDK Manager中下载对应的NDK版本。 - 同步成功后,连接真机或启动模拟器,直接运行
app模块。
运行与配置: 应用启动后,你会看到一个简单的界面,需要填写Janus服务器的地址。这里非常关键:
- 地址:填写你的Janus服务器的IP。
- 端口:如果你在Janus配置中启用了HTTP接口(
janus.transport.http.jcfg中的port = 8088),那么这里就填8088。Demo默认使用HTTP轮询(HTTP long polling)方式与Janus通信。 - 如果你想在Android上也用WebSocket,需要修改Demo代码,将通信协议改为
ws://your_ip:8188或wss://your_ip:8989,这需要改动网络请求部分的源码。
常见Android问题:
- CLEARTEXT traffic not permitted:如果你在Android 9 (Pie) 及以上版本,尝试连接HTTP(非HTTPS)的Janus服务器地址,会触发网络安全策略限制。解决方法是在
AndroidManifest.xml的<application>标签内添加:android:usesCleartextTraffic="true"。注意:这仅用于测试,生产环境应使用HTTPS/WSS。 - 无法看到视频:确保你的Android设备摄像头权限已授予该App。检查Janus服务器日志,看是否有连接和协商成功的记录。如果使用模拟器,模拟器本身可能没有摄像头,可以尝试使用虚拟摄像头数据。
跑通Android Demo的过程比网页端要曲折一些,主要问题集中在环境搭建和网络配置上。但只要耐心根据错误日志排查,一步步解决依赖和权限问题,最终看到手机屏幕上的视频流从Janus服务器拉取成功时,那种成就感是非常足的。这证明了你的Janus服务器已经具备了服务移动端的能力,为后续开发真正的跨平台应用打下了坚实的基础。
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)