webrtc 低延迟视频流研究测试
背景
- 之前试过nginx+rtmp的视频推流服务器,https://blog.csdn.net/IOT_SHUN/article/details/79684856 ,虽然画面清晰度很好,多客户的不会卡顿,但是延迟很高,
- 查阅资料发现基于webrtc的技术可以很好的解决这一问题,所以今天搭建一个webrtc的服务
webrtc介绍
常用的webrtc开源服务器技术
- 大而全的Kurento
- 务实主义的Licode
- 小而美的Mediasoup
- Kurento 在应用中有哪些问题,或者说,哪些是优势,哪些是劣势呢,我们看下面:
优势:
文档齐全无论API使用文档,还是部署文档都很齐全
功能强大,强大的路径和计算机视觉处理
模块化编程,方便扩展,这是对开发者很友好的地方
使用方便,客户端服务端都有专门的API 组件 接入系统,而且服务器端提供了J2EE node.js两种接口文档,覆盖很齐全
劣势:
代码太多太庞大,可能需要开发者有足够的功力才能驾驭这把屠龙刀
还一个重要原因就是性能比较差
- Mediasoup
优势:
性能优秀
支持很多的WebRTC 新特性(PlanB UnifiedPlan simulcast)
同时支持ORTC和WebRTC 的互通
劣势:
功能比较少
代码和架构相对来比较晦涩一点
信令模块只提供node.js 版本
- Licode 作为WebRTC 服务器有很多优势:
优点
功能齐全扩展方便,鉴权,存储,融合通信一应俱全
代码扩展简单,预留了足够的扩展接口
部署简单,一键脚本安装,很方便
缺点:
内部模块说明比较少
性能一般
服务端只提供的node.js 版本
Kurento
今天只研究测试Kurento,因为只能在ubuntu安装,但是好在可以用docker,
Ubuntu下本地安装Kurento
1.卸载kurento,使用aptitude卸载软件包,它具有更好的删除算法,删除了Kurento安装的所有依赖项
sudo aptitude remove kurento-media-server
2.确保已安装GnuPG
sudo apt-get update && sudo apt-get install --no-install-recommends --yes \
gnupg
输入完gnupg回车后:
在这里插入图片描述
3.定义系统中安装了哪个版本的Ubuntu,仅运行以下行之一
DISTRO="xenial" # KMS for Ubuntu 16.04 (Xenial)
DISTRO="bionic" # KMS for Ubuntu 18.04 (Bionic) //由于使用的是Ubuntu18.04服务器,所以选择这个1
4.将Kurento存储库添加到您的系统配置中
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83
回车后依次输入下面命令并回车:
sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <<EOF
# Kurento Media Server - Release packages
deb [arch=amd64] http://ubuntu.openvidu.io/6.13.0 $DISTRO kms6
EOF
5.安装KMS
sudo apt-get update && sudo apt-get install --yes kurento-media-server
6.针对KMS服务常用命令
sudo service kurento-media-server start //启动kms
sudo service kurento-media-server stop //停止kms
sudo service kurento-media-server restart //重启kms
这里我们选择启动kms服务:sudo service kurento-media-server start
7.检查KMS服务是否开启
curl -i -N \
-H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Host: 127.0.0.1:8888" \
-H "Origin: 127.0.0.1" \
http://127.0.0.1:8888/kurento
docker部署
#安装最新版kurento
docker pull kurento/kurento-media-server:latest
#启动镜像
docker run --name kms -d -p 8888:8888 kurento/kurento-media-server:latest
#查看KMS日志
docker logs kms
#实时查看:
docker logs -f kms
应用实践
注意安装npm https://blog.csdn.net/weixin_55719805/article/details/128094550
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs
官方历程
git clone https://github.com/Kurento/kurento-tutorial-node.git
kurento有几个重要的配置文件:
/etc/kurento/kurento.conf.json
/etc/kurento/modules/kurento/MediaElement.conf.ini
/etc/kurento/modules/kurento/SdpEndpoint.conf.ini
/etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini
/etc/kurento/modules/kurento/HttpEndpoint.conf.ini
/etc/default/kurento-media-server
建议大家看看里面的内容,比如修改监听端口,配置stun/turn server地址等,都可以在里面找到答案。
不需要客户端浏览器直接播放
前端 https://github.com/lulop-k/kurento-rtsp2webrtc.git
更新20240118
测试发先node运行hellow-world,本地有图像,远程没有图像
教程 https://doc-kurento.readthedocs.io/en/6.13.2/tutorials/node/tutorial-helloworld.html
debug
- 安装turn
apt install coturn
引用
后面想了一下,发现是因为 Kurento 服务 和 我的浏览器 这两个 peer 端根本不在同一个局域网, 所以要借助 turn server 来转发。 但是我之前安装完 turn server 之后,并没有在 kerento 上进行配置。而对应的 demo 的 server.js 也没有连接 turn server 的代码。
虽然 demo 没有配置 turnserver ,但是教程文档确实有写, 看了一下文档: How to configure STUN/TURN?, 发现有两种配置方式:
一种是直接在 kms 服务的配置文件 /etc/kurento/modules/kurento/WebRtcEndpoint.conf.ini 中直接配置默认的 turn server 转发,然后重启 kms 服务
另一种是在浏览器端连接 kms 的时候,动态指定 turn server 地址,这种方式也是可以的,具体 API 文档: setTurnUrl
我用的是第二种,也就是连接的时候,动态指定 turn server 的地址,代码修改如下: server.js 加上一行代码就行了, 原先的代码是这样子:
参考资料
https://juejin.cn/post/6844904050148769800
https://blog.csdn.net/qq_29928745/article/details/107644884
https://kebingzao.com/2020/06/19/webrtc-sfu-kurento/