看了很多东西,感觉有点杂。源码分析部分也看了,讲的也就那样。现在有点不知道从哪讲起了。

参看:nkmnkm的专栏-流媒体

参看:smilestone322的专栏-live555

一、源码组成

包括上述四个库和mediaServer服务器程序,以及其他的测试代码。
这几个文件在官网是有介绍的:
参看:live555 Description
这个我应该有讲了三遍了,这里推荐一个官网上介绍的数据结构图和文件列表结构图。
参看:live555_Data Structures
参看:live555_File List
然后,这些四个库的源码貌似在做移植的时候并没有什么改动的吧,链接这四个库不就可以了吗。
可能也是我不了解啊,所以我现在重点看 mediaServer 服务器程序和testProgs 测试代码的源码分析。

二、OpenRTSP 分析

参看:openRTSP
翻译一下:
“openRTSP”是一个命令行程序,可以用来打开,流,接收和记录(可选)指定的媒体流RTSP——即URL。,一个URL,始于rtsp:/ /
运行这个程序的最简单的方式是:  openRTSP < url >

(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”

“playCommon.cpp”。有关如何从源代码构建该程序的说明,请参阅“LIVE555 Streaming Media”文档。
注意:如果您正在寻找如何使用“LIVE555 Streaming Media”代码构建自己的RTSP / RTP媒体播放器客户端的示例,那么“openRTSP”源代码不是最好的例子,因为它包含很多额外的选项,大多数你可能不需要。 (此外,
“openRTSP”代码被设计为一个独立的应用程序,而不是嵌入在其他应用程序中。)而应该使用
“testRTSPClient”应用程序代码(也在“testProgs”目录中)作为模型

《1》分析 playCommon.cpp 的 main 函数

参看:live555 分析- openRtsp
参看:庖丁解牛-----Live555源码彻底解密(根据OpenRTSP讲解)
参看:live555/testProgs/playCommon.cpp
main函数流程
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》实例

参看:RTSP客户端接收存储数据(live555库中的openRTSP实例)
上面我们已经把openRTSP的的源码分析了一下,现在简单来做个测试。
先打开 live555 服务器,然后再执行
./openRTSP  -d  20   -f  20  -w 640  -h  480   -b  400000  "rtsp://192.168.2.xx/test.264"
参数解释:
-d  20   --->程序运行时间,如果没有程序持续从服务器获取视频;
-f   20   ----> 帧率
-w  640  -h  480 -----> 帧分辨率
-b  400000  ---->码率

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

  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再学习 -- testRTSPClient 源码分析

    现在开讲 testRTSPClient.在官网这这样一段介绍,参看:RTSP client 翻译下来就是: testRTSPClient 是一个命令行程序,显示如何打开和接收由 RTSP URL 指定 ...

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

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

  5. Java学习集合源码分析

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

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

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

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

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

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

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

  9. 【TencentOS tiny学习】源码分析(5)——信号量

    文章目录 信号量 信号量的数据结构 信号量控制块 与信号量相关的宏定义 信号量实现 创建信号量 销毁信号量 获取信号量 释放信号量 总结 关注我吧! 信号量 信号量(sem)在操作系统中是一种实现系统 ...

最新文章

  1. PMP_PMP考试须知
  2. [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)
  3. java幂等性的控制(技术论坛上整理成文)
  4. antisamy java_antisamy的使用方法
  5. c 怎么连接mysql博客_C连接MySql数据库
  6. PHP GD库解析一张简单图片并输出
  7. python自动寻路模板_Python实现的简单模板引擎功能示例
  8. python3.6 try except,python中try except处理程序异常的三种常用方法
  9. C处理Python返回的字串代码
  10. 手把手教你如何删除病毒木马(转)
  11. CAD梦想画图中“插入图片”
  12. 解决合并压缩包分卷无法解压 错误信息:文件格式未知或者压缩文件数据已经损坏
  13. Hibernate_9_Person和IdCard实例_一对一关系:基于主键
  14. 南京大学软件学院 西交计算机,2021届薪酬最高的十大本科专业,前三名都是计算机和相关专业...
  15. 【持续更新】资源站点汇总
  16. 【工作需要】CAD+VBA 实现图块的旋转平移缩放和拼接
  17. 论文写作-引言怎么写
  18. 生如蝼蚁当立鸿鹄之志,命薄似纸应有不屈之心,乾坤未定,你我都是黑马!(祝大家飞黄腾达前程似锦)
  19. 值传递,还是引用传递(实践是检验真理的唯一标准)
  20. 一起感受迪士尼乐园的奇幻魔力 高德地图迪士尼圆梦之旅圆满成功

热门文章

  1. Codeforces 1093C (思维+贪心)
  2. OpenCV---图像金字塔原理
  3. php中的foreach如何使用?
  4. 【bzoj2223】[Coci 2009]PATULJCI 主席树
  5. linux系统进程的内存布局
  6. Oracle语句总结
  7. noclobber属性
  8. 从深度学习选择什么样的gpu来谈谈gpu的硬件架构
  9. 断言(assert)详解
  10. C语言实现前部插入创建链表以及尾部插入链表