前面的文章已经讲过了,rtmp推流的时候就会产生数据源,对应源码就是source 。那http-flv client也是要从source里面拉取数据,也是要绑定一个consumer,这个思想在前面的文章中都要反复讲过 。
5.源码调试分析
先运行SRS流媒体服务器,执行命令:
gdb ./objs/srs
如下界面:

文章插图

文章插图
再执行命令:
set args -c ./conf/srs.conf
r
如下界面:

文章插图

文章插图
在win环境,开启ffmpeg推流,推流命令在上面已经给出 。
界面如下:

文章插图
推流成功后,在win环境,用ffplay去播放 。播放命令,上面已经给出了 。
界面如下:

文章插图
可以看到拉流端,关于http-flv具体的一些打印信息,如下界面:

文章插图
使用WireShark抓http-flv包,需要设置过滤条件,http or tcp.port==8081
界面如下:

文章插图
拉流客户端请求SRS流媒体服务器路径是/live/livestream.flv HTTP/1.1,请求方法是GET方法 。
如下界面:

文章插图
该请求数据包具体如下类型,如下界面:

文章插图
通过WireShark抓包,也可以看到SRS流媒体服务器回应客户端消息,其中是不带有content-length 。其服务端回应客户端的数据包的过程,如下界面:

文章插图
6.http-flv在ffmpeg源码中是怎样实现呢?
这个时候客户端开启推流,经过调试分析,整个流程如下图:

文章插图
下面的源码反应了http监听的过程(Rtmp与http类似),也就是按照这个流程来分析:
run_master()-->SrsServer::listen()--->
SrsServer::listen_http_stream() 。
(1) main函数,
src/main/srs_main_server.cpp:192行 。
(2)do_main函数,
src/main/srs_main_server.cpp:184行 。
(3)run函数,
src/main/srs_main_server.cpp:409行 。
(4)run_master函数,
src/main/srs_main_server.cpp:469行 。
(5)SrsServer::listen函数,
srs/app/srs_app_server.cpp:880行 。
(6)
SrsServer::listen_http_stream,srs/app/srs_app_server.cpp:1295行 。
在ffmpeg源码中搜索http_code,可以搜索到,在http.c里,有实现 。源码在如下路径 。

文章插图
在SRS流媒体服务端,从各类协议总入口SrsServer::listen()开始分析 。对应源码如下:
HTTP/1.1 200 OK Connection: Keep-Alive Content-Type: video/x-flv Server: SRS/3.0.141(OuXuli) Transfer-Encoding: chunked 如果是http协议,就会调用listen_http_stream(),到http的listen分析,对应源码如下:

文章插图
srs_error_t SrsServer::listen_http_stream(){srs_error_t err = srs_success;close_listeners(SrsListenerHttpStream);if (_srs_config->get_http_stream_enabled()) {SrsListener* listener = new SrsBufferListener(this, SrsListenerHttpStream);listeners.push_back(listener);std::string ep = _srs_config->get_http_stream_listen();std::string ip;int port;srs_parse_endpoint(ep, ip, port);if ((err = listener->listen(ip, port)) != srs_success) {return srs_error_wrap(err, "http stream listen %s:%d", ip.c_str(), port);}}return err;} 7.拉流时HTTP连接调试
打个断点,输入如下命令,调试:
b SrsServer::listen_http_stream()
界面如下:

文章插图
输入命令:
n
可以一行行执行 。
这个时候,如果客户端开启拉流,可以看到SRS流媒体服务器的调用栈,界面如下:
推荐阅读
- 建立数据中转服务器的详细方法
- 阿里云、腾讯云、等云服务器有什么区别
- 网站服务器遇到CC攻击时可能发生的两大误区
- frp远程办公,访问内网服务器
- 互联网云服务器JVM监控——JDK自带工具
- 4 个打造多媒体和共享服务器的开源工具
- Linux服务器集群系统——LVS集群中的IP负载均衡技术
- CentOS系统下PXE服务器的搭建与部署
- 5分钟搭建公网https网页文件服务器,免费权威TLS证书
- 一个比 Nginx 功能更强大的 Web 服务器
