一个基于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代码注释
1 #include <iostream> 2 #include "rtspClient.h" 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys/stat.h> 6 #include <unistd.h> 7 #include <fcntl.h> 8 9 using std::cout; 10 using std::endl; 11 12 int main(int argc, char *argv[]) 13 { 14 string RtspUri("rtsp://127.0.0.1/ansersion"); 15 // string RtspUri("rtsp://192.168.81.145/ansersion"); 16 RtspClient Client; 17 18 /* Set up rtsp server resource URI */ 19 Client.SetURI(RtspUri); 20 21 /* Send DESCRIBE command to server */ 22 Client.DoDESCRIBE(); 23 24 /* Parse SDP message after sending DESCRIBE command */ 25 Client.ParseSDP(); // 解析RTSP服务端受理DESCRIBE命令后返回的SDP信息 26 27 /* Send SETUP command to set up all 'audio' and 'video' 28 * sessions which SDP refers. */ 29 Client.DoSETUP(); 30 31 printf("start PLAY\n"); 32 printf("SDP: %s\n", Client.GetSDP().c_str()); 33 34 /* Send PLAY command to play only the 35 * 'video' sessions.*/ 36 Client.DoPLAY("video"); 37 38 /* Receive 1000 RTP 'video' packets 39 * note(FIXME): 40 * if there are several 'video' session 41 * refered in SDP, only receive packets of the first 42 * 'video' session, the same as 'audio'.*/ 43 int packet_num = 0; 44 uint8_t buf[65534]; 45 size_t size = 0; 46 47 /* Write h264 video data to file "test_packet_recv.h264" 48 * Then it could be played by ffplay */ 49 int fd = open("test_packet_recv.h264", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IXUSR); 50 if(Client.GetSPSNalu(buf, &size)) { // 解码SDP中关于H264的SPS的数据 51 if(write(fd, buf, size) < 0) { // 将SPS写入文件 52 perror("write"); 53 } 54 } else { 55 printf("SPS error\n"); 56 } 57 58 if(Client.GetPPSNalu(buf, &size)) { // 解码SDP中关于H264的PPS的数据 59 if(write(fd, buf, size) < 0) { // 将PPS写入文件 60 perror("write"); 61 } 62 } else { 63 printf("PPS error\n"); 64 } 65 66 while(++packet_num < 1000) { // 接收1000个H264的数据包(确切的说是1000个NALU) 67 if(!Client.GetMediaData("video", buf, &size)) continue; 68 if(write(fd, buf, size) < 0) { 69 perror("write"); 70 } 71 printf("recv %lu\n", size); 72 } 73 74 printf("start TEARDOWN\n"); 75 /* Send TEARDOWN command to teardown all of the sessions */ 76 Client.DoTEARDOWN(); 77 78 return 0; 79 } 80
三、common_example.cpp和complete_example.cpp
common_example.cpp不同于simple_example.cpp的地方只有开头几行,这些代码是为了可以用参数指定RTSP URI。
1 int main(int argc, char *argv[]) 2 { 3 if(argc != 2) { 4 cout << "Usage: " << argv[0] << " <URL>" << endl; 5 cout << "For example: " << endl; 6 cout << argv[0] << " rtsp://127.0.0.1/ansersion" << endl; 7 return 1; 8 } 9 cout << "Start play " << argv[1] << endl; 10 cout << "Then put video data into test_packet_recv.h264" << endl; 11 string RtspUri(argv[1]); 12 // string RtspUri("rtsp://192.168.81.145/ansersion"); 13 RtspClient Client; 14 15 /* Set up rtsp server resource URI */ 16 Client.SetURI(RtspUri); 17 ...... 18 return 0; 19 }
complete_example.cpp不同于simple_example.cpp的地方,就在于每次发送RTSP命令时, 它都会检查命令发送是否成功,并且检验返回信息是否是“200 OK”。
1 int main(int argc, char * argv[]) 2 { 3 ...... 4 /* Send DESCRIBE command to server */ 5 if(Client.DoDESCRIBE() != RTSP_NO_ERROR) { 6 printf("DoDESCRIBE error\n"); 7 return 0; 8 } 9 printf("%s\n", Client.GetResponse().c_str()); 10 /* Check whether server return '200'(OK) */ 11 if(!Client.IsResponse_200_OK()) { 12 printf("DoDESCRIBE error\n"); 13 return 0; 14 } 15 ...... 16 return 0; 17 }
OK!以上便是myRTSP的基础内容。
上一篇 回目录
转载于:https://www.cnblogs.com/ansersion/p/5081750.html
一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析...相关推荐
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...
一.MPEG RTP音频传输 相较H264的RTP传输格式,MPEGE音频传输格式则简单许多. 每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550) "MBZ& ...
- LIVE555中RTSP客户端接收媒体流分析及测试代码
LIVE555中testProgs目录下的testRTSPClient.cpp代码用于测试接收RTSP URL指定的媒体流,向服务器端发送的命令包括:DESCRIBE.SETUP.PLAY.TERAD ...
- java安卓怎么开发一个新闻app,一个基于Android系统的新闻客户端(一)
一个基于Android系统的新闻客户端(一) 一.整体概述 在服务器端,通过对凤凰网的抓取存入数据库,客户端通过向服务器发送请求得到新闻. 服务端用WCF,宿主为window服务,客户端为Java写的 ...
- 最简单的基于FFMPEG的推流器附件:收流器
===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...
- 基于Vue3实现扫码枪扫码并生成二维码的代码解析
基于Vue3实现扫码枪扫码并生成二维码的代码解析 在本文中,我们将介绍如何使用Vue3实现扫码枪扫描条形码或二维码,并将其转换为二维码的过程.这个过程将涉及到以下步骤: 在Vue3项目中安装和导入vu ...
- 从0开始写一个基于Flutter的开源中国客户端(5)——App整体布局框架搭建
上一篇中我记录了Flutter中常用的一些布局,本篇开始开发基于Flutter的开源中国客户端了.在本篇博客中,要实现的是一个App的整体框架,包括页面底部的Tab导航菜单.页面的侧滑菜单以及跳转到新 ...
- 一个基于 Transformer 的深度学习架构,在基因调控中组蛋白代码的定量破译方面性能超群...
编辑 | 萝卜皮 通过组蛋白修饰对转录控制的定量表征受到许多计算研究的挑战,但其中大多数只关注启动子周围的狭窄和线性基因组区域,留下了改进的空间. 韩国首尔大学的研究人员提出了 Chromoforme ...
- 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码
1 简介 近年来,我国高等级公路发展迅速,截止到2012年底,我国高速公路的通车里程已达到97355公里,比2011年增长14.6%.而我国自1984年以来实行"贷款修路.收费还贷" ...
- 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)
最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="kang@server.com" t ...
最新文章
- 回击质疑 HP StoreOnce用高性能说话
- mysql autocommit 脚本_mysql autocommit的差异
- Request转发---应用
- $.each()、$.map()区别浅谈
- 电子计算机和多媒体教材分析,人教新课标:电子计算机与多媒体教材分析
- 生物大分子的计算机模拟就业,生物大分子模拟
- Redis集群之主从复制
- 简单的控制台五子小游戏棋程序(Java)
- 分布科技荣登海南省实施区块链应用示范揭榜工程名单
- 网站优化JS css压缩
- vmware虚拟机安装CentOS8提示错误:section %package does not end with %end(可用)
- 通过自研数据库画像工具支持“去O”数据库评估
- 【蓝牙】设备管理器找不到蓝牙
- Eclipse的环境设置
- Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
- usb转rs485 linux驱动下载,USB转485万能驱动下载
- Verilog实现按键消抖
- 国内外贵金属白银有何区别?
- sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.GB18030)
- 汇编中的OFFSET(OFFSET为属性操作符,表示应该把其后跟着的符号地址的值(不是内容)作为操作数)
热门文章
- 文件流——Excel文件数据读写
- Flex 给PopUpButton 设置皮肤
- ICCV2021- 牛津大学新的预训练视频文本数据集WebVid-2M,设计用于端到端检索的联合视频和图像编码器!代码已开源!...
- ECCV 2020 论文大盘点-视频目标检测篇
- 仅有 100k 参数的高效显著性目标检测方法
- 图像超分辨率也能改善天气预报?没错!
- 图像修复效果惊艳,一行命令就能实现!
- 腾讯 PCG 招计算机视觉实习生!52CV关注者可加速面试进程
- KDD2018 阿里巴巴论文揭示自家大规模视觉搜索算法
- java与微信小程序通讯_java与微信小程序实现websocket长连接