rtsp client c++

news/2024/7/8 9:15:43 标签: h.265, h.264, rtsp

直接上代码:源码

void doRtspParse(char *b) {
    std::vector<std::string> res;
    char *ptr = b, *ptr1 = nullptr;
    while ((ptr1 = strstr(ptr, "\r\n"))) {
      res.push_back(std::string(ptr, ptr1 - ptr));
      ptr = ptr1 + 2;
    }
    int len = ptr - b;
    b[len - 1] = '\0';
    Debug("%d read --> \n%s", len, b);
    switch (cmd_) {
    case OPTIONS: {
      auto it = std::find_if(res.begin(), res.end(), [&](std::string &s) {
        return s.find("WWW-Authenticate") != std::string::npos;
      });
      if (it == res.end()) {
        doWriteCmd(DESCRIBE, seq_++, url_.GetAuth("DESCRIBE").c_str());
      } else {
        url_.SetAuth(it->c_str());
        doWriteCmd(OPTIONS, seq_++, url_.GetAuth("OPTIONS").c_str());
      }
      break;
    };
    case DESCRIBE: {
      sdp_.Parse(res);
      this->decode_ = Unmarshal264;
      if (sdp_.medias[0].rtpmap.find("H265") != std::string::npos) {
        this->decode_ = Unmarshal265;
      }
      doWriteCmd(SETUP, sdp_.medias[0].id.c_str(), seq_++, sdp_.session.c_str(),
                 url_.GetAuth("SETUP").c_str());
      if (atype_ == 0xff) {
        cmd_ = SETAUDIO;
      }
      break;
    };
    case SETUP:
      doWriteCmd(PLAY, seq_++, sdp_.session.c_str(),
                 url_.GetAuth("PLAY").c_str());
      break;
    case SETAUDIO: {
      auto it = std::find_if(sdp_.medias.begin(), sdp_.medias.end(),
                             [](sdp::media &m) {
                               return m.id.find("audio") != std::string::npos;
                             });
      if (it == sdp_.medias.end()) {
        doWriteCmd(PLAY, seq_++, sdp_.session.c_str(),
                   url_.GetAuth("PLAY").c_str());
      } else {
        atype_ = it->format;
        doWriteCmd(SETUP, it->id.c_str(), seq_++, sdp_.session.c_str(),
                   url_.GetAuth("SETUP").c_str());
      }
    } break;
    default:
      rbuf_.Remove(len);
      return;
    }
    rbuf_.Reset(0);
  }

http://www.niftyadmin.cn/n/5536999.html

相关文章

无人机测绘需要注意什么?

无人机测绘是一项高精度的测量工作&#xff0c;需要注意以下四点&#xff1a; 一、作业前准备&#xff1a;沟通相关事宜&#xff0c;现场勘查&#xff0c;飞行环境检查等&#xff1b; 二、航线规划与像控点布设&#xff1a;航线规划是任务规划的核心内容&#xff0c;需要综合…

【报错】【Ubuntu】/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34‘ not found

1 报错 /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34 not found 2 分析 系统中的GNU C Library(glibc)版本不满足要求。 具体来说,该程序或库需要使用2.34版本的glibc,但系统中当前的glibc版本不满足这个要求。 首先,查看版本: strings /lib/x86_64-linux…

用Docker搭建分布式 Redis 的方法

使用 Docker 搭建一个分布式的 Redis 集群可以帮助你快速部署和管理多个 Redis 实例。一个典型的 Redis 集群包括多个主从节点&#xff0c;通过分片来实现数据的分布式存储与高可用性。 以下是使用 Docker 搭建分布式 Redis 集群的详细步骤&#xff1a; 前提条件 安装 Docke…

使用PowerShell开启防火墙端口

使用PowerShell开启防火墙端口 引言 防火墙是网络安全的重要组成部分&#xff0c;它通过控制进出网络的流量来保护计算机和网络免受未经授权的访问。有时候&#xff0c;我们需要打开特定的防火墙端口以允许特定应用程序或服务的通信。本文将详细讲解如何使用 PowerShell 开启…

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

python实现API调用缓存

python实现API调用缓存 1.代码2.输出3.保存的json数据 想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据 1.代码 import jsondef get_variable_name(var):变量转变量名local_varsglobals()return [name for name, value in local_vars.ite…

eclipse基础工程配置( tomcat配置JRE环境)

文章目录 I eclipse1.1 工程配置1.2 编译工程1.3 添加 JRE for the project build pathII tomcat配置JRE环境2.1 Eclipse编辑tomcat运行环境(Mac版本)2.2 Eclipse编辑tomcat运行环境(windows版本)2.3 通过tomcat7W.exe配置运行环境(windows系统)I eclipse 1.1 工程配置 …

OpenGL的学习之路

Qt如何创建OpenGL的渲染窗口&#xff1f; 类比GLFW库&#xff0c;Qt提供了OpenGL的渲染窗口类QOpenGLWidget&#xff1a; 1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。 2、重写paintGL()来绘制3D场景&#xff0c;只调用OpenGL函数。 3、还可以…