--------------------更新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代码解析...相关推荐

  1. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式...

    一.MPEG RTP音频传输 相较H264的RTP传输格式,MPEGE音频传输格式则简单许多. 每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550) "MBZ& ...

  2. LIVE555中RTSP客户端接收媒体流分析及测试代码

    LIVE555中testProgs目录下的testRTSPClient.cpp代码用于测试接收RTSP URL指定的媒体流,向服务器端发送的命令包括:DESCRIBE.SETUP.PLAY.TERAD ...

  3. java安卓怎么开发一个新闻app,一个基于Android系统的新闻客户端(一)

    一个基于Android系统的新闻客户端(一) 一.整体概述 在服务器端,通过对凤凰网的抓取存入数据库,客户端通过向服务器发送请求得到新闻. 服务端用WCF,宿主为window服务,客户端为Java写的 ...

  4. 最简单的基于FFMPEG的推流器附件:收流器

    ===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...

  5. 基于Vue3实现扫码枪扫码并生成二维码的代码解析

    基于Vue3实现扫码枪扫码并生成二维码的代码解析 在本文中,我们将介绍如何使用Vue3实现扫码枪扫描条形码或二维码,并将其转换为二维码的过程.这个过程将涉及到以下步骤: 在Vue3项目中安装和导入vu ...

  6. 从0开始写一个基于Flutter的开源中国客户端(5)——App整体布局框架搭建

    上一篇中我记录了Flutter中常用的一些布局,本篇开始开发基于Flutter的开源中国客户端了.在本篇博客中,要实现的是一个App的整体框架,包括页面底部的Tab导航菜单.页面的侧滑菜单以及跳转到新 ...

  7. 一个基于 Transformer 的深度学习架构,在基因调控中组蛋白代码的定量破译方面性能超群...

    编辑 | 萝卜皮 通过组蛋白修饰对转录控制的定量表征受到许多计算研究的挑战,但其中大多数只关注启动子周围的狭窄和线性基因组区域,留下了改进的空间. 韩国首尔大学的研究人员提出了 Chromoforme ...

  8. 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码

    1 简介 近年来,我国高等级公路发展迅速,截止到2012年底,我国高速公路的通车里程已达到97355公里,比2011年增长14.6%.而我国自1984年以来实行"贷款修路.收费还贷" ...

  9. 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

    最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="kang@server.com" t ...

最新文章

  1. 回击质疑 HP StoreOnce用高性能说话
  2. mysql autocommit 脚本_mysql autocommit的差异
  3. Request转发---应用
  4. $.each()、$.map()区别浅谈
  5. 电子计算机和多媒体教材分析,人教新课标:电子计算机与多媒体教材分析
  6. 生物大分子的计算机模拟就业,生物大分子模拟
  7. Redis集群之主从复制
  8. 简单的控制台五子小游戏棋程序(Java)
  9. 分布科技荣登海南省实施区块链应用示范揭榜工程名单
  10. 网站优化JS css压缩
  11. vmware虚拟机安装CentOS8提示错误:section %package does not end with %end(可用)
  12. 通过自研数据库画像工具支持“去O”数据库评估
  13. 【蓝牙】设备管理器找不到蓝牙
  14. Eclipse的环境设置
  15. Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
  16. usb转rs485 linux驱动下载,USB转485万能驱动下载
  17. Verilog实现按键消抖
  18. 国内外贵金属白银有何区别?
  19. sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.GB18030)
  20. 汇编中的OFFSET(OFFSET为属性操作符,表示应该把其后跟着的符号地址的值(不是内容)作为操作数)

热门文章

  1. 文件流——Excel文件数据读写
  2. Flex 给PopUpButton 设置皮肤
  3. ICCV2021- 牛津大学新的预训练视频文本数据集WebVid-2M,设计用于端到端检索的联合视频和图像编码器!代码已开源!...
  4. ECCV 2020 论文大盘点-视频目标检测篇
  5. 仅有 100k 参数的高效显著性目标检测方法
  6. 图像超分辨率也能改善天气预报?没错!
  7. 图像修复效果惊艳,一行命令就能实现!
  8. 腾讯 PCG 招计算机视觉实习生!52CV关注者可加速面试进程
  9. KDD2018 阿里巴巴论文揭示自家大规模视觉搜索算法
  10. java与微信小程序通讯_java与微信小程序实现websocket长连接