)。) 是各种类型的 ) 的基类,,"* 是各种类型 ,"* 的基类,各种类型的流媒体格式和编码
的支持即是通过对这两个类的派生实现的。,"* 和 ) 通过 子会话,.%% 联系在一起。
openRTSP 客户端流程
4、创建 %)*+," 和 /%*$%&"'( 类;
、命令行解析,获取流媒体地址和其他选项;
、创建 ( 对象;
5、如果需要,( 对象发送 667 命令并解析服务端响应,获取可以使用命令集。
、( 对象发送 / 命令,并从获服务端反馈中获取流媒体相关描述 字串。
、创建 %% 对象,解析 字串,创建了相应的子会话对象。在这个过程中还完成了 和 通信
使用的 ",0*) 对象的创建,包括协议和端口的选择。
8、根据流媒体不同类型,实例化具体的 会话的 ,"* 和 ) 对象。
9、( 对象发送 $ 和 :; 命令,服务端开始传输流媒体数据。
<、%)*+," 开始事件处理循环,通过 %*( 监听数据包到达并调用注册函数进行处理。
#
================================================================
=====
通过分析 库提供的例子程序 60,可以清晰地了解客户端接收来自网络上媒体数据的过程。注Y意, 协议和 协议接收的
数据分别是视音频数据和发送接收状况的相关信息,其中, 协议只负责接收数据,而 协议除了接收服务器的Y消息之外,还要向服务
器反馈。
:#######' 函数流程
'("&*>*+"?"&@A
B
4###########创建 /%*%)*+," 对象
###########创建 /%*$%&"'( 对象
###########分析 "& 参数,(最简单的用法是:0"(%0C48455D'0&5'05)以便在下面设置一些相关参数
5###########创建 ( 对象
###########由 ( 对象向服务器发送 667 消息并接受回应
###########产生 %*"0( 字符串(由 ( 对象向服务器发送 / 消息并接受回应,根据回应的信息产生Y
%*"0( 字符串,其中包括视音频数据的协议和解码器类型)
8###########创建 %% 对象(根据 %*"0( 在 %% 中创建和初始化 ,.%% 子会话对Y象)
9###########2+ 循环中配置所有子会话对象(为每个子会话创建 ,"* 和 %(* 对象,并创建两个 ",0*) 对象,分别对
应Y,"* 和 %(* 对象,把在每个 ",0*) 对象中创建的 %*)( 描述符置入Y/%*%)*+,"CCE( 中,
,"* 对象的创建的依据是 %*"0(,例如对于 5文件来说,视音频 ,"* 分别对应 5,"*
和 5"*,"* 对象。Y%(* 对象在构造函数中完成将 *)( 描述符、处理接收 数据的函数Y
%(*CC*'&0"(" 以及 %(* 本身三者绑定在一个Y"%*"0(" 对象中,并置入
/%*%)*+,"CCE" 中。完成绑定后会向服务器发送一条Y消息。)
<###########由 ( 对象向服务器发送 $ 消息并接受回应。
4D#######2+ 循环中为每个子会话创建接收器3) 对象 ,在 3) 对象中根据子会话的 ** 等属性缺省产生记录视音频数据的文
件Y名,视音频文件名分别为:F5FF4 和 ,F5F7F,无后缀名
44#######2+ 循环中为每个子会话的视音频数据装配相应的接收函数,将每个子会话中的 ,"* 中的 ",0*) 对象中的 6G 描
述符,Y置入 /%*%)*+,"CCE( 中,并将描述符、处理接收 数据的函数Y
,(3"',"*CC(2")" 以及 ,"* 本身三者绑定在一个Y"%*"0(" 对象中,并置入
/%*%)*+,"CCE" 中>并将 3) 的缓冲区Y和包含写入文件操作的一个函数指针配置给 ,"* 对象,这个缓冲区
将会在 (2")" 中接收来自网络的视音频数据分Y析和去掉 包头的工作由 ,"* 完成 ,而这个函数指针在
(2")" 中被调用以完成将缓冲区中的数据写入文件。
4#######由 ( 对象向服务器发送 :; 消息并接受回应。
4#######进入 2+ 循环,调用 /%*%)*+,"CC&(0 函数接受数据,直到服务器发送 :6H7 消息给客户Y端,客户端接
收到该消息后释放资源,程序退出。
I