您的位置:首页 > 其它

live555 接收rtsp视频流流程分析

2013-03-07 08:37 471 查看
RTSP交互流程(http://blog.sina.com.cn/s/blog_6da4642d0100quwa.html)

C表示RTSP客户端,S表示RTSP服务端

① C->S: OPTION request //询问S有哪些方法可用

S->C: OPTION response //S回应信息中包括提供的所有可用方法

② C->S: DESCRIBE request //要求得到S提供的媒体初始化描述信息

S->C: DESCRIBE response //S回应媒体初始化描述信息,主要是sdp

③ C->S: SETUP request //设置会话属性,以及传输模式,提醒S建立会话

S->C: SETUP response //S建立会话,返回会话标识符及会话相关信息

④ C->S: PLAY request //C请求播放

S->C: PLAY response //S回应请求信息

S->C: 发送流媒体数据

⑤ C->S: TEARDOWN request //C请求关闭会话

S->C: TEARDOWN response //S回应请求

上述的过程是标准的RTSP流程,其中第3步和第4步是必需的。

OpenCore在执行完PLAYER_SET_DATASOURCE,prepare之后,执行PLAYER_INIT时,如果发现datasource是rtsp流,则进入rtsp模块。

OpenCore的RTSP模块实现在Pvrtsp_client_engine_node.cpp中,PVRTSPEngineNode::SendRtspDescribe()描述了连接建立过程中的状态变化过程。

需要注意的时,opencore在发出OPTION
request后,并不会等着收response,而是直接发DESCRIBE
request,然后才开始收OPTION response和DESCRIBE
response。

Live555在RTSPServer.cpp中用RTSPServer::RTSPClientSession::incomingRequestHandler()来处理来自client端的request。

RTSP源码接收端使用样例:

// RtstClientTest.cpp

#include "stdafx.h"

#include "RtspRequest.h"

#include "Rtp.h"

RtspRequest g_RtspRequest;

int _tmain(int argc, _TCHAR* argv[])

{

// 接收

string url = "rtsp://192.168.1.1:554/aacAudioTest";

string setupName = "aacAudioTest";

INT rtpPort = 8080;

INT rtcpPort = rtpPort + 2;

string sdp;

INT64 sess;

g_RtspRequest.Open(url.c_str(), "127.0.0.0", 0);

g_RtspRequest.RequestOptions();

g_RtspRequest.RequestDescribe(&sdp);

g_RtspRequest.RequestSetup(setupName.c_str(), transportModeRtpUdp,
rtpPort , rtcpPort , &sess);

g_RtspRequest.RequestPlay();

Rtp* pRtp = new Rtp();

pRtp->Open("127.0.0.0", rtpPort);

PBYTE pBuffer = new BYTE[1024*1024*10];

int iRead;

INT payloadType;

WORD sequenceNumber;

INT32 timeStamp;

INT32 ssrc;

while(TRUE)

{

iRead = pRtp->Read(pBuffer, 1024*1024*10, &payloadType,
&sequenceNumber, &timeStamp, &ssrc);

if (iRead > 0)

{

//
save buff

}

}

delete pRtp;

g_RtspRequest.RequestPause();

g_RtspRequest.RequestTeardown();

g_RtspRequest.Close();

delete []pBuffer;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: