首页 > 编程语言 >LIVE555再学习 -- testRTSPClient 源码分析

LIVE555再学习 -- testRTSPClient 源码分析

时间:2023-04-03 20:05:57浏览次数:155  
标签:LIVE555 调用 函数 查看 -- 然后 源码 跳转 testRTSPClient


现在开讲 testRTSPClient。在官网这这样一段介绍,参看:RTSP client

翻译下来就是:

testRTSPClient 是一个命令行程序,显示如何打开和接收由 RTSP URL 指定的媒体流,即以rtsp://开头的URL
在这个演示应用中,接收到的音频/视频数据什么也没有。 但是,您可以在自己的应用程序中使用和调整此代码(例如)解码和播放接收到的数据。
openRTSP 类似于“testRTSPClient”,但具有更多的功能。 这是一个命令行程序,它与“testRTSPClient”不同,旨在用作一个完整的全功能应用程序(而不是在其他应用程序中使用其代码)。 也正应为如此,openRTSP”源代码并不是最好的例子,因为它包含很多额外的选项,大多数你可能不需要。
所以,如果您正在寻找如何使用“LIVE555 Streaming Media”代码构建自己的RTSP / RTP媒体播放器客户端

应该使用“testRTSPClient”应用程序代码(也在“testProgs”目录中)作为模型。


一、源码解析

参看:庖丁解牛-----Live555源码彻底解密(根据testRTSPClient讲解)

参看:庖丁解牛-----Live555源码彻底解密(testRTSPClient流程图)

参看:live555/testProgs/testRTSPClient.cpp


推荐使用 ctags 来查看源码进行分析 

参看:日常生活小技巧 -- vim 中 ctags 的安装和使用

下面所说的跳转查看就是 ctrl+},然后看完后返回跳转前位置 ctrl+t


(1)首先从 testRTSPClient.cpp 的 main函数开始看起

LIVE555再学习 -- testRTSPClient 源码分析_构造函数

上图可以看到,创建BasicTaskScheduler 和 BisicUsageEnvironment对象。

重点是 openURL 函数,然后 ctrl+] 跳转查看 openURL 的定义

LIVE555再学习 -- testRTSPClient 源码分析_构造函数_02

首先通过 ourRTSPClient::createNew 函数最终会调用 ourRTSPClient 的构造函数,基类 RTSPClient 的指针指向派生类 ourRTSPClient 对象,并且最终会调用 RTSPClient 的构造函数;

sendDescribeCommand 函数往服务器端发送 Describe 请求;continueAfterDESCRIBE 为回调函数;在DoEventLoop 中的 SingleStep 中调用;

RTP over tcp 还是udp 由宏 #define REQUEST_STREAMING_OVER_TCP False 进行控制;

LIVE555再学习 -- testRTSPClient 源码分析_构造函数_03


(2)然后跳转查看 sendDescribeCommand 



LIVE555再学习 -- testRTSPClient 源码分析_构造函数_04


将continueAfterDESCRIBE 函数传递到 responseHandler,相当于 continueAfterDESCRIBE 为一个回调函数;注意 RequestRecord 这个类的作用;在 SendRequest 中调用 RequestRecord 的构造函数.

(3)然后跳转查看 RequestRecord 

LIVE555再学习 -- testRTSPClient 源码分析_回调函数_05

可看到将回调函数保存在 RequestRecord 类的 fHandler 上;

(4)然后跳转查看 fHandler 


LIVE555再学习 -- testRTSPClient 源码分析_应用程序_06


根据上图可看到 RequestRecord 类定义。所以说 在 SendRequest 中调用 RequestRecord 的构造函数.

(5)然后返回到(2),跳转查看 sendRequest


函数有点长,自行查看吧。


然后其中有一部分:



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_07



(6)然后跳转查看 openConnection 



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_08



parseRTSPURL
setupStreamSocket
connectToServer
setBackgroundHandling
incomingDataHandler


这几个函数下面需要一一看一下,根据名字也可能看出它们是什么作用的。


(7)然后跳转查看 setBackgroundHandling



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_09



上图为 setBackgroundHandling 函数定义,其中 HandlerSet* fHandlers 连上服务器后,调用incomingDataHandler 回调函数;


(8)然后跳转查看 assignHandler



LIVE555再学习 -- testRTSPClient 源码分析_应用程序_10



(9)然后跳转查看 lookupHandler



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_11




回顾(6)~(9)


openConnection 函数用来连接到服务器;在该函数中首先调用 parseRTSPURL 解析客户端的 RtspURL;然后建立socket(),然后 connectToServer 连接到服务器;; incomingDataHandler 为回调函数; incomingDataHandler 函数,最终赋值给了 handler->handlerProc = handlerProc;


那么我们接下来就看看这几个函数。


(10)然后返回到(6),跳转查看 parseRTSPURL


函数有点长,自行查看吧。


(11)然后返回到(6),跳转查看 setupStreamSocket



LIVE555再学习 -- testRTSPClient 源码分析_构造函数_12



建立 socket 的函数为 setupStreamSocket,该函数建立的是一个 tcp 的 socket;
setupStreamSocket 函数首先创建 socket,然后设置 SO_REUSEADDR socket 属性;并且调用 bind 函数绑定socket;最后将 socket 设置成非阻塞形式;


(12)然后返回到(6),跳转查看 connectToServer 



LIVE555再学习 -- testRTSPClient 源码分析_构造函数_13



主要起作用的是这句话:
envir().taskScheduler().setBackgroundHandling(socketNum,SOCKET_WRITABLE|SOCKET_EXCEPTION,(TaskScheduler::BackgroundHandlerProc*)&connectionHandler,


setBackgroundHandling 我们在 (7)里看过了。现在看一下 connectionHandler


(12)然后跳转查看 connectionHandler


LIVE555再学习 -- testRTSPClient 源码分析_构造函数_14


(13)然后跳转查看 connectionHandler1



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_15



(14)然后返回到(1),跳转查看 doEventLoop 



LIVE555再学习 -- testRTSPClient 源码分析_构造函数_16



这里如果想要该程序退出,在外面将 *watchVariable=1 就可以了


(15)然后跳转查看 SingleStep


函数有点长,自行查看吧



LIVE555再学习 -- testRTSPClient 源码分析_回调函数_17



connectionHandler 在 SingleStep 函数中会调用,调用如下:

(*handler->handlerProc)(handler->clientData,resultConditionSet);


到此,将数据接收部分的源码分析完了。




标签:LIVE555,调用,函数,查看,--,然后,源码,跳转,testRTSPClient
From: https://blog.51cto.com/u_15979522/6167165

相关文章

  • LIVE555再学习 -- Windows 下编译
    然后开始下载编译,其中包含,Windows、Linux和交叉编译三种形式。首先来讲Windows下编译参看:Live555研究之一源代码编译一、下载源码下载:Indexof/liveMedia/public参看:LIVE555StreamingMedia选择下载live555-latest.tar.gz二、文件介绍我的开发环境为win1064位+VS2017将上面......
  • RTSP再学习 -- RTSP协议分析(转载)
    最近一直在看RTSP,但是RTSP协议是个啥?还没有搞清楚。首先流媒体百度百科上有这样一段,从基本的名字上或多或少可以理解一下这些传输协议的区别。这很重要!!传输协议1、RSVP:资源预留协议2、RTP:实时传输协议3、RTCP:实时传输控制协议4、MMS:微软流媒体服务协议5、RTSP:实时流传输协议6、MIM......
  • mysql多实例配置
    实现在一台服务器上开两个数据库服务。配置:[mysqld_multi]user=rootmysqld=/usr/local/mysql/bin/mysqld_safemysqladmin=/usr/local/mysql/bin/mysqladmin[mysqld1]datadir=/dir1port=3307pid-file=/dir1/mysqld1.pidlog-error=/dir1/mysqld1.errsocket=/dir1/mysqld1.sock[mysqld......
  • MQTT再学习 -- 安装MQTT客户端及测试
    上一篇文章我们已经讲了MQTT服务器的搭建,参看:MQTT再学习--搭建MQTT服务器及测试接下来我们看一下MQTT客户端。一、客户端下载首先,客户端也有多种,我们需要面临选择了。参看:基于mqtt的消息推送(三)客户端实现现有客户端sdk分析,基本分为两大类:一类移植自C类库,如Mosquitto,一类是用o......
  • FFmpeg再学习 -- FFmpeg+SDL+MFC实现图形界面视频播放器
    继续看雷霄骅的课程资料-基于FFmpeg+SDL的视频播放器的制作最后一篇,主要是想学一下MFC创建和配置。一、创建MFC工程文件->新建->项目->VisualC++->MFC应用程序应用程序类型,选择基于对话框生成效果如下:二、设置控件找到“工具箱”,就可以将相应的控件拖拽至应用程序对话框......
  • 图像和流媒体 -- Sapera 安装遇到的问题
    一、下载安装包参看:GenieNanoM1930-NIR点击软件及例程下载二、安装遇到的问题(1)Installationdirectorymustbeonalocalharddrive解决方法:clsicacls%temp%/reset/T/Q/Cpause以上文件复制到txt中将后缀名修改为bat以管理员执行即可。windows自身权限的的问题。(2)安......
  • Problem B. Harvest of Apples 组合数求和(莫队没怎么看懂)
    ProblemB.HarvestofApplesTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:262144/262144K(Java/Others)TotalSubmission(s):3775    AcceptedSubmission(s):1450 ProblemDescriptionTherearenapplesonatree,numberedfrom1ton.Count......
  • MQTT再学习 -- 漫谈MQTT协议
    MQTT服务器搭建我们已经完成了,现在回过头来看协议。参看:MQTT官网参看:MQTT_V3.1_Protocol_Specific参看:MQTT协议中文版参看:MQTT协议中文版上面这几篇文章,已经说明了一切。下面着重讲一下MQTT的消息格式和主要特征。一、什么是MQTT首先你要知道什么是MQTT。额,这个很重要。官网是......
  • 日常生活小技巧 -- 惠普 Windows10 进入安全模式
    今天手贱,是真的很贱。将用户模式从管理员组改为标准用户方法是:WIN+R打开controluserpasswords2然后出现了用户账户控制,你要允许此应用对你的设备进行更改吗?最关键的是没有“是”选项。试了各种方法都不成功。比如网上说的进入命令提示符(管理员)或者更改用户账户控制设置,都会弹出......
  • IDEA Spring-boot 使用@Component注解的工具类,用@Autowired注入 @Service或者@Reposit
    IDEASpring-boot使用@Component注解的工具类,用@Autowired注入@Service或者@Repository会空指针(使用@PostContruct)原文链接:https://blog.csdn.net/ld_secret/article/details/104627597/使用idea编译器时,对于spring-boot的项目,大都使用注解,那么:一、现象:@Component标注的U......