EasyDarwin使用udp方式推流实现摄像头直播代码流程分析

EasydDarwin作为当前国内主要开源流媒体服务器之一,支持RTSP流(传输RTP包)的两种传输方式

  • RTP/AVP/UDP
  • RTP/AVP/TCP

采用哪种传输方式是由客户端决定。

用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

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第1张图片

图片显示,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请求

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第2张图片

 

每一个请求都触发事件处理函数ProcessEvent(),在ProcessEvent()中调用GetSession()获取RTSPSession

            

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第3张图片

RTSP请求进入RTSPListenerSocket::GetSessionTask();

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第4张图片

新建RTSPSession后返回给TCPListenerSocket::ProcessEvent(),将获得的RTSPSession theTask加入线程执行

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第5张图片

至此进入线程RTSPSession的执行,开始读取数据,theTask will get an kReadEvent event;


 

RTSPSession在Run方法中状态机形式处理RTSP请求中的各种报文


EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第6张图片

while循环中分析当前RTSP会话状态先后进入各种case对报文内容进行分析处理,实现对RTSPSession中重要属性QTSS_RoleParams fRoleParams的相关初始化。

case kReadingFirstRequest:// 第一次对请求报文进行处理

case kHTTPFilteringRequest://对报文内容进行过滤

case kReadingRequest:

case kHaveNonTunnelMessage:// 说明请求报文格式是正确的,请求已进入受理状态

其中进入case kPreprocessingRequest:才是调用相关模块,此时调用的便是QTSSReflectorModule转发模块。

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第7张图片

CallDispatch调用的便是QTSSReflectorModuleDispatch函数

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第8张图片

传入的QTSS_Role为QTSS_RTSPPreProcessor_Role,进入ProcessRTSPRequest(&inParams->rtspRequestParams)函数

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第9张图片

获取当前请求的方法,分析调用对应的函数DoAnnounce,DoSetup其中UDP推流方式不会调用DoDescribe,最终调用DoPlay方法。

在DoAnnounce中判断SDP信息,获取RTSP流信息并保存相关内容以便后续使用

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第10张图片

在DoSetup中才是真正构建UDPSocketPair,RTP数据流

主要有下面两点

获取转发会话ReflectorSession

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第11张图片

为推流端 创建RTPStream并进行设置(AddRTPStream)

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第12张图片

在DoPlay方法为推送端中保持会话连接

 

EasyDarwin使用udp方式推流实现摄像头直播代码流程分析_第13张图片


至此EasyDarwin完成ffmpeg以UDP方式推送RTSP流的接收,并将RTP流放入转发会话。等待客户端访问转发流。

你可能感兴趣的:(EasyDarwin,流媒体)