8、SRS4.0源代码分析之WebRTC环境彻底搭建

目标:

本章节开始分析SRS4.0 WebRTC服务相关的代码逻辑,分析代码之前,根据个人的体验,最好的学习方式,应该是先把SRS4.0 WebRTC环境搭建起来,通过反复的实际操作,才能真正理解相关的知识点。

另外,由于WebRTC环境涉及的内容比较多:服务端、客户端浏览器设置、信令服务器、https协议,导致网上很多关于搭建SRS4.0 WebRTC服务环境的一些文档对新手总是不够友好,所以这篇文档把自己的搭建过程记录下来,方便后面查询学习。


内容:

1、WebRTC测试环境组网图

在这里插入图片描述

如上图所示,搭建SRS4.0 WebRTC测试环境大概需要三台主机,两个客户端和一个服务器,IP地址分别是192.168.9.100,192.168.9.101,192.168.9.200 (其实,一台实体机通过vmware起几台虚拟机也能搞定这个配置环境),客户端系统为win10,服务器系统为ubuntu16.04。

2、下载SRS4.0源代码并编译

在192.168.9.200服务器上,下载并编译SRS4.0源代码

// 从github下载SRS
git clone https://github.com/ossrs/srs.git    

// 或者从gitee下载SRS 
git clone https://gitee.com/winlinvip/srs.oschina.git  

// 切换到4.0分支
git checkout -b srs40 origin/4.0release  

// 从远程分支拉取代码
git pull  

执行如下命令完成代码编译

cd trunk/        // 进入源代码目录
./configure      // 执行配置文件
make             // 使用make命令编译

3、测试场景1:RTC to RTC推拉流测试

在这里插入图片描述
如上图,对于RTC to RTC的推拉流测试,服务端需要部署3个服务:
1、端口为8088的HTTPS服务,为客户的提供静态网页和js代码拉取。
2、端口为443的HTTPS服务,处理客户端发送的API请求。(这个443端口在客户端js代码中已经写死了
3、端口为8000的UDP端口,提供WebRTC服务。
这三个服务在SRS4.0中已经支持了,我们需要做的就是修改SRS的启动配置文件,并启动SRS。

1)在源代码的conf目录下,创建一个名为test.conf的启动配置文件,内容如下:
listen              1935;     ## RTMP服务端口号
max_connections     1000;
daemon              off;
srs_log_tank        console;  ## 表示服务在控制台运行,方便看日志

http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html; ## 这个路径下有客户端浏览器需要的静态网页和js代码
    https {
        enabled on;
        listen 8088;          ## 8088端口支持https server,为客户端提供静态网页
        key ./conf/server.key;
        cert ./conf/server.crt;
    }
}

http_api {
    enabled         on;
    listen          1985;
    https {
        enabled on;
        listen 443;             ## 443端口支持https api(注意这里的端口号一定要是443)
        key ./conf/server.key;
        cert ./conf/server.crt;
    }
}
stats {
    network         0;
}
rtc_server {
    enabled         on;            ## 打开WebRTC功能
    listen          8000;          ## WebRTC服务监听8000端口

    candidate       $CANDIDATE;    ## 正式环境,这里最好改成服务器的物理IP地址
}

vhost __defaultVhost__ {
    rtc {
        enabled     on;            ## RTC配置
        bframe      discard;
    }
}
2)启动SRS服务器
./objs/srs -c ./conf/test.conf
3)打开客户端浏览器

1、在192.168.9.100上,打开一个chrome浏览器,输入https://192.168.9.200:8088/players/rtc_publisher.html 如下图:
其中URL webrtc://192.168.9.200/live/livestream是客户端JS代码自动生成的,推拉流客户端必须保持一致
在这里插入图片描述
2、点击”开始推流“按钮,页面如下:记得要允许网页获取摄像头和麦克风权限
在这里插入图片描述
3、在192.168.9.101上,打开一个chrome浏览器,输入https://192.168.9.200:8088/players/rtc_player.html 如下图:
在这里插入图片描述
4、点击”播放视频“按钮,页面如下:
在这里插入图片描述
OK,这个简单的WebRTC推拉流测试就成功了。总结一下:先弄清楚基本原理和需要启动的服务后,重点是conf配置文件要写正确。如果还有问题的同学,可以给我留言。

4、测试场景2:SFU One to One推拉流测试

如果只是为了研究WebRTC协议,上面那个测试场景基本够用了。这里使用SRS4.0的WebRTC服务作为一个SFU,为客户端提供1对1的音视频通话,更像一个实际的产品,它的主要目的是启发大家基于SRS做二次开发,实现面向实际客户的RTC产品。

所以这个测试场景不可避免要引入信令服务器和https代理服务器的部署,对于这些组件,SRS的作者其实都已经提供了,只有搞清楚原理,搭建起来也很简单。

关于信令服务器和代理服务器的工作原理,可参考SRS作者写的技术文档 https://mp.weixin.qq.com/s/xWe6f9WRhtwnpJQ8SO0Eeg

因为这两个服务器是go语言写的,所以主机192.168.9.200的Ubuntu16.04系统中必须安装go语言环境,且版本最好是1.13以上。可参考以下链接:ubuntu安装go 1.13.8 https://blog.51cto.com/shijianfeng/2914276

1)SFU One to One模式服务部署图

在这里插入图片描述

2)修改SRS启动配置文件并启动SRS

修改SRS启动配置文件test.conf,内容如下:(重点就是要去掉和HTTPS相关的配置)

listen              1935;    ## RTMP服务端口号
max_connections     1000;
daemon              off;
srs_log_tank        console; ## 表示服务在控制台运行,方便看日志

http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}

http_api {
    enabled         on;
    listen          1985;
}
stats {
    network         0;
}
rtc_server {
    enabled         on;
    listen          8000;     ## WebRTC服务监听8000端口
    candidate       $CANDIDATE;
}

vhost __defaultVhost__ {
    rtc {
        enabled     on;
        bframe      discard;
    }
}

启动SRS4.0服务器

./objs/srs -c ./conf/test.conf
3)编译并启动httpx-static代理服务器和signaling信令服务器

1、编译并启动signaling信令服务器

cd ~/git/srs/trunk/3rdparty/signaling && make && ./objs/signaling

信令服务运行后打印日志如下,此服务默认监听1989端口

[trace] 2021/10/13 01:55:54.131251 Signaling ok, root=./www, home page is http://localhost:1989

2、编译并启动httpx-static代理服务器

cd ~/git/srs/trunk/3rdparty/httpx-static && make &&
./objs/httpx-static -http 80 -https 443 -ssk server.key -ssc server.crt \
    -proxy http://127.0.0.1:1989/sig -proxy http://127.0.0.1:1985/rtc \
    -proxy http://127.0.0.1:8080/

httpx-static代理服务运行后打印日志如下,此服务http监听80端口,https监听443端口,信令代理到本地1989端口,rtc-api代理到本地1985端口,普通http代理到本地8080端口

[trace] 2021/10/13 02:01:51.974685 [5702][1000] Proxy /sig to http://127.0.0.1:1989/sig
[trace] 2021/10/13 02:01:51.977562 [5702][1000] Proxy /rtc to http://127.0.0.1:1985/rtc
[trace] 2021/10/13 02:01:51.977883 [5702][1000] Proxy / to http://127.0.0.1:8080/
[trace] 2021/10/13 02:01:51.979071 [5702][1000] http(:80), https(:443), self-sign(server.key, server.crt) html root at ./html
[trace] 2021/10/13 02:01:51.981048 [5702][1001] https serve at 443
[trace] 2021/10/13 02:01:51.981552 [5702][1002] http serve at 80
4)打开客户端浏览器

1、在192.168.9.100和192.168.9.101上,分别打开一个chrome浏览器,输入 https://192.168.9.200/demos/one2one.html?autostart=true 如下图:
在这里插入图片描述
注意:如图所示,界面中的SRS 、Room 、Display中的内容,一起组成了一个本地WebRTC的推流URL。在两个准备互相通话的浏览器中,两个浏览器Web页面的SRS和Room内容必须保持一致,而Display的内容必须保证不一样

例如:192.168.9.100机器上Display的内容是100,而192.168.9.101机器上Display的内容是101,则192.168.9.100机器的WebRTC推流地址就是webrtc://192.168.9.200/live/100,而192.168.9.101机器的WebRTC推流地址就是webrtc://192.168.9.200/live/101

最终,两个客户端在“开始通话”的时候,会分别和SRS服务器之间创建推流连接和拉流连接,其中每个客户端都使用自己的推流地址创建自己的推流连接,并用对方的推流地址创建自己的拉流连接。
在这里插入图片描述

这里还有个问题就是,一个客户端是如何知道另一个客户端的WebRTC推流地址的?呵呵,这当然是通过信令服务器实现的。


5、测试场景3:SFU多人通话视频会议

如果理解了前面SFU One 2 One的运行原理,应该不难理解使用SRS进行多人通话的环境搭建。具体可参考下面的技术文档:
SRS做多人会议,以及视频号连麦直播

总结

本文通过搭建SRS4.0 WebRTC服务的各种典型测试场景,希望达到两个目的:
1)初步了解WebRTC工作原理
2)为深入分析SRS4.0 WebRTC代码处理逻辑做准备

最后是一篇网上的文章,
http://www.ctiforum.com/news/guandian/549857.html,大概是翻译老外的,难度不深,但非常长,谈了WebRTC技术的来龙去脉,几乎把WebRTC所有技术概念都做了非常好的名词解释,提前理解一些技术概念方便后面理解软件代码。

9、SRS4.0源代码分析之WebRTC服务总体介绍

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值