RTSP 服务器搭建流程
rtspservice.cpp 文件主函数中:
1. 在主函数中调用 tcp_listen 函数,创建指定端口的 TCP 套接字,把属性设置成非阻塞,并
监听。
2. 调用 ScheduleInit ,初始化 schedule_list 队列,创建任务处理调度线程
schedule_do。
在 schedule_do 线程中处理流程为打开指定.264 文件,然后下列处于循环中:如果全局变
量 g_s32DoPlay 大于零则读取数据,找出文件的 nalu 单元数据,其中 g_s32DoPlay 的值在添加
客户端时就在调用 RTSP_setup 时自减,在调用 RTSP_teardown 时自增。然后调用 RtpSend 向
正在播放的有效队列客户端发送数据。如果添加 RTCP,那么就在此处添加对 RTCP 处理的函数。
3. 在主循环中调用 EventLoop 等待客户端连接,如果连接,则调用 AddClient 向静态变量
pRtspList 链表中增加一个客户端。并且调用 ScheduleConnections 对链表中已经存在的
客户端进行相应处理。这个过程在循环中一直进行。
ScheduleConnections 函数是对已经存在的客户端进行处理,流程如下:
如果 pRtspList 链表非空,则调用 RtspServer 对链表中元素进行处理,如果返回参数正常,则对
链表下一个元素进行处理。如果处理出错,则释放链表占有的资源,并且 g_s32DoPlay--。
RtspServer 函数为对每一个所连接的客户端进行命令解析处理:
用 select 判断 TCP 端口是否有数据读取,是则调用 tcp_read 读取数据,并且获取客户端地址信
息,存入 pRtsp->stClientAddr;然后把收取数据存入链表->in_buffer 中;
调用 RTSP_handler 对链表中的数据进行处理;
如果 rtsp->out_size>0,则把发送缓存区中的消息发送给客户端,这是服务器处理完成对应命令
之后给客户端的响应。
如果增加 RTCP 控制,那么在此处还得增加接收客户端 rtcp 端口的数据,放在对应的缓存中,然后
在 schedule_do 线程对其进行处理。
RTSP_handler 为对接收的数据进行处理函数:
通过判断 pRtspBuf->in_size 是否为零,来判断接收缓存中是否有消息,如果有则:
a,调用 RTSP_validate_method 把处理命令解析出来;b,调用 RTSP_state_machine 消息处
理状态机,按照对应命令来进行相关处理;处理完成之后,调用 RTSP_discard_msg 把缓存区中首
个命令删除。如果还有命令则继续处理。
评论2