LIVE555再学习 -- OpenRTSP 源码分析

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

参看:nkmnkm的专栏-流媒体

参看:smilestone322的专栏-live555

一、源码组成

LIVE555再学习 -- OpenRTSP 源码分析_第1张图片
包括上述四个库和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 ”选项)
-a  只播放音频流(到“stdout”,除非还给出了“-P ”选项)
-A   指定要从服务器请求的音频编解码器的静态RTP有效载荷格式编号(仅限“playSIP”)
-b   更改输出文件缓冲区大小
-B   更改输入网络套接字缓冲区大小
-c  连续播放
-C  即使服务器的“DESCRIBE”响应没有指定多播地址,也明确要求组播流。 (请注意,并不是所有的服务器都支持这一点。)(仅限“openRTSP”)
-d   指定显式持续时间
-D   指定退出之前等待的最长不活动周期
-E   请求服务器以指定的绝对时间结束流式传输(格式为“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。 Z”)(仅用于-U 
-f   指定视频帧速率(仅与“-q”,“-4”或“-i”一起使用)
-F   为每个输出文件名指定一个前缀
-g   指定要在传出请求中使用的用户代理名称
-h   指定视频图像高度(仅与“-q”,“-4”或“-i”一起使用)
-H  为每个音频/视频轨道输出一个QuickTime“提示轨迹”(仅与“-q”或“-4”一起使用)
-i  输出'.avi'格式的文件(“stdout”),除非也给出了“-P ”选项)
-I   指定要在其上接收数据的特定网络接口
-k    指定用于验证传入“REGISTER”命令所需的用户名和密码(仅与“-R”一起使用)
-K  定期发送RTSP“OPTIONS”命令,以保持连接的有效性。 (这对于不听我们的定期RTCP“RR”数据包的错误的服务器是有用的。)
-l  尝试补偿数据包丢失(仅与“-q”,“-4”或“-i”一起使用)
-m  将每个传入帧输出到一个单独的文件中
-M   指定音频编解码器从服务器请求的动态RTP有效载荷格式的MIME子类型(仅限“playSIP”)
-n  RTP  数据包开始到达时不会通知
-o  请求服务器的命令选项,而不发送“DESCRIBE”(仅限“openRTSP”)
-O  不要求服务器的命令选项;只需发送“DESCRIBE”(“openRTSP”)
-p   指定客户端口号
-P   写入新的输出文件,每隔秒
-q  输出一个QuickTime'.mov'格式的文件(“stdout”,除非也给出了“-P <间隔时间>”选项)
-Q  输出关于数据流的“QOS”统计信息(程序退出时)
-r  播放RTP流,但不要接收它们
-R(或-R )  等待输入的“REGISTER”命令,指定要播放的“rtsp://”URL。使用此选项而不是命令行上的“rtsp://”URL。 (仅限“openRTSP”)
-s   请求服务器在流媒体之前寻找到指定的时间(以秒为单位)
-S   假定一个简单的RTP有效载荷格式(跳过指定大小的特殊标题)
-t  通过TCP流RTP / RTCP数据,而不是通常的UDP。 (仅限“openRTSP”)
-T   喜欢“-t”,除了使用RTSP over HTTP隧道。 (仅限“openRTSP”)
-u    指定摘要验证的用户名和密码
-U   请求服务器在流前寻求指定的绝对时间(格式为“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。 Z”)
-v  只播放视频流(到“stdout”),除非也给出了“-P <间隔时间>”选项)
-V  打印较少详细的诊断输出
-w   指定视频图像宽度(仅与“-q”,“-4”或“-i”一起使用)
-y  尝试同步音频和视频轨道(仅与“-q”或“-4”一起使用)
-z   请求服务器缩放流(快进,慢或反向播放)

(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 源码分析_第2张图片LIVE555再学习 -- OpenRTSP 源码分析_第3张图片


你可能感兴趣的:(图像和流媒体,图像和流媒体)