2012.02.13(rtsp)
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)相关推荐
- 关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13...
为什么80%的码农都做不了架构师?>>> 关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13 现有功能: 以前版本仅支持自己定义url,返回 ...
- P5706 【深基2.例8】再分肥宅水--2022.02.13
[深基2.例8]再分肥宅水 - 洛谷 C++代码: /* P5706 [深基2.例8]再分肥宅水--2022.02.13 https://www.luogu.com.cn/problem/P5706 ...
- 2012.02.17
A^B,这里^的功能为: 例如:0x44^0x33=0100 0100 ^ 0011 0011=0111 0111=0x77 写就是相同为比较,如果同,则0,异,则1 0100 0100 0011 0 ...
- 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 ...
- 【2012.10.13 上周工作总结】
上周学习了新的javascript框架Ember,接下来将这个框架与backbone做一些简单比较,同时做一些总结 一.个人感觉Ember相对于Backbone具有更高的灵活性: 1.Backbone ...
- 《安富莱嵌入式周报》第252期:2022.02.07--2022.02.13
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- 雨林木风GhostXP_SP3情人节装机版2012.02
雨林木风GhostXP_SP3情人节装机版2012.02 下载地址:http://www.xiazaijidi.com/xp/ylmf/45.html 文件名称: 雨林木风 GhostXP SP3 快 ...
- 算法学习入门书籍 -- 2022.02.13
1.我的第一本算法书(2018年11月) 2.啊哈!算法(C语言版) 3.啊哈!算法(大字版)-2021.04 -- C语言 4.哇,编程!--跟小明一起学算法(2020.05) -- C++语言 5 ...
- 2013.02.13——笔记
博客地址:http://www.cnblogs.com/zengjianrong/archive/2013/02/23/2923886.html 程序员面试宝典 1. 5.1-2:下列代码输出为:4 ...
最新文章
- 数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)
- 轻量级NLP工具Trankit开源,中文处理更精准,超越斯坦福Stanza,内存占用小45%
- 高并发下的static类成员可能存在安全隐患
- 数据结构排序法之插入法
- 风控人最容易被误解的一个风险管理板块
- Cuba studio框架中使用thymeteaf模板时中文乱码
- 工业控制pc是微型计算机,微型计算机工业控制.doc
- 商业图表案例9.2-麦吉尔大学博士生录取的严格把控
- ZTD 简单做十个好习惯总结
- python之shapely库的使用
- 激励人生成功的10句经典中英文
- 水果店开业活动策划,水果店开业怎么搞活动
- Linux: fPIC与 pie 区别
- 工作中的高效工具推荐,职场人士必备便签小工具
- 【问题】【实用】java服务假死【CLOSE_WAIT】【线程WAITING】
- APP——流量测试——adb命令简单测试
- lambda 对象去重_lambda去重
- M1卡 不能使用KeyB进行读写的问题
- 软件测试实用技术与常用模板:前言
- 学会NI-DAQmx10个函数,解决80%的数据采集应用问题
热门文章
- 百度10.55亿元入股创维酷开,李彦宏要为电视带来AI遥控器
- 谷歌提出深度CNN模型NIMA:帮你挑选清晰且有美感的图片
- SSH密钥对登录的原理和实践
- Python中字符串反转的一个简单操作
- 《jQuery Mobile快速入门》—— 1.6 可主题化的设计
- 使用MATLAB贝叶斯工具箱(BNT),进行吉布斯采样(Gibbs Sampling)之前需要做的编译工作...
- Spark1.0新特性--Spark SQL
- 登陆126邮箱 出现 403 Forbidden 腾达路由器问题
- 前端入门-day2(常见css问题及解答)
- Apache Calcite官方文档中文版-概览-1.背景