当前位置: 首页 > news >正文

音视频学习(十九)——rtsp收流(tcp方式)

前言

本文主要介绍以tcp方式实现rtsp拉流。

流程图

在这里插入图片描述

流程说明:

  1. 客户端发起tcp请求,如向真实相机设备请求,端口一般默认554;
  2. tcp连接成功,客户端与服务端开始rtsp信令交互;
  3. 客户端收到play命令响应后,开启线程等待接收数据,同时开启定时器,定时向服务端发送命令用于心跳保活
  4. 服务端向客户端发送音视频数据;
  5. 客户端接收rtp数据并进行解复用;

设计

  • 发送tcp请求
    • 创建socket
    • connect
    • 设置非阻塞
    • 设置tcp超时时间
// 建立tcp连接
m_tcpClient = std::make_shared<TcpClient>(nullptr, this);
if (!m_tcpClient.get()|| 0 != m_tcpClient->TcpCreate()|| 0 != m_tcpClient->TcpConnectByTime(ip.c_str(), port, 5)|| 0 != m_tcpClient->TcpSetNoBlock(true)|| 0 != m_tcpClient->TcpRecvTimeout(10))break;
  • rtsp信令交互
// 创建command类
m_command = std::make_shared<CRtspCommand>(RTSP_TRANSPORT_RTP_TCP, m_tcpClient, m_func, m_user);
if (!m_command.get())break;// 创建rtsp client
if(!m_command->CreateRtspClient(m_rtspUrl, username, userpasswd))break;// 发送describe
int ret = m_command->SendDescribe();
if (0 != ret)break;
  • 补充:创建rtsp client,发送describe后根据回调进行后续命令操作(使用开源库ireader/librtsp进行rtsp信令交互)
bool CRtspCommand::CreateRtspClient(const std::string& uri, const std::string& username, const std::string& userpasswd)
{if (uri.empty() || username.empty() || userpasswd.empty())return false;rtsp_client_handler_t handler;handler.send = SendCallback;handler.rtpport = RtpPortCallcback;handler.onannounce = AnnounceCallback;handler.ondescribe = DescribeCallback;handler.onsetup = SetupCallback;handler.onplay = PlayCallback;handler.onpause = PauseCallback;handler.onteardown = TeardownCallback;handler.onrtp = RtpDataCallback;m_rtsp = rtsp_client_create(uri.c_str(), username.c_str(), userpasswd.c_str(), &handler, this);if (!m_rtsp)return false;return true;
}
  • 启动线程等待接收数据
#define RECV_DATA_SIZE (64*1024*1024)void CRtsp::RtspWorker()
{std::shared_ptr<char> dataPacket(new char[RECV_DATA_SIZE], std::default_delete<char[]>());memset(dataPacket.get(), 0x00, RECV_DATA_SIZE);int recvLen = 0;while (m_running){recvLen = m_tcpClient->TcpRecv(dataPacket.get(), RECV_DATA_SIZE);if (recvLen <= 0)       // 数据接收失败{break;}if (0 != m_command->InputData(dataPacket.get(), recvLen)){break;}memset(dataPacket.get(), 0x00, STREAM_DATA_SIZE);}
}
  • 启动定时器进行心跳保活(tcp方式需要
// 创建定时器
m_timer = std::make_shared<ZDTimer>(10, 1000);
m_timer->Start();// 开启定时器
m_timer->AddTask(10000, [this]() {// 10s发送一次get parameter命令int count = rtsp_client_media_count((rtsp_client_t*)m_rtsp);if (count > 0)rtsp_client_get_parameter(m_rtsp, 0, NULL);
});// 停止定时器
if (m_timer.get())
{m_timer->Stop();m_timer.reset();
}
  • 接收视频数据并解复用(使用开源库ireader/librtp库进行rtp数据解复用)
// 1.创建解复用器
m_demuxer = rtp_demuxer_create(100, profile ? profile->frequency : 90000, payload, encoding.c_str(), RtpPacketCallback, this);// 2. 塞数据
rtp_demuxer_input(m_demuxer, data, len);// 3. 数据回调
static int RtpPacketCallback (void* param, const void* packet, int bytes, uint32_t timestamp, int flags)
{// 裸流数据处理
}// 4. 销毁
rtp_demuxer_destroy(&m_demuxer);

效果

在这里插入图片描述

相关文章:

音视频学习(十九)——rtsp收流(tcp方式)

前言 本文主要介绍以tcp方式实现rtsp拉流。 流程图 流程说明: 客户端发起tcp请求&#xff0c;如向真实相机设备请求&#xff0c;端口一般默认554&#xff1b;tcp连接成功&#xff0c;客户端与服务端开始rtsp信令交互&#xff1b;客户端收到play命令响应后&#xff0c;开启线…...

LangChain(0.0.340)官方文档三:Prompts上——自定义提示模板、使用实时特征或少量示例创建提示模板

文章目录 一、 Prompt templates1.1 langchain_core.prompts1.2 PromptTemplate1.2.1 简介1.2.2 ICEL1.2.3 Validate template 1.3 ChatPromptTemplate1.3.1 使用role创建1.3.2 使用MessagePromptTemplate创建1.3.3 自定义MessagePromptTemplate1.3.3.1 自定义消息角色名1.3.3.…...

【算法】合并K个升序链表

这道题主要考察的是归并排序&#xff0c;因为已经升序过了&#xff0c;更好理解了。 当然也可以采用分治的思路&#xff1b;或采用最小堆的思路&#xff1b;面试中校招同学写出一种即可&#xff0c;如果能全概览讲一下&#xff0c;就更加分了。 #############################…...

持续集成交付CICD:GitLab Webhook触发Jenkins流水线

目录 一、实验 1.Jenkins远程下载GiaLab仓库代码 2.curl远程触发Jenkins流水线 3.GitLab Webhook触发Jenkins流水线 二、问题 1.GitLab配置Webhook时报错 一、实验 1.Jenkins远程下载GiaLab仓库代码 (1) Jenkins添加选项参数 (2)添加字符参数 (3)查看构建参数情况 (4)添…...

计算机网络测试题

一 单项选择题(5分) 1、假设要发送的数据为101110&#xff0c;采用CRC的生成多项式是X31&#xff0c;试求应添加在数据后面的余数。&#xff08;5分&#xff09; 110 011&#xff08;答案&#xff09; 101 001 实际得分&#xff1a;5分 二 填空题(95分) 1、以下3个子地址块…...

vscode如何在没有网络的情况下安装插件

vscode如何在没有网络的情况下安装插件 start 遇到没有网络的电脑&#xff0c;无法直接从插件市场安装vscode的插件。写一下 vscode 插件离线安装的方法. 解决方案 目标电脑没有可以安装插件的网络&#xff0c;那我们只能在有网络的环境下载好我们的插件。然后拷贝软件到无…...

自定义类型:结构体、联合、枚举

目录 一、⾃定义类型&#xff1a;结构体 1.结构体类型 1. 1结构体类型的声明 结构体变量的创建和初始化 1.2 结构的特殊声明 1.3 结构的自引用 2. 结构体内存对齐 ①&#xff1a;对齐规则 ②&#xff1a;offsetof函数 ③&#xff1a;为什么存在内存对⻬? ④ 修改默认对⻬…...

HelpLook可以作为wordpress的替代品,帮助企业快速搭建博客

博客作为一个非常有价值的平台&#xff0c;在当今的数字时代具有重要的意义。对于个人和企业来说&#xff0c;选择一款适合自己需求的专业博客搭建软件至关重要。本篇文章将会通过对比两个专业的博客搭建软件——HelpLook和WordPress&#xff0c;看看为什么我说HelpLook可以作为…...

单片机实现数码管动态显示

动态显示的特点是将所有位数码管的段选线并联在一起&#xff0c;由位选线控制是哪一位数码管有效。这样一来&#xff0c;就没有必要每一位数码管配一个锁存器&#xff0c;从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码…...

jbrowse基因组浏览器部署

一、jbrowse部署 1.1 jbrowse部署 sudo mkdir /var/www/jbrowse; sudo chown whoami /var/www/jbrowse; # cd into it cd /var/www/jbrowse;1.2 nginx配置 server {listen 80 default_server;listen [::]:80 default_server;server_name _;#root /var/w…...

神经网络 模型表示(一)

神经网络 模型表示 模型表示一 为了构建神经网络模型&#xff0c;我们需要首先思考大脑中的神经网络是怎样的&#xff1f;每一个神经元都可以被认为是一个处理单元/神经核&#xff08;processing unit/Nucleus&#xff09;&#xff0c;它含有许多输入/树突&#xff08;input/…...

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…...

【matlab程序】画海洋流场

【matlab程序】画海洋流场 clear;clc; file ( ‘0227.nc’); latncread(file,‘latitude’); lonncread(file,‘longitude’); uncread(file,‘water_u’); vncread(file,‘water_v’); [x,y]meshgrid(lon,lat); xx’; yy’; interval4; figure (1) set(gcf,‘color’,[1 1 1…...

线性表 力扣67. 二进制求和

题目 67. 二进制求和 翻译 主要思路 核心思路是像竖式计算一样&#xff0c;不过需要将字符串a和b反转后逐位进行二进制计算得到字符串c&#xff0c;最后再将c反转就是答案 逐位计算的时候利用count&#xff0c;在将a和b当前位置数字相加后通过模2来决定字符串c对应位置的数…...

2312skia,13画布包入门

画矶包快速入门 CanvasKit是用比canvasAPI更高级功能集的Skia来绘画元素到canvas中的wasm模块. 最小应用 此例是个最小Canvaskit应用,它为一帧绘画一个圆角矩形.从unpkg.com中提取wasm二进制文件,但你也可自己构建和管理它. <canvas idfoo width300 height300></c…...

【网络安全技术】消息认证技术

一、哈希函数 1.安全性质 1&#xff09;抗第一原像攻击&#xff08;Preimage Resistance&#xff09; 给定哈希后的值&#xff0c;很难找到哈希前的原消息。这很好理解&#xff0c;需要哈希函数具有单向性。 一个简单的例子就是密码存储系统&#xff0c;用户登录服务器需要…...

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…...

接口测试基础知识

一、接口测试简介 什么是接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试&#xff0c;主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点&#xff1a; 检查数据的交换&#xff0c;传递和控制管理过程&#xff1b;检查系统间的相互…...

C++多线程之通过成员函数作为线程入口

说明&#xff1a; 通过类里面的函数作为线程入口&#xff0c;我个人难理解的地方在于给线程传递参数的时候&#xff0c;怎么找到Main函数。后面会做分析。 首先创建类&#xff1a;创建MyThread类&#xff0c;其中公有函数Main作为入口。这个类的传教比较简单&#xff0c;成员…...

word、excel文件转PDF(documents4j方式,简单)

1 documents4j方式 引入pom <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.1.12</version></dependency><dependency><groupId>com.documents4j</g…...

Navicat Mac终极重置指南:3种简单方法快速恢复试用期

Navicat Mac终极重置指南&#xff1a;3种简单方法快速恢复试用期 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你是否正在使…...

集装箱箱号与ISO代码区域检测数据集VOC+YOLO格式887张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数)&#xff1a;887标注数量(xml文件个数)&#xff1a;887标注数量(txt文件个数)&#xff1a;887标注类别数&…...

3分钟搞定Steam游戏清单!Onekey工具让游戏文件管理变得如此简单

3分钟搞定Steam游戏清单&#xff01;Onekey工具让游戏文件管理变得如此简单 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏文件管理而烦恼吗&#xff1f;想要备份游戏清单…...

Suno.cn从工具到生态,AI音乐平台的崛起、挑战与本土化之路

2026年,Suno已从一款“文字生成音乐”的玩具,成长为估值25亿美元、年营收超3亿美元的全球AI音乐巨头。然而,在版权风暴与本土化浪潮中,它的故事远未结束。 🚀 一、市场地位与商业成功:Suno的狂飙突进 Suno在2026年的增长堪称现象级。其首席执行官Mikey Shulman宣布,平…...

Kimera-VIO实战评估:Euroc数据集上的精度分析与性能测试

Kimera-VIO实战评估&#xff1a;Euroc数据集上的精度分析与性能测试 【免费下载链接】Kimera-VIO Visual Inertial Odometry with SLAM capabilities and 3D Mesh generation. 项目地址: https://gitcode.com/gh_mirrors/ki/Kimera-VIO 想要了解开源视觉惯性里程计系统在…...

告别协议地狱!用HTTP服务搞定Fanuc、西门子等主流数控机床数据采集(Java开发者福音)

工业4.0时代&#xff1a;Java开发者如何用HTTP服务打通数控机床数据孤岛 在智能制造浪潮席卷全球的今天&#xff0c;MES/ERP系统与生产设备的无缝对接已成为数字化工厂的标配需求。然而&#xff0c;当Java开发者面对Fanuc、西门子等数控系统封闭的协议生态时&#xff0c;往往会…...

【2024全球重大社会事件回溯实证】:Perplexity搜索结果偏差率对比测试(含Reuters、AP、路透中文网基准数据)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;【2024全球重大社会事件回溯实证】&#xff1a;Perplexity搜索结果偏差率对比测试&#xff08;含Reuters、AP、路透中文网基准数据&#xff09; 为量化AI驱动型搜索引擎在重大社会事件报道中的信息保真度&…...

[特殊字符] 告别类名地狱!Tailwind CSS 语义化转换神器来了

痛点作为一名前端开发者&#xff0c;你是否早已受够了这些折磨&#xff1f;&#x1f62b; 代码可读性灾难 打开 HTML 文件&#xff0c;映入眼帘的是长达数十个类名的"怪物"&#xff1a;<div class"flex flex-col items-center justify-center bg-gray-100 ro…...

多目摄像头时间同步实战:用FSYNC信号搞定树莓派+双OV5640的同步曝光

多目摄像头时间同步实战&#xff1a;用FSYNC信号搞定树莓派双OV5640的同步曝光 在机器人视觉和立体成像项目中&#xff0c;双摄像头同步采集图像是许多应用的基础需求。无论是构建双目视觉系统、全景拼接还是运动分析&#xff0c;毫秒级的时间差都可能导致算法失效。我曾在一个…...

保姆级教程:用PlatformIO给ESP32刷Marlin固件,搞定WiFi配置和Web界面

从零构建3D打印机无线中枢&#xff1a;ESP32刷写Marlin固件全流程解析 当你的3D打印机突然摆脱数据线的束缚&#xff0c;通过手机就能随时监控打印进度、调整参数时&#xff0c;那种科技带来的愉悦感会瞬间抵消所有配置过程的艰辛。本文将带你用ESP32开发板打造专属无线控制模块…...