LIVE555再学习 -- OpenRTSP 源码分析
看了很多东西,感觉有点杂。源码分析部分也看了,讲的也就那样。现在有点不知道从哪讲起了。
参看:nkmnkm的专栏-流媒体
参看:smilestone322的专栏-live555
一、源码组成
二、OpenRTSP 分析
(1)选项
- Basic operation
- Playing without receiving
- Playing-time options
- Streaming access-controlled sessions
- Outputting a ".mov", ".mp4", or ".avi"-format file
- Periodic file output
- 'Trick play' options
- Other options
- A note about RealAudio and RealVideo sessions
- Source code
- Support and customization
- Summary of command-line options
它有上面这几种形式,这里就不讲了。直接看命令行选项。
-4 输出'.mp4'格式的文件(到'stdout',除非也给出了“-P <interval-in-seconds>”选项)
-a 只播放音频流(到“stdout”,除非还给出了“-P <interval-in-seconds>”选项)
-A <codec-number> 指定要从服务器请求的音频编解码器的静态RTP有效载荷格式编号(仅限“playSIP”)
-b <buffer-size> 更改输出文件缓冲区大小
-B <buffer-size> 更改输入网络套接字缓冲区大小
-c 连续播放
-C 即使服务器的“DESCRIBE”响应没有指定多播地址,也明确要求组播流。 (请注意,并不是所有的服务器都支持这一点。)(仅限“openRTSP”)
-d <duration> 指定显式持续时间
-D <maximum-inter-packet-gap> 指定退出之前等待的最长不活动周期
-E <absolute-seek-end-time> 请求服务器以指定的绝对时间结束流式传输(格式为“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。<frac> Z”)(仅用于-U <initial-absolute-seek - 时间>
-f <frame-rate> 指定视频帧速率(仅与“-q”,“-4”或“-i”一起使用)
-F <fileName-prefix> 为每个输出文件名指定一个前缀
-g <user-agent-name> 指定要在传出请求中使用的用户代理名称
-h <height> 指定视频图像高度(仅与“-q”,“-4”或“-i”一起使用)
-H 为每个音频/视频轨道输出一个QuickTime“提示轨迹”(仅与“-q”或“-4”一起使用)
-i 输出'.avi'格式的文件(“stdout”),除非也给出了“-P <interval-in-seconds>”选项)
-I <interface-name-or-address> 指定要在其上接收数据的特定网络接口
-k <username> <password> 指定用于验证传入“REGISTER”命令所需的用户名和密码(仅与“-R”一起使用)
-K 定期发送RTSP“OPTIONS”命令,以保持连接的有效性。 (这对于不听我们的定期RTCP“RR”数据包的错误的服务器是有用的。)
-l 尝试补偿数据包丢失(仅与“-q”,“-4”或“-i”一起使用)
-m 将每个传入帧输出到一个单独的文件中
-M <MIME-subtype> 指定音频编解码器从服务器请求的动态RTP有效载荷格式的MIME子类型(仅限“playSIP”)
-n RTP 数据包开始到达时不会通知
-o 请求服务器的命令选项,而不发送“DESCRIBE”(仅限“openRTSP”)
-O 不要求服务器的命令选项;只需发送“DESCRIBE”(“openRTSP”)
-p <starting-port-number> 指定客户端口号
-P <interval-in-seconds> 写入新的输出文件,每隔<interval-in-seconds>秒
-q 输出一个QuickTime'.mov'格式的文件(“stdout”,除非也给出了“-P <间隔时间>”选项)
-Q 输出关于数据流的“QOS”统计信息(程序退出时)
-r 播放RTP流,但不要接收它们
-R(或-R <port-number>) 等待输入的“REGISTER”命令,指定要播放的“rtsp://”URL。使用此选项而不是命令行上的“rtsp://”URL。 (仅限“openRTSP”)
-s <initial-seek-time> 请求服务器在流媒体之前寻找到指定的时间(以秒为单位)
-S <byte-offset> 假定一个简单的RTP有效载荷格式(跳过指定大小的特殊标题)
-t 通过TCP流RTP / RTCP数据,而不是通常的UDP。 (仅限“openRTSP”)
-T <http-port-number> 喜欢“-t”,除了使用RTSP over HTTP隧道。 (仅限“openRTSP”)
-u <username> <password> 指定摘要验证的用户名和密码
-U <initial-absolute-seek-time> 请求服务器在流前寻求指定的绝对时间(格式为“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。<frac> Z”)
-v 只播放视频流(到“stdout”),除非也给出了“-P <间隔时间>”选项)
-V 打印较少详细的诊断输出
-w <width> 指定视频图像宽度(仅与“-q”,“-4”或“-i”一起使用)
-y 尝试同步音频和视频轨道(仅与“-q”或“-4”一起使用)
-z <scale> 请求服务器缩放流(快进,慢或反向播放)
(2)源码
该程序使用“LiveMedia”库中的“RTSPClient”,“MediaSession”,“FileSink”,“QuickTimeFileSink”和几个“* RTPSource”模块,作为“LIVE555 Streaming Media”源代码包的一部分。
程序本身的源代码也与该软件包捆绑在一起,作为“testProgs”目录中的文件“openRTSP.cpp”和
《1》分析 playCommon.cpp 的 main 函数
参看:庖丁解牛-----Live555源码彻底解密(根据OpenRTSP讲解)
void main(int argc,char *argv[])
{
1. 创建BasicTaskScheduler对象
2. 创建BisicUsageEnvironment对象
3. 分析argv参数,(最简单的用法是:openRTSP rtsp://172.16.24.240/mpeg4video.mp4)以便在下面设置一些相关参数
4. 创建RTSPClient对象
5. 由RTSPClient对象向服务器发送OPTION消息并接受回应
6. 产生SDPDescription字符串(由RTSPClient对象向服务器发送DESCRIBE消息并接受回应,根据回应的信息产生 SDPDescription字符串,其中包括视音频数据的协议和解码器类型)
7. 创建MediaSession对象(根据SDPDescription在MediaSession中创建和初始化MediaSubSession子会话对 象)
8. while循环中配置所有子会话对象(为每个子会话创建RTPSource和RTCPInstance对象,并创建两个GroupSock对象,分别对应 RTPSource和RTCPInstance对象,把在每个GroupSock对象中创建的socket描述符置入 BasicTaskScheduler::fReadSet中,RTPSource对象的创建的依据是SDPDescription,例如对于MPEG4 文件来说,视音频RTPSource分别对应MPEG4ESVideoRTPSource和MPEG4GenericRTPSource对象。 RTCPInstance对象在构造函数中完成将Socket描述符、处理接收RTCP数据的函数 (RTCPInstance::incomingReportHandler)以及RTCPInstance本身三者绑定在一个 HandlerDescriptor对象中,并置入BasicTaskScheduler::fReadHandler中。完成绑定后会向服务器发送一条 消息。)
9. 由RTSPClient对象向服务器发送SETUP消息并接受回应。
10. while循环中为每个子会话创建接收器(FileSink对象),在FileSink对象中根据子会话的codec等属性缺省产生记录视音频数据的文件 名,视音频文件名分别为:video-MP4V-ES-1和audio-MPEG4-GENERIC-2,无后缀名
11. while循环中为每个子会话的视音频数据装配相应的接收函数,将每个子会话中的RTPSource中的GroupSock对象中的SOCKET描述符, 置入BasicTaskScheduler::fReadSet中,并将描述符、处理接收RTP数据的函数 (MultiFramedRTPSource::networkReadHandler)以及RTPSource本身三者绑定在一个 HandlerDescriptor对象中,并置入BasicTaskScheduler::fReadHandler中,并将FileSink的缓冲区 和包含写入文件操作的一个函数指针配置给RTPSource对象,这个缓冲区将会在networkReadHandler中接收来自网络的视音频数据(分 析和去掉RTP包头的工作由RTPSource完成),而这个函数指针在networkReadHandler中被调用以完成将缓冲区中的数据写入文件。
12. 由RTSPClient对象向服务器发送PLAY消息并接受回应。
13. 进入while循环,调用BasicTaskScheduler::SingleStep()函数接受数据,直到服务器发送TREADOWN消息给客户 端,客户端接收到该消息后释放资源,程序退出。
}
《2》实例
-d 20 --->程序运行时间,如果没有程序持续从服务器获取视频;
-f 20 ----> 帧率
-w 640 -h 480 -----> 帧分辨率
-b 400000 ---->码率
LIVE555再学习 -- OpenRTSP 源码分析相关推荐
- LIVE555再学习 -- testOnDemandRTSPServer 源码分析
一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...
- LIVE555再学习 -- testH264VideoStreamer 源码分析
上一篇文章我们已经讲了一部分: testH264VideoStreamer 重复从 H.264 基本流视频文件(名为"test.264")中读取,并使用 RTP 多播进行流式传输. ...
- LIVE555再学习 -- testRTSPClient 源码分析
现在开讲 testRTSPClient.在官网这这样一段介绍,参看:RTSP client 翻译下来就是: testRTSPClient 是一个命令行程序,显示如何打开和接收由 RTSP URL 指定 ...
- MyBatis学习笔记-源码分析篇
引言 SQL 语句的执行涉及多个组件,其中比较重要的是 Executor. StatementHandler. ParameterHandler 和 ResultSetHandler. Executo ...
- Java学习集合源码分析
集合源码分析 1.集合存在的原因 可以用数组来表示集合,那为什么还需要集合? 1)数组的缺陷 在创建数组时,必须指定长度,一旦指定便不能改变 数组保存必须是同一个类型的数据 数组的增加和删除不方便 ...
- Android学习——LitePal源码分析
原创技术博客,请认准Azzssss的原文http://www.cnblogs.com/Azzssss/p/4147704.html. 这两天项目终于上线了,松了一口气,虽然还是很不稳定,见一步走一步吧 ...
- 【TencentOS tiny学习】源码分析(2)——调度器
文章目录 调度器的基本概念 启动调度器 Cortex-M内核关中断指令 回归正题 看看任务栈的初始化 查找最高优先级任务 任务切换的实现 SysTick SysTick初始化 SysTick中断 温馨 ...
- 【TencentOS tiny学习】源码分析(3)——队列
文章目录 队列基本概念 队列的阻塞机制 队列实现的数据结构 队列控制块 消息控制块 任务控制块中的消息成员变量 与消息相关的宏定义 消息池 队列创建 销毁队列 清空队列 等待队列(消息) (消息)写入 ...
- 【TencentOS tiny学习】源码分析(5)——信号量
文章目录 信号量 信号量的数据结构 信号量控制块 与信号量相关的宏定义 信号量实现 创建信号量 销毁信号量 获取信号量 释放信号量 总结 关注我吧! 信号量 信号量(sem)在操作系统中是一种实现系统 ...
最新文章
- PMP_PMP考试须知
- [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
- java幂等性的控制(技术论坛上整理成文)
- antisamy java_antisamy的使用方法
- c 怎么连接mysql博客_C连接MySql数据库
- PHP GD库解析一张简单图片并输出
- python自动寻路模板_Python实现的简单模板引擎功能示例
- python3.6 try except,python中try except处理程序异常的三种常用方法
- C处理Python返回的字串代码
- 手把手教你如何删除病毒木马(转)
- CAD梦想画图中“插入图片”
- 解决合并压缩包分卷无法解压 错误信息:文件格式未知或者压缩文件数据已经损坏
- Hibernate_9_Person和IdCard实例_一对一关系:基于主键
- 南京大学软件学院 西交计算机,2021届薪酬最高的十大本科专业,前三名都是计算机和相关专业...
- 【持续更新】资源站点汇总
- 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
- 论文写作-引言怎么写
- 生如蝼蚁当立鸿鹄之志,命薄似纸应有不屈之心,乾坤未定,你我都是黑马!(祝大家飞黄腾达前程似锦)
- 值传递,还是引用传递(实践是检验真理的唯一标准)
- 一起感受迪士尼乐园的奇幻魔力 高德地图迪士尼圆梦之旅圆满成功