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;
}
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;
}
相关文章推荐
- live555 接收rtsp视频流流程分析
- live555 接收rtsp视频流详细源码流程详细解析
- live555 接收rtsp视频流流程分析
- Live555教程------live555 接收rtsp视频流详细源码流程详细解析(二)
- live555 接收rtsp视频流详细源码流程详细解析
- 流媒体Live555(五)——openRTSP流程分析
- live555源代码详细分析解析,教你如何使用live555接收rtsp数据
- vlc源码分析(三) 调用live555接收RTSP数据
- live555源代码详细分析解析,教你如何使用live555接收rtsp数据
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- vlc-android对于通过Live555接收到音视频数据包后的处理分析
- 【视频】对RTSP抓包,分析通讯流程
- live555客户端程序openrtsp程序流程详细分析
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer
- vlc-android对于通过Live555接收到音视频数据包后的处理分析
- live555 --RTSP SET_UP PLAY 执行流程分析 .
- 开源项目live555接收rtsp视频流总结
- Appro-RTSP详细结构分析——基于live555的视频直播
- 流媒体Live555(五)——openRTSP流程分析
- live555库的rtsp服务器源码分析总结,流程详解RTSPServer