一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析
--------------------更新2018.08.20-------------------
添加http_tunnel_example.cpp作为RtspOverHttp示例程序。
--------------------更新2018.08.20结束-------------------
一、example逻辑伪码
myRTSPClient附带3个example程序:simple_example、complete_example、common_example。后两个example都是从simple_example中衍生出来的,以下将以simple_example为主进行解析,并且会在最后说明一下另两个example与simple_example的差别。
以下是simple_example简化后的伪代码,以便理解:
1. main():
2. myRtspClient Client;
3. Client.SetURI("rtsp://127.0.0.1/ansersion");
4. Client.SendDESCRIBE();
5. Client.SendSETUP();
6. Client.SendPLAY();
7. Write 1000 RTP Data to file "test_packet_recv.h264";
8. Client.SendTEARDOWN();
9. return;
二、simple_example.cpp代码注释
#include <iostream>
#include "rtspClient.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> using std::cout;
using std::endl; int main(int argc, char *argv[])
{
string RtspUri("rtsp://127.0.0.1/ansersion");
// string RtspUri("rtsp://192.168.81.145/ansersion");
RtspClient Client; /* Set up rtsp server resource URI */
Client.SetURI(RtspUri); /* Send DESCRIBE command to server */
Client.DoDESCRIBE(); /* Parse SDP message after sending DESCRIBE command */
Client.ParseSDP(); // 解析RTSP服务端受理DESCRIBE命令后返回的SDP信息 /* Send SETUP command to set up all 'audio' and 'video'
* sessions which SDP refers. */
Client.DoSETUP(); printf("start PLAY\n");
printf("SDP: %s\n", Client.GetSDP().c_str()); /* Send PLAY command to play only the
* 'video' sessions.*/
Client.DoPLAY("video"); /* Receive 1000 RTP 'video' packets
* note(FIXME):
* if there are several 'video' session
* refered in SDP, only receive packets of the first
* 'video' session, the same as 'audio'.*/
int packet_num = 0;
uint8_t buf[65534];
size_t size = 0; /* Write h264 video data to file "test_packet_recv.h264"
* Then it could be played by ffplay */
int fd = open("test_packet_recv.h264", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IXUSR);
if(Client.GetSPSNalu(buf, &size)) { // 解码SDP中关于H264的SPS的数据
if(write(fd, buf, size) < 0) { // 将SPS写入文件
perror("write");
}
} else {
printf("SPS error\n");
} if(Client.GetPPSNalu(buf, &size)) { // 解码SDP中关于H264的PPS的数据
if(write(fd, buf, size) < 0) { // 将PPS写入文件
perror("write");
}
} else {
printf("PPS error\n");
} while(++packet_num < 1000) { // 接收1000个H264的数据包(确切的说是1000个NALU)
if(!Client.GetMediaData("video", buf, &size)) continue;
if(write(fd, buf, size) < 0) {
perror("write");
}
printf("recv %lu\n", size);
} printf("start TEARDOWN\n");
/* Send TEARDOWN command to teardown all of the sessions */
Client.DoTEARDOWN(); return 0;
}
三、common_example.cpp和complete_example.cpp
common_example.cpp不同于simple_example.cpp的地方只有开头几行,这些代码是为了可以用参数指定RTSP URI。
int main(int argc, char *argv[])
{
if(argc != ) {
cout << "Usage: " << argv[] << " <URL>" << endl;
cout << "For example: " << endl;
cout << argv[] << " rtsp://127.0.0.1/ansersion" << endl;
return ;
}
cout << "Start play " << argv[] << endl;
cout << "Then put video data into test_packet_recv.h264" << endl;
string RtspUri(argv[]);
// string RtspUri("rtsp://192.168.81.145/ansersion");
RtspClient Client; /* Set up rtsp server resource URI */
Client.SetURI(RtspUri);
......
return ;
}
complete_example.cpp不同于simple_example.cpp的地方,就在于每次发送RTSP命令时, 它都会检查命令发送是否成功,并且检验返回信息是否是“200 OK”。
int main(int argc, char * argv[])
{
......
/* Send DESCRIBE command to server */
if(Client.DoDESCRIBE() != RTSP_NO_ERROR) {
printf("DoDESCRIBE error\n");
return ;
}
printf("%s\n", Client.GetResponse().c_str());
/* Check whether server return '200'(OK) */
if(!Client.IsResponse_200_OK()) {
printf("DoDESCRIBE error\n");
return ;
}
......
return ;
}
OK!以上便是myRTSP的基础内容。
一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析的更多相关文章
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(二)示例
一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用v ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析
一.RTSP命令简述 RTSP是用来控制实时流媒体“播放”.“暂停”.“停止”.“录像”等行为的传输协议.该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控 ...
- 一个基于JRTPLIB的轻量级RTSP客户端——myRTSPClient详解
myRTSPClient是一个轻量级的RTSP客户端C++函数库. 支持多平台,支持H264,H265,MPA等音视频传输. 免费开源,接口易用,配套教程与代码解析(本博客). 适合RTSP入门学习. ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(一)用ffmpeg解码视频
一.概述 myRTSPClient(RTSPClient)获取音视频数据之后,接下来的工作便是将音视频数据交给解码器去解码(ffmpeg),ffmpeg解码之后于是便有了呈现在终端用户(USER)面前 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文
当RTSP客户端向RTSP服务端发送DESCRIBE命令时,服务端理应当回复一条SDP报文. 该SDP报文中包含RTSP服务端的基本信息.所能提供的音视频媒体类型以及相应的负载能力,以下是一段SDP示 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据
当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据
myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数
RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如Set ...
随机推荐
- Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射
1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...
- JavaWeb 后端 <一> 之 Tomcat服务器 - Http协议 学习笔记
1.Web开发概述 1.1服务器上的资源分类: a.静态资源:指web页面中供人们浏览的数据始终是不变.html css js 图片 多媒体 b.动态资源:指web页面中供人们浏览的数据是由程序产生的 ...
- 还原数据库“XXX”时失败。System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份。
标题: Microsoft SQL Server Management Studio------------------------------ 还原数据库“GoldBellXZDepot”时失败. ...
- 关于MySQL的commit非规律性失败案例的深入分析
案例描述: 一个普通的事务提交,在应用里面会提示commit超时,失败. 一.理论知识 1.关于commit原理,事务提交过程 1.寻找修改的数据页: 1.如果该数据页在内存中,则直接是内存读: 2. ...
- pgsql 递归查询 分页
--向下查询 WITH RECURSIVE res AS ( union ALL SELECT t_tree.* FROM t_tree, res WHERE t_tree.pid = res.id ...
- JQuery学习笔记——基础选择器
第一篇博客,现在原生安卓需求不大了.招聘的Android工程师都需要附带更多的其他技术.这也是开启我学习前端之路的开端.前端时间看了HTML.CSS等,在界面渲染这一块,就不多记录博客了.现在学习着J ...
- Java--反射的逐步理解
层层引入反射的作用 一.类类型的概念:所有类都是对象,是Class类的实例对象,这个对象我们成为该类的类类型 1.下面是一个小的test,以产生3种方式的类类型: public class test ...
- HTLM5新增属性
1.<meta http-equiv="Pragma" content="no-cache"/> //禁止页面缓存 2.<script def ...
- Window下Jenkins的安装
之前没接触过持续集成工具,之前只是了解了下自动化部署,最近一直在看自动化集成这块,发现要学的东西好多好多,可能在小公司用的不多,但如果在大公司,如果每个项目都要手动build.deploy的话那也太耗 ...
- c# 多线程 创建对象实例
本次的标题是我在写单例模式的博客时遇到的问题,所以今天专门写了的demo让自己记住怎么简单的使用多线程. 一直纠结的是怎么在for循环中多次实例化对象,好复现单例模式在没有加锁的情况下出现多个实例对象 ...