一个基于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 ...
随机推荐
- c++调用python系列(1): 结构体作为入参及返回结构体
最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...
- Java8学习(3)- Lambda 表达式
猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...
- python web开发之django
上一篇介绍了python-web.py的开发,本节课我们详细说明django的开发与使用. 简介及可以学习到的内容: 1.Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表 ...
- thinkphp 5 前台格式化输出日期
thinkphp格式化输出 {$time|strtotime|date="Y年m月d日",###} $time 是日期字符串,一般后台的时间是"Y-m-d h:i:s ...
- [node] node 版本更新
一. 命令 node -v sudo npm cache clean -f // 清除缓存 sudo npm install -g n // 安装Node 模块 sudo n stable // 升级 ...
- html超级简单实现点赞(收藏)和取消赞效果
1.前言 我们经常会遇到对一些列表呀进行点赞呀收藏数据等效果呀.今天就用html+css实现超级简单易上手的点赞和取消赞的demo展示. 2.详情 1.css样式 .like{ font-size:6 ...
- Jquery-全选和取消的一个坑
在做一个商城的购物车的时候遇到了一个坑, 购物车一般都有全选按钮, 再次点击就会全部消除, 在网上查到的答案全部都是使用attr来做的, 无一例外都不能用, 之后才知道要使用jquery的prop和r ...
- zookeeper-3.4.5安装&3台机器安装之后 ./zkServer.sh status 之后会显示“Error contacting service. It is probably not running.”的解决办法
安装文件上传工具:yum install lrzsz成功安装后有如下的提示:Complete![root@server01 apps]# yum install lrzszLoaded plugins ...
- InputStreamReader读取文件出现乱码
当你读取一个文本文件时,如果是在电脑记事本上面写的,然后保存.使用InputStreamReader读取出来,并且是按照他的编码格式读取出来,发现还是存在乱码,比如文本内容是“你好”,读出来显示是“? ...
- trie从入门到入殓
trie是什么?1. 字典树 2.集合 (其实两个都对啊喂) 一颗普通的trie树一般类似于这样(图片来源于http://dongxicheng.org/structure/trietree/): 绿 ...