音视频开发为什么要学SRS流媒体服务器

1 SRS是什么

官方定义:SRS是一个流媒体集群,支持RTMP/HLS/HTTP-FLV/RTSP/DASH/WebRTC/SRT/GB28181,高效、稳定、易用,简单而快乐。有将近10k star(包括https://github.com/ossrs/srs链接)
网址:https://github.com/winlinvip/srs (目前作者主要维护的链接)

SRS基本资料:
Wiki地址,里面有上百篇详细文档,第一入手资料:https://github.com/ossrs/srs/wiki
Git分支,可以看源码:https://github.com/winlinvip/srs
官网,有安装包,客户端供大家测试体验:http://www.ossrs.net/srs.release/releases/

2 SRS能够解决什么问题

2.1 工程案例
SRS支持的特性非常多,传统的RTMP直播应用不用多说,我们这里说一些新的趋势。
案例1:传统的视频监控客户端都是Windows pc桌面客户端,现在较多的公司都需要实现通过web去查看远程的视频监控,此时可以通过RTSP/GB28181推流推送到SRS流媒体服务器,然后通过RTMP或者HTTP-FLV协议进行拉流查看远程的摄像头。
案例2:传统的推流端都需要安装安装应用软件才能实现推流,但是目前也是有web化的趋势,需要通过浏览器网页将音视频画面推送给听众,此时就可以通过WebRTC推流到SRS流媒体服务器,然后观众通过RTMP、HTTP-FLV等方式观看直播。
2.2 技术储备
作为一个流媒体人,需要精通RTMP/HLS/HTTP-FLV/RTSP/DASH/WebRTC等协议,怎么精通呢?
• 光看协议手册是没有用的
• 光百度找文章也是没有用的
建议大家深入分析SRS源码:
• SRS的源码逻辑非常清晰
• 官网github也提供了详细的wiki文档资料和大量的issue
• 大量的issue都是工程化中遇到的问题,以及如何解决,对于我们面试和工作开发都非常有帮助
• 支持forward模式小规模集群和edge模式大规模集群
大家需要特别注意的一个点是,在学习SRS源码的时候,百度找SRS文章绝对只是辅助,并不能实际解决我们怎么学习SRS,我是建议大家:(1)阅读srs官方的wiki;(2)使用gdb等调试工具跟踪代码。
具体的学习方法可以参考 4节 SRS如何学习。

3 SRS是否有商业应用

有些朋友担心SRS能否在商业项目中应用,有没有商业用,去招聘网站搜一搜,看看大公司在招聘的时候是否需要掌握该服务器就知道了,比如在boss直聘输入SRS,我这里只列了3家公司的招聘需求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从招聘结果可以看出来,当我们如果应聘的是流媒体相关岗位时,掌握SRS流媒体是一个必须项或者加分项目。这也说明SRS流媒体服务器在实际开发中的需求。

4 SRS如何学习

学习SRS流媒体服务器,建议少百度,多看官方wiki和自己动手实践:

  1. 看wiki
  2. 通过gdb跟踪代码
  3. 结合gdb分析srs框架
  4. 结合流媒体协议分析RTMP/HLS/HTTP-FLV/RTSP/WebRTC等的具体实现
    以官方的RTMP部署为例:https://github.com/ossrs/srs/wiki/v1_CN_SampleRTMP

conf/rtmp.conf

listen 1935;
max_connections 1000;
vhost defaultVhost {
}
这里涉及到了端口1935,我们从这里也可以推断出,该配置文件配置了端口1935,那RTMP是要监听该端口。
要监听该端口则一定会去读取listen这个字段。比如我们在source insight 搜索"listen"
在这里插入图片描述

从这里我们可以看到SrsConfig这个类,有去读取"listen"字段,实际上如果我们点开SrsConfig,我们可以很容易的发现所有的配置文件都是由该类去读取。
我们再进一步,只关注 get(“listen”)这样的字段,查找到
vector SrsConfig::get_listens()
{
std::vector ports;

SrsConfDirective* conf = root->get("listen"); // 从配置文件也可以出来,listen字段是在root
if (!conf) {
    return ports;
}

for (int i = 0; i < (int)conf->args.size(); i++) {
    ports.push_back(conf->args.at(i));
}

return ports;

}
我们在就可以通过gdb在SrsConfig::get_listens打断点

  1. 使用gdb启动:gdb ./objs/srs

  2. 设置参数:set args -c ./conf/rtmp.conf

  3. 打断点:建议先在main函数打断点,然后run到main函数等so加载后再在SrsConfig::get_listens打断点,否则出现下面红色框的问题在这里插入图片描述

  4. 在main打断点后,run起来停在main函数在这里插入图片描述

  5. 然后停在了main函数,此时可以断点在这里插入图片描述

  6. 还是报出来红色框的问题,那我们可以按代码位置下断点,在srs_app_config.cpp:3983下断点在这里插入图片描述

然后输入r重启程序,按c直到进入rs_app_config.cpp:3983断点,再按bt可以看到我们读取配置文件,监听rtmp port的调用栈。在这里插入图片描述

但此时如果我们去看调用栈,发现它只是检测配置文件是否正确,我们可以再继续输入c,然后输入bt看调用栈,直到我们看到在调用看到一些listen的字眼。
此时可以根据调用栈分析srs监听端口的框架流程在这里插入图片描述

可以定位到src/app/srs_app_server.cpp:1246去查看在这里插入图片描述

此时可以找到rtmp的监听流程。
以上只是小试牛刀,对于srs框架分析我这里还录制了一些视频,大家可以加君羊832218493获取。

猜你喜欢

转载自blog.csdn.net/lingshengxueyuan/article/details/108107198