RTSP:Read network & Netscape共同提出的如何有效的在IP网路上传输流媒体数据的应用协议。

RTSP建立并控制一个或几个时间同步的连续流媒体,如音频和视频。

按需传送,提供了选择发送通道(UDP,组播UDP与TCP),并提供基于RTP的发送机制方法。RTSP控制的流可能用到RTP.

RTSP中客户端和服务器口可以发送请求。

RTSP是一种文本协议,采用UTF-8编码中的ISO 10646字符集。

RTSP的消息有两大类:请求消息,回应消息:

请求消息:

简单的rtsp交互过程:

C表示rtsp客户端;S表示rtsp服务器端:

1、C->S:OPTION request;//询问s有哪些方法可用

BOOL RtspRequest::RequestOptions()
{
 if (m_State < stateConnected)
  return FALSE;

SendRequest("OPTIONS");

printf("\n");

if ( !GetResponses() )
  return FALSE;

return TRUE;
}

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

void RtspResponse::ResponseOptions()
{
 AddField("Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE");
 SendResponse("");

printf("\n");
}

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

BOOL RtspRequest::GetDescribe(string* pDescribe)
{
 BYTE* pDescribeBuffer = NULL;
 int describeSize;
 string describe;
 string searchField;

if ( !SearchResponses(&searchField, "Content-Length") )
  return FALSE;

describeSize = atoi( searchField.c_str() );
 pDescribeBuffer = new BYTE[describeSize + 1];
 if (!pDescribeBuffer)
  return FALSE;
 memset(pDescribeBuffer, 0, describeSize);

describeSize = Tcp::Read(pDescribeBuffer, describeSize);
 if (describeSize != describeSize)
 {
  delete []pDescribeBuffer;
  return FALSE;
 }
 pDescribeBuffer[describeSize] = '\0';

*pDescribe = (char*)pDescribeBuffer;

delete []pDescribeBuffer;

printf("%s\n\n", pDescribe->c_str());

return TRUE;
}

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

void RtspResponse::ResponseDescribe(PCSTR sdp, UINT sdpLength)
{
 string contentBase;
 string contentType;
 string contentLength;
 string server;

char temp[20];
 string requestMrl;

server = "Server: RTSP Service";
 
 contentType = "Content-Type: application/sdp";

_snprintf(temp, 20, "%lu", sdpLength);
 contentLength = "Content-Length: ";
 contentLength += temp;

GetRequestMrl(&requestMrl);
 contentBase = "Content-Base: ";
 contentBase += requestMrl;

AddField(server);
 AddField(contentBase);
 AddField(contentType);
 AddField(contentLength);
 SendResponse("");

printf("\n");

Tcp::Write((PBYTE)sdp, sdpLength);

printf("Content:\n");
 printf(sdp);
 printf("\n\n");
}

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

BOOL RtspRequest::RequestSetup(PCSTR setupName, INT transportMode, INT clientPort, INT clientRtcpPort, INT64* pSession)
{
 if (m_State < stateConnected)
  return FALSE;

string transportField;

if (setupName == NULL)
  m_SetupName = "";
 else
  m_SetupName = setupName;

if ( !GenerateTransportField(&transportField, transportMode, clientPort, clientRtcpPort) )
  return FALSE;

AddField(transportField);
 SendRequest("SETUP");

printf("\n");

if ( !GetResponses() )
  return FALSE;

m_State = stateReady;

if (pSession)
  *pSession = m_Session;

return TRUE;
}

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

void RtspResponse::ResponseSetup( PCSTR serverIp, INT serverRtpPort,
         PCSTR targetIp, INT targetRtpPort,
         INT32 ssrc)
{
 string transport;
 string client_port;
 string server_port;
 string ssrc_;
 char temp[100];

if (!m_Session)
  m_Session = GenerateOneNumber();

_snprintf(temp, 100, "server_port=%u-%u", serverRtpPort, serverRtpPort+1);
 server_port = temp;

_snprintf(temp, 100, "client_port=%u-%u", targetRtpPort, targetRtpPort+1);
 client_port = temp;

_snprintf(temp, 100, "ssrc=%u", ssrc);
 ssrc_ = temp;

transport += "Transport: RTP/AVP;unicast;";
 transport += "source=";
 transport += serverIp;
 transport += ';';
 transport += server_port;
 transport += ';';
 transport += client_port;
 transport += ';';
 transport += ssrc_;
  
 AddField(transport);
 SendResponse("");

printf("\n");
}

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

BOOL RtspRequest::RequestPlay()
{
 if (m_State < stateReady)
  return FALSE;

SendRequest("PLAY");

printf("\n");

if ( !GetResponses() )
  return FALSE;
 
 m_State = statePlaying;

return TRUE;
}

4、S->C:PLAY request//S回应请求信息

void RtspResponse::ResponsePlay(PCSTR setupUrl)
{
 string rtpinfo = "RTP-Info: ";
 rtpinfo += setupUrl;

//string range = "Range: npt=now-";
 //AddField(range);
 AddField(rtpinfo);
 SendResponse("");

printf("\n");
}

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

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

BOOL RtspRequest::RequestTeardown()
{
 if (m_State < stateConnected)
  return FALSE;

SendRequest("TEARDOWN");

printf("\n");

if ( !GetResponses() )
  return FALSE;

m_State = stateInit;

return TRUE;
}

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

void RtspResponse::ResponseTeardown()
{
 AddField("Connection: Close");
 SendResponse("");

printf("\n");
}

上面的过程是标准的,友好的rtsp流程。其中3、4步时必须的;

1、OPTION

目的是得到服务器提供的可用方法:

OPTION rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq:1 //每个消息都有序号来标记,第一个包通常是option请求消息

转载于:https://www.cnblogs.com/itxiaocaiyidie/archive/2012/02/13/2348653.html

2012.02.13(rtsp)相关推荐

  1. 关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13...

    为什么80%的码农都做不了架构师?>>>    关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13 现有功能: 以前版本仅支持自己定义url,返回 ...

  2. P5706 【深基2.例8】再分肥宅水--2022.02.13

    [深基2.例8]再分肥宅水 - 洛谷 C++代码: /* P5706 [深基2.例8]再分肥宅水--2022.02.13 https://www.luogu.com.cn/problem/P5706 ...

  3. 2012.02.17

    A^B,这里^的功能为: 例如:0x44^0x33=0100 0100 ^ 0011 0011=0111 0111=0x77 写就是相同为比较,如果同,则0,异,则1 0100 0100 0011 0 ...

  4. DWR入门教程(http://www.cnblogs.com/cyjch/archive/2012/02/16/2353758.html)

    文章转载自<http://www.cnblogs.com/cyjch/archive/2012/02/16/2353758.html>,多谢大牛分享! DWR入门教程 DWR(Direct ...

  5. 【2012.10.13 上周工作总结】

    上周学习了新的javascript框架Ember,接下来将这个框架与backbone做一些简单比较,同时做一些总结 一.个人感觉Ember相对于Backbone具有更高的灵活性: 1.Backbone ...

  6. 《安富莱嵌入式周报》第252期:2022.02.07--2022.02.13

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  7. 雨林木风GhostXP_SP3情人节装机版2012.02

    雨林木风GhostXP_SP3情人节装机版2012.02 下载地址:http://www.xiazaijidi.com/xp/ylmf/45.html 文件名称: 雨林木风 GhostXP SP3 快 ...

  8. 算法学习入门书籍 -- 2022.02.13

    1.我的第一本算法书(2018年11月) 2.啊哈!算法(C语言版) 3.啊哈!算法(大字版)-2021.04 -- C语言 4.哇,编程!--跟小明一起学算法(2020.05) -- C++语言 5 ...

  9. 2013.02.13——笔记

    博客地址:http://www.cnblogs.com/zengjianrong/archive/2013/02/23/2923886.html 程序员面试宝典 1. 5.1-2:下列代码输出为:4 ...

最新文章

  1. 数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)
  2. 轻量级NLP工具Trankit开源,中文处理更精准,超越斯坦福Stanza,内存占用小45%
  3. 高并发下的static类成员可能存在安全隐患
  4. 数据结构排序法之插入法
  5. 风控人最容易被误解的一个风险管理板块
  6. Cuba studio框架中使用thymeteaf模板时中文乱码
  7. 工业控制pc是微型计算机,微型计算机工业控制.doc
  8. 商业图表案例9.2-麦吉尔大学博士生录取的严格把控
  9. ZTD 简单做十个好习惯总结
  10. python之shapely库的使用
  11. 激励人生成功的10句经典中英文
  12. 水果店开业活动策划,水果店开业怎么搞活动
  13. Linux: fPIC与 pie 区别
  14. 工作中的高效工具推荐,职场人士必备便签小工具
  15. 【问题】【实用】java服务假死【CLOSE_WAIT】【线程WAITING】
  16. APP——流量测试——adb命令简单测试
  17. lambda 对象去重_lambda去重
  18. M1卡 不能使用KeyB进行读写的问题
  19. 软件测试实用技术与常用模板:前言
  20. 学会NI-DAQmx10个函数,解决80%的数据采集应用问题

热门文章

  1. 百度10.55亿元入股创维酷开,李彦宏要为电视带来AI遥控器
  2. 谷歌提出深度CNN模型NIMA:帮你挑选清晰且有美感的图片
  3. SSH密钥对登录的原理和实践
  4. Python中字符串反转的一个简单操作
  5. 《jQuery Mobile快速入门》—— 1.6 可主题化的设计
  6. 使用MATLAB贝叶斯工具箱(BNT),进行吉布斯采样(Gibbs Sampling)之前需要做的编译工作...
  7. Spark1.0新特性--Spark SQL
  8. 登陆126邮箱 出现 403 Forbidden 腾达路由器问题
  9. 前端入门-day2(常见css问题及解答)
  10. Apache Calcite官方文档中文版-概览-1.背景