没有合适的资源?快使用搜索试试~ 我知道了~
首页live555 & mplayer
资源详情
资源评论
资源推荐

RTSP 服务器实例 live555 源代码分析
1. RTSP 连接的建立过程
类用于构建一个 服务器,该类同时在其内部定义了一个
类,用于处理单独的客户会话。
首先创建 服务器具体实现类是 ,在创建过程中,先建立
在 的 端口进行监听,然后把连接处理函数句柄
和 句柄传给任务调度器
。
任务调度器把 句柄放入后面 调用中用到的 句柄集 中,
同时将 句柄和 句柄关联起来。接着,主程序开始进入
任务调度器的主循环(!"#),在主循环中调用系统函数 阻塞,等待网络连
接。
当 客户端输入#$$%&'(%)*(+(%$%(#连接服务器时, 返回对应的
,进而根据前面保存的对应关系,可找到对应处理函数句柄,这里就是前面提到的
了。在 中创建了
,开始对这个客户端的会话进行处理。
2. DESCRIBE 请求消息处理过程
服务器收到客户端的 !,-! 请求后,根据请
求 ."#$$%&'(%)*(+(%$%(#,找到对应的流媒体资源,返回响应消息。 中的
/ 类用来处理会话中描述,它包含多个(音频或视频)的子会话描述
/0。
服务器收到客户端的连接请求,建立了 类,处理单独的客户会
话。在建立 的过程中,将新建立的 句柄()和
请求处理函数句柄 1 传给任务调度器,
由任务调度器对两者进行一对一关联。
当客户端发出 请求后,服务器主循环中的 调用返回,根据 句柄找到
对应的 1,开始消息处理。先进行消息的解析,如果发现请求是
!,-! 则进入 2!,-! 函数。根据客户端请求 ." 的后缀如 %(#3
调用成员函数 #/ 查找对应的流媒体信息
/。如果 / 不存在,但是本地存在 %(# 文件,则
创建一个新的 /。在创建 / 过程中,根据文件后
缀(#,创建媒体 /!45%' 的解复用器/!4%'67。再由
/!4%'67 创建一个子会话描述
/!4%'7/0。最后由 / 完成组装响
应消息中的 信息( 组装过程见下面的描述),然后将响应消息发给客户端,完成一
次消息交互。
SDP 消息组装过程:
/ 负责产生会话公共描述信息,子会话描述由
/!4%'7/0 产生。
/!4%'7/0 在其父类成员函数
8/0#"中生成会话描述信息。在 #"实

现里面,创建一个虚构的 6具体实现类为
/!4%'96 和 /!4%':6和 (具体实
现类为 /!4%'9 和 /!4%':),最后调用
"6(((成员函数生成子会话描述。
3. SETUP 请求消息处理过程
类用于处理单独的客户会话。其类成员函数 2!.
处理客户端的 !. 请求。调用 ##对 !. 请求的传输头解析,调
用子会话这里具体实现类为 8/0的
函数获取流媒体发送传输参数。将这些参数组装成响应消息,返回
给客户端。
获取发送传输参数的过程:调用子会话具体实现类
/!4%'7/0的 ;<(((创建
/!4%':6,选择发送传输参数,并调用子会话的
;<(((创建 /!4%':。同时将这些信息保存在
类对象中,用于记录流的状态。
客户端发送两个 !. 请求,分别用于建立音频和视频的 接收。
4. PLAY 请求消息处理过程
类成员函数 2"9=处理客户端的播放请求。首先调用
子会话的 3内部调用 /(((,然后是
/6,接着调用
/609(((。09 内部先设置
包头,内部再调用 /6#6填充编码帧数据。
#6 内部通过 6;763接着
/!4:64;76,再接着经过
/!4:6,
6 4(((3/6 46(((3
/6 46%(((等一系列繁琐调用,最后到了
/6, ;3这里才真正发送 数据包。然后是计
算下一个数据包发送时间,把 /6;7(((函数句柄传给任务调度器,
作为一个延时事件调度。在主循环中,当 /6;7被调度时,又
开始调用 /609(((开始新的发送数据过程,这样客
户端可以源源不断的收到服务器传来的 包了。
发送 数据包的间隔计算方法:
.#<7#030
<>#(

问题:
这几个天在 ; 上问了不少东西3现在总算编译集成到项目,并且可以读到数据(但还有几个
问题不明白
%请问一下 ",:! 中怎么样播放音频的?现在收到的 999 里面的应该都是视频侦吧?
如何同步播放的?
'播放时3暂停3重新播放在 ",:! 中哪部分代码可以参考?
@, 侦3 侦3- 侦怎么样判断的?在 66/!4 解码后判断吗?
虽然上面几个问题可能对各位来说太简单3但是目前搜索到的资料太多少3项目时间太紧3所以目
前只能边问人边看代码了(
回答:
貌似 9 收到的也可能是音频帧(
库只是传输,获取数据流。不能播放 ,, 帧的判断取决与那种方式编码 对于 /!43++
+++%++ 是 :8",是 , 帧的开始,里面有宽,高等数据 +++++%0) 是一帧的开始,后面的
一个字节高两位可以判断是什么帧

live555 源代码简介
/ 项目的源代码包括四个基本的库,各种测试代码以及 ,:!/
。四个基本的库分别是
.!A,#,/,-.!
。
.! 和 类用于事件的调度,实现异步读取事件的句柄的
设置以及错误信息的输出。另外,还有一个 0 类定义了一个通用的 表,其它代
码要用到这个表。这些都是抽象类,在应用程序中基于这些类实现自己的子类。
# 类是对网络接口的封装,用于收发数据包。正如名字本身,4# 主要
是面向多播数据的收发的,它也同时支持单播数据的收发。4# 定义了两个构造函数
4#.!A32A#93
#32*2B
4#.!A32A#93
2A693
#B
前者是用于 ,/(5#)组,后者用于 /(5#C
)组。# 库中的 # 例程提供了读写 等函数,并且屏蔽了不同
的操作系统之间的区别,这是在 4##(## 文件中实现的。
/ 库中有一系列类,基类是 /,这些类针对不同的流媒体类型和编码。
各种测试代码在 目录下,比如 # 等,这些代码有助于理解
/ 的应用。
",:!/ 是一个纯粹的 服务器。支持多种格式的媒体文件
D 流文件,扩展名 。
D 流文件,扩展名 #。
D/!45 视频基本流文件,扩展名 。
D/@ 文件,扩展名 #@。
DE9: 文件/,扩展名 <。
D9/ 音频文件,扩展名(。
D99 文件,9 格式,扩展名 。
用 开发应用程序
基于 / 的程序,需要通过继承 .! 抽象类和
抽象类,定义相应的类来处理事件调度,数据读写以及错误处理。 项目的源代码里有这些
类的一个实现,这就是“-.!F库。-.! 主要是针
对简单的控制台应用程序,利用 实现事件获取和处理。这个库利用 .7 或者
E< 的控制台作为输入输出,处于应用程序原形或者调试的目的,可以用这个库用户可
以开发传统的运行与控制台的应用。
剩余15页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论6