一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(三)用户接口层之RTSP命令
截至版本1.2.3,myRtspClient函数库共支持以下6个RTSP命令(RFC 2326):
(1)OPTIONS
(2)DESCRIBE
(3)SETUP
(4)PLAY
(5)PAUSE
(6)TEARDOWN
对应的接口函数都以“Do”开头,如“DoOPTIONS”。各个接口函数写法相似,大同小异,差异部分会在后续章节做说明,现以DoOPTIONS()和DoPLAY()举例。
一、ErrorType RtspClient::DoOPTIONS(string uri)
ErrorType RtspClient::DoOPTIONS(string uri)
{
string RtspUri("");
int Sockfd = -; if(uri.length() != ) {
RtspUri.assign(uri);
RtspURI.assign(uri);
}
else if(RtspURI.length() != ) RtspUri.assign(RtspURI);
else return RTSP_INVALID_URI; Sockfd = CreateTcpSockfd(RtspUri);
if(Sockfd < ) return RTSP_INVALID_URI; string Cmd("OPTIONS");
stringstream Msg("");
Msg << Cmd << " " << RtspUri << " " << "RTSP/" << VERSION_RTSP << "\r\n";
Msg << "CSeq: " << ++RtspCSeq << "\r\n";
Msg << "\r\n"; if(!SendRTSP(Sockfd, Msg.str())) {
Close(Sockfd);
return RTSP_SEND_ERROR;
}
if(!RecvRTSP(Sockfd, &RtspResponse)) {
Close(Sockfd);
return RTSP_RECV_ERROR;
}
return RTSP_NO_ERROR;
}
第6-11行,获取RTSP的URI(如rtsp://127.0.0.1/ansersion)。先检查DoOPTIONS参数传入的URI,如果不存在就使用类成员变量RtspURI(更多说明见“实现篇(二)二、RtspClient::RtspClient(string uri)”),若RtspURI也不存在则返回失败。如果参数传入URI,该URI同时会保存至类成员变量RtspURI从而记忆住该URI,以便后续调用“DoXXX”RTSP命令函数时,不必再重复传入URI。
第13-14行,根据URI创建socket,用于和RTSP服务端通信(注:CreateTcpSockfd会根据URI中的IP创建socket,如果以前创建过socket且未关闭,则继续沿用旧有socket。截至版本1.2.3,仅支持使用IPv4的URI)。
第16-20行,组建OPTIONS报文(参见RFC2326 10.1)。
第22-25行,向服务端发送OPTIONS报文。
第26-29行,接收服务端返回报文,并将报文赋值给类成员变量RtspResponse(可以通过GetResponse()获取该值)。
第30行,返回成功。
二、ErrorType RtspClient::DoPLAY(MediaSession * media_session)
ErrorType RtspClient::DoPLAY(MediaSession * media_session)
{
if(!media_session) {
return RTSP_INVALID_MEDIA_SESSION;
} ErrorType Err = RTSP_NO_ERROR;
int Sockfd = -;
Sockfd = CreateTcpSockfd();
if(Sockfd < ) return RTSP_INVALID_URI; string Cmd("PLAY");
stringstream Msg("");
Msg << Cmd << " " << RtspURI << " " << "RTSP/" << VERSION_RTSP << "\r\n";
Msg << "CSeq: " << ++RtspCSeq << "\r\n";
Msg << "Session: " << media_session->SessionID << "\r\n";
if(Realm.length() > && Nonce.length() > ) {
string RealmTmp = Realm;
string NonceTmp = Nonce;
string Md5Response = MakeMd5DigestResp(RealmTmp, Cmd, RtspURI, NonceTmp);
if(Md5Response.length() != MD5_SIZE) {
cout << "Make MD5 digest response error" << endl;
return RTSP_RESPONSE_401;
}
Msg << "Authorization: Digest username=\"" << Username << "\", realm=\""
<< RealmTmp << "\", nonce=\"" << NonceTmp << "\", uri=\"" << RtspURI
<< "\", response=\"" << Md5Response << "\"\r\n";
}
Msg << "\r\n"; if(RTSP_NO_ERROR == Err && !SendRTSP(Sockfd, Msg.str())) {
Close(Sockfd);
Sockfd = -;
Err = RTSP_SEND_ERROR;
}
if(RTSP_NO_ERROR == Err && !RecvRTSP(Sockfd, &RtspResponse)) {
Close(Sockfd);
Sockfd = -;
Err = RTSP_RECV_ERROR;
}
return RTSP_NO_ERROR;
}
第3-5行,判断media_session是否有效(MediaSession类存有音频或视频相关信息,后续章节将做说明)。
第9-10行,创建socket。
第12-29行,组建PLAY报文(参见RFC2326 10.5),其中第17-28行在报文中加入鉴权信息(参见RFC2069),如果不需要鉴权则可略去。
第31-35行,向服务端发送PLAY报文。
第36-40行,接收服务端返回报文。
example代码中使用的是ErrorType RtspClient::DoPLAY(string media_type),是该函数的封装,参数media_type取“video”或“audio”。
一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(三)用户接口层之RTSP命令的更多相关文章
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统 ...
- 一个基于JRTPLIB的轻量级RTSP客户端——myRTSPClient详解
myRTSPClient是一个轻量级的RTSP客户端C++函数库. 支持多平台,支持H264,H265,MPA等音视频传输. 免费开源,接口易用,配套教程与代码解析(本博客). 适合RTSP入门学习. ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(一)概览
myRTSPClient主要可以分成3个部分: 1. RTSPClient用户接口层: 2. RTP 音视频传输解析层: 3. RTP传输层. "RTSPClient用户接口层": ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(六)RTP音视频传输解析层之音视频数据传输格式
一.差异 本地音视频数据格式和用来传输的音视频数据格式存在些许差异,由于音视频数据流到达客户端时,需要考虑数据流的数据边界.分包.组包顺序等问题,所以传输中的音视频数据往往会多一些字节. 举个例子,有 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文
当RTSP客户端向RTSP服务端发送DESCRIBE命令时,服务端理应当回复一条SDP报文. 该SDP报文中包含RTSP服务端的基本信息.所能提供的音视频媒体类型以及相应的负载能力,以下是一段SDP示 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(二)示例
一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用v ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析
一.RTSP命令简述 RTSP是用来控制实时流媒体“播放”.“暂停”.“停止”.“录像”等行为的传输协议.该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据
当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数
RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如Set ...
随机推荐
- zip & tar 压缩文件时排除某个文件夹
确实是用参数 -x aaa bbb 两个文件夹要写全路径. 如 zip -r test.zip test -x /test/aaa/* -x /test/bbb/* 既包含了文件夹,也可以 zip - ...
- vue vuex 提交 this.$store.commit({type: 'setSelectPro', selectPro: this.productId});
1.store.commit({'type':'mutation','parameter':'value'}); store.dispatch('action'); 2.获取state保存的值 sto ...
- C# TSC打印二维码和条形码
效果图 开发.使用环境说明 安装TSC_7.3.8_M-3.exe打印机驱动,安装时选择对应的ttp 244 pro 将TSCLIB.dll复制到C:\Windows\system 驱动安装说明 选择 ...
- jenkins,SVN构建总是clean目录,回归失败
近期发现配置的jenkins任务打包时间极长,经过定位为svn版本的问题,不同的svn版本.svn的信息存在不一致. 解决: 升级服务器svn版本. 调整jenkins系统设置: 测试通过(回滚成功) ...
- java 笔记 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
查了一些资料也不是太明白两个的区别,但是前者是最安全的用法 打个简单的比方,你一个WEB程序,发布到Tomcat里面运行.首先是执行Tomcat org.apache.catalina.startup ...
- 【JAVASCRIPT】React + Redux
摘要 Redux 数据流图 View 层由React 控制, 根据state 变化 刷新渲染组件,作用是根据更新的数据重新渲染组件 Stroe 层其实就是state存储器,作用是更新数据 Dispat ...
- Angular页面加载后自动弹窗
首先在控制器内写好一个弹窗,我用的是ionic的默认提示对话框 // 一个确认对话框 $scope.showConfirm = function() { var confirmPopup = $ion ...
- 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)
为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...
- 《Unity3D-播放被打中的时候粒子的特效的代码》
//思路:首先我们需要给这个敌人身上放置上被打中的时候的粒子效果的组件,然后在获取和初始化这个组件然后在播放这个组件.虽然这个过程很简单但是我们要让 组件随着敌人的移动的时候随时触发就必须将这个组件的 ...
- WinFrom通过委托传递事件
今天一个功能需要动态创建pictruebox然后根据时间来倒叙显示,一开始对于这个需求摸不着头脑,后来在公司的大神帮助下实现了,话不多说具体实现上代码了: 1.动态添加控件并倒叙 首先添加一个用户控件 ...