现在开讲 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函数开始看起

上图可以看到,创建BasicTaskScheduler 和 BisicUsageEnvironment对象。
重点是 openURL 函数,然后 ctrl+] 跳转查看 openURL 的定义
首先通过 ourRTSPClient::createNew 函数最终会调用 ourRTSPClient 的构造函数,基类 RTSPClient 的指针指向派生类 ourRTSPClient 对象,并且最终会调用 RTSPClient 的构造函数;
sendDescribeCommand 函数往服务器端发送 Describe 请求;continueAfterDESCRIBE 为回调函数;在DoEventLoop 中的 SingleStep 中调用;
RTP over tcp 还是udp 由宏 #define REQUEST_STREAMING_OVER_TCP False 进行控制;

(2)然后跳转查看 sendDescribeCommand

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

(3)然后跳转查看 RequestRecord

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

(4)然后跳转查看 fHandler

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

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

函数有点长,自行查看吧。
然后其中有一部分:

(6)然后跳转查看 openConnection

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

(7)然后跳转查看 setBackgroundHandling

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

(8)然后跳转查看 assignHandler

(9)然后跳转查看 lookupHandler

回顾(6)~(9)
openConnection 函数用来连接到服务器;在该函数中首先调用 parseRTSPURL 解析客户端的 RtspURL;然后建立socket(),然后 connectToServer 连接到服务器;;incomingDataHandler 为回调函数;incomingDataHandler 函数,最终赋值给了 handler->handlerProc = handlerProc;
那么我们接下来就看看这几个函数。

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

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

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

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

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

主要起作用的是这句话:
envir().taskScheduler().setBackgroundHandling(socketNum,SOCKET_WRITABLE|SOCKET_EXCEPTION,(TaskScheduler::BackgroundHandlerProc*)&connectionHandler,
然后 setBackgroundHandling 我们在 (7)里看过了。现在看一下 connectionHandler

(12)然后跳转查看 connectionHandler

(13)然后跳转查看 connectionHandler1

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

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

(15)然后跳转查看 SingleStep

函数有点长,自行查看吧
connectionHandler 在 SingleStep 函数中会调用,调用如下:
(*handler->handlerProc)(handler->clientData,resultConditionSet);

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

LIVE555再学习 -- testRTSPClient 源码分析相关推荐

  1. LIVE555再学习 -- testOnDemandRTSPServer 源码分析

    一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...

  2. LIVE555再学习 -- testH264VideoStreamer 源码分析

    上一篇文章我们已经讲了一部分: testH264VideoStreamer 重复从 H.264 基本流视频文件(名为"test.264")中读取,并使用 RTP 多播进行流式传输. ...

  3. LIVE555再学习 -- OpenRTSP 源码分析

    看了很多东西,感觉有点杂.源码分析部分也看了,讲的也就那样.现在有点不知道从哪讲起了. 参看:nkmnkm的专栏-流媒体 参看:smilestone322的专栏-live555 一.源码组成 包括上述 ...

  4. LIVE555再学习 -- testRTSPClient 实例

    上一篇文章简单看了一遍 testRTSPClient  的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...

  5. MyBatis学习笔记-源码分析篇

    引言 SQL 语句的执行涉及多个组件,其中比较重要的是 Executor. StatementHandler. ParameterHandler 和 ResultSetHandler. Executo ...

  6. Java学习集合源码分析

    集合源码分析 1.集合存在的原因 可以用数组来表示集合,那为什么还需要集合? 1)数组的缺陷 ​ 在创建数组时,必须指定长度,一旦指定便不能改变 数组保存必须是同一个类型的数据 数组的增加和删除不方便 ...

  7. Android学习——LitePal源码分析

    原创技术博客,请认准Azzssss的原文http://www.cnblogs.com/Azzssss/p/4147704.html. 这两天项目终于上线了,松了一口气,虽然还是很不稳定,见一步走一步吧 ...

  8. 【TencentOS tiny学习】源码分析(2)——调度器

    文章目录 调度器的基本概念 启动调度器 Cortex-M内核关中断指令 回归正题 看看任务栈的初始化 查找最高优先级任务 任务切换的实现 SysTick SysTick初始化 SysTick中断 温馨 ...

  9. 【TencentOS tiny学习】源码分析(3)——队列

    文章目录 队列基本概念 队列的阻塞机制 队列实现的数据结构 队列控制块 消息控制块 任务控制块中的消息成员变量 与消息相关的宏定义 消息池 队列创建 销毁队列 清空队列 等待队列(消息) (消息)写入 ...

最新文章

  1. 清华男女图鉴 | 有电车会拍照,我在清华还是找不到女朋友
  2. muduo之EventLoopThreadPool
  3. Linux之数组和关联数组
  4. leetcode1338. 数组大小减半(贪心算法)
  5. java 对list增删_List 中正确的增删操作
  6. MYSQL数据库查询删除创建企业基本知识
  7. 软件测试抛出异常,异常测试之异常注入初探
  8. 表格中建一个按钮_CAD | CAD和Excel的表格互换教程
  9. 经典测试用例--水杯测试
  10. hibernate的Configuration对象的configure()方法的作用
  11. 为什么国内的游戏公司吃相越来越难看了?
  12. Presto 即席查询
  13. 电容篇-电容器件工作原理及参数分析理解
  14. Linux 学习包括但不限于linux使用问题笔记
  15. 10个知识学习app,开始武装自己的大脑吧!
  16. 软件人才从这里飞翔——访北京大学软件学院院长陈钟博士
  17. idea启动项目报错 --To prevent a memory leak, the JDBC Driver has been forcibly unregistered
  18. 网络层协议介绍与概述
  19. 关于HTTP提交方式之PUT
  20. java +Selenium 2 环境搭建

热门文章

  1. python - os模块
  2. CS224n笔记二:word2vec
  3. angular学习笔记(十九)-自定义指令修改dom
  4. 网络暴力信号:你家的青少年是受害者或加害者吗?
  5. weblogic配置domain和删除domain
  6. 1.在Linux下如何使用软盘、光盘以及DOS等非Linux分区
  7. 软件如何控制硬件、编译器和操作系统是否需要编译
  8. 详解进程的虚拟内存,物理内存,共享内存
  9. 回溯法模板(矩阵中操作)
  10. alexnet 论文翻译