EasydDarwin作为当前国内主要开源流媒体服务器之一,支持RTSP流(传输RTP包)的两种传输方式
采用哪种传输方式是由客户端决定。
用ffmpeg便可向EasyDarwin推流,本文主要分析ffmpeg以UDP方式向EasyDarwin推流时服务器主要代码流程。
ffmpg以UDP方式推流指令:
ffmpeg -i rtsp://[email protected]:554/h264/ch1/main/av_stream -vcodec copy -acodec copy -rtsp_transport udp -f rtsp rtsp://192.168.1.134/test.sdp
图片显示,ffmpeg使用UDP方式向EasyDarwin服务器推流成功,接下来开始分析EasyDarwin服务器代码主要流程。
待续;继续
EasyDarwin服务器启动等待交互
RunServer.cpp void RunServer(){
QTSS_ServerState theServerState = sServer->GetServerState();//获取服务器状态
........
while ((theServerState != qtssShuttingDownState) &&
(theServerState != qtssFatalErrorState))
{//服务器状态正常,while等待
.............
}
}
EasyDarwin接收到推流请求,在socket监听中分析
socket监听类为TCPListenerSocket,其有RTSPListenerSocket及HTTPListenerSocket分别对应RTSP和HTTP请求
每一个请求都触发事件处理函数ProcessEvent(),在ProcessEvent()中调用GetSession()获取RTSPSession
RTSP请求进入RTSPListenerSocket::GetSessionTask();
新建RTSPSession后返回给TCPListenerSocket::ProcessEvent(),将获得的RTSPSession theTask加入线程执行
至此进入线程RTSPSession的执行,开始读取数据,theTask will get an kReadEvent event;
RTSPSession在Run方法中状态机形式处理RTSP请求中的各种报文
while循环中分析当前RTSP会话状态先后进入各种case对报文内容进行分析处理,实现对RTSPSession中重要属性QTSS_RoleParams fRoleParams的相关初始化。
case kReadingFirstRequest:// 第一次对请求报文进行处理
case kHTTPFilteringRequest://对报文内容进行过滤
case kReadingRequest:
case kHaveNonTunnelMessage:// 说明请求报文格式是正确的,请求已进入受理状态
其中进入case kPreprocessingRequest:才是调用相关模块,此时调用的便是QTSSReflectorModule转发模块。
CallDispatch调用的便是QTSSReflectorModuleDispatch函数
传入的QTSS_Role为QTSS_RTSPPreProcessor_Role,进入ProcessRTSPRequest(&inParams->rtspRequestParams)函数
获取当前请求的方法,分析调用对应的函数DoAnnounce,DoSetup其中UDP推流方式不会调用DoDescribe,最终调用DoPlay方法。
在DoAnnounce中判断SDP信息,获取RTSP流信息并保存相关内容以便后续使用
在DoSetup中才是真正构建UDPSocketPair,RTP数据流
主要有下面两点
获取转发会话ReflectorSession
为推流端 创建RTPStream并进行设置(AddRTPStream)
在DoPlay方法为推送端中保持会话连接
至此EasyDarwin完成ffmpeg以UDP方式推送RTSP流的接收,并将RTP流放入转发会话。等待客户端访问转发流。