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

rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)

1、 rtsp 工具

1 vlc
必备工具
2 wireshark
必备工具
3 自己制作的工具
player 使用tcp 拉流,不自己写的话,使用ffmpeg 去写一个播放器就行
4 live555
编译好live555, 将live555的参数修改以下,主要是缓存大小

文章使用c++ 来写一个server,目的主要是为了gb28181 接收ps流, 主动拉rtsp 流,经过AI 算法以后 ,再将AI 结果 转成wsflv 和 rtsp 流。为了对比live555的过程,编译live555,本身live是一个非常好的服务端和客户端,测试非常方便。这里AI 使用libtorch。整个协议都使用原始的代码编写,最重要的是要支持投屏协议,可以将结果直接投送到大屏上,包含的协议比较多,综合比较强,因此准备使用多篇文章分开来写。

解码依然使用ffmpeg来解码,尽量使用ffmpeg的硬解码, 如果有可能,尽量使用vulkan。

最后生成rtsp server 只支撑tcp 协议,因为有可能要穿到外网部署。同时支持分布式推送ps流。各位读者不要觉得复杂,这个是真的需求。

2、rtsp 抓包

如下,黑体加粗的是客户端,紧接着的是服务端。

OPTIONS rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)

RTSP/1.0 401 Unauthorized
CSeq: 2
WWW-Authenticate: Digest realm=“Login to 6FEF45758F9C6A42”,nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”

OPTIONS rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0 RTSP/1.0
CSeq: 3
Authorization: Digest username=“admin”, realm=“Login to 6FEF45758F9C6A42”, nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”, uri=“rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0”, response=“3e64ebc6b330912aa130ed02dc7fb46b”
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)

RTSP/1.0 200 OK
CSeq: 3
Public: OPTIONS, DESCRIBE, ANNOUNCE, SETUP, PLAY, PAUSE, TEARDOWN, GET_PARAMETER, SET_PARAMETER, REDIRECT, RECORD
Server: Rtsp Server/3.0

DESCRIBE rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0 RTSP/1.0
CSeq: 4
Authorization: Digest username=“admin”, realm=“Login to 6FEF45758F9C6A42”, nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”, uri=“rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0”, response=“83a27a943b70d6094e8f27612f2fc026”
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

RTSP/1.0 200 OK
CSeq: 4
Content-Base: rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/
Content-Type: application/sdp
x-Accept-Dynamic-Rate: 1
Cache-Control: must-revalidate
Content-Length: 477

v=0
o=- 2229913047 2229913047 IN IP4 0.0.0.0
s=Media Server
c=IN IP4 0.0.0.0
t=0 0
a=control:*
a=packetization-supported:DH
a=rtppayload-supported:DH
a=range:npt=now-
m=video 0 RTP/AVP 96
a=control:trackID=0
a=framerate:25.000000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D0029;sprop-parameter-sets=Z00AKZY1QPAET8s3BQEFQAAAAwBAAAAMoQA=,aO4xsgA=
a=recvonly
m=audio 0 RTP/AVP 8
a=control:trackID=1
a=rtpmap:8 PCMA/8000
a=recvonly

SETUP rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/trackID=0 RTSP/1.0
CSeq: 5
Authorization: Digest username=“admin”, realm=“Login to 6FEF45758F9C6A42”, nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”, uri=“rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/”, response=“0eae62d04ad69162488d27765b8c0078”
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=60860-60861

RTSP/1.0 200 OK
CSeq: 5
Session: 2667172900
Transport: RTP/AVP;unicast;client_port=60860-60861;server_port=2000-2001;ssrc=8c70b4ab
x-Dynamic-Rate: 1

SETUP rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/trackID=1 RTSP/1.0
CSeq: 6
Authorization: Digest username=“admin”, realm=“Login to 6FEF45758F9C6A42”, nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”, uri=“rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/”, response=“0eae62d04ad69162488d27765b8c0078”
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=60862-60863
Session: 2667172900

RTSP/1.0 200 OK
CSeq: 6
Session: 2667172900
Transport: RTP/AVP;unicast;client_port=60862-60863;server_port=2002-2003;ssrc=99bb5969
x-Dynamic-Rate: 1

PLAY rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/ RTSP/1.0
CSeq: 7
Authorization: Digest username=“admin”, realm=“Login to 6FEF45758F9C6A42”, nonce=“fa305e83-5897-4eaa-a787-1395d12bac9b”, uri=“rtsp://192.168.0.108:554/cam/realmonitor?channel=1&subtype=0/”, response=“ea485ad09bc4e5cd23ae7bfdbd1dccd8”
User-Agent: LibVLC/3.0.18 (LIVE555 Streaming Media v2016.11.28)
Session: 2667172900
Range: npt=0.000-

RTSP/1.0 200 OK
CSeq: 7
Session: 2667172900
Range: npt=0.000-
RTP-Info: url=trackID=0;seq=1;rtptime=0,url=trackID=1;seq=1;rtptime=0

整个交互过程确实一目了然,rtsp 协议是非常简单明了,

3、使用vlc 拉流

注意点:
使用vlc时要注意一点,就是拉流如果是用tcp方式,把vlc里面设置以下,打开的速度会很快,不然他会尝试udp方式,最后才打开tcp,会使用很长时间
在这里插入图片描述
可以从界面上看到实际上vlc使用的是live555 来制作的rtsp client。

输入输出的时间戳问题

接收到的流分为两种,一种是ps流,一种是rtsp流,对于ps流,我们需要首先要建立RTPserver 解析,然后将ps 转成标准的RTP协议。
标准的RTP协议的时间戳以90000为基,而wsflv流也就是websocket流必须以普通的时间戳为准,因此,里面需要转换时间戳。

GB28181 收流后接收到的时间戳直接给RTP,也就是RTSP 协议里直接可以使用,因为ps流的时间戳是以90000为基的,而转到websocket flv 流,必须变成正常的时间,公式应该是

1/90000 * pts * 1000, 比如 4500 的RTP时间戳,对应的时间应该为 ,4500* 1000 / 90000 = 50,
4500 这个数值我们如果敏感的话,其实就是一秒钟为20帧, 也就是 时间戳为 0 50 100 150,而对应的RTP 时间戳为 0 4500 9000 13500 …

接收ps流

暂时先做一个ps server over udp, 先不做tcp ,这样容易出成果

void PsServer(int listenPort)
{int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if(sock_fd == -1){printf("Socket init error\n");exit(-1);}struct sockaddr_in addr_s;  memset(&addr_s, 0, sizeof(addr_s));addr_s.sin_family = AF_INET;addr_s.sin_port = htons(listenPort);addr_s.sin_addr.s_addr = htonl(INADDR_ANY);/* 绑定socket */  if(bind(sock_fd, (struct sockaddr *)&addr_s, sizeof(addr_s)) < 0)  {  perror("bind error:");  exit(1);  }  char ipbuf[20];int n, len;char recv_buf[MAX_BUFF_SIZE];  struct sockaddr_in addr_c;memset(&addr_c, 0, sizeof(addr_c));while(1)  {  n = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&addr_c, (socklen_t *)&len);  if(n < 0)  {perror("recvfrom error:");  exit(1);  }// bzero(&ipbuf,sizeof(ipbuf));// inet_ntop(AF_INET,&addr_c.sin_addr.s_addr,ipbuf,sizeof(ipbuf));if(n > 12){uint32_t ssrc;memcpy((uint8_t*)&ssrc, (uint8_t*)recv_buf + 8, 4);ssrc = htonl(ssrc);RtpSource* rtp = getRtpSource(ssrc);memcpy(rtp->data, (uint8_t*)recv_buf, n);rtp->len = n;m_rtpFactory.parserRtpData(rtp);}}
}

收到流以后要解封包ps,变成es 流,然后 解码,使用libtorch 做AI 识别,最后将画面编码,成es 流,再交给rtsp server,我们一点点来,先讲一下解码后用torch 识别,下一次讲如何解封包ps流

拉取流后解码调用

#include <iostream>
#include "torch/script.h"
#include "torch/torch.h"
using namespace std;int main() {//加载pytorch模型torch::jit::script::Module module = torch::jit::load("./model.pt");//注意检查路径//是否支持GPU加速if(!torch::cuda::is_available())exit(0);torch::DeviceType device_type; //设置Device类型device_type = torch::kCUDA;  //torch::kCUDA  and torch::kCPUtorch::Device device(device_type, 0);//模型转到GPU中去module.to(device);// Create a vector of inputs.std::vector<torch::jit::IValue> inputs;inputs.push_back(torch::ones({1, 3, 46, 224}).to(device));// Execute the model and turn its output into a tensor.for (int i = 0; i < 100; i++) {at::Tensor output = module.forward(inputs).toTensor();std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n';}
}

下一节继续

相关文章:

rtsp 拉流 gb28181 收流 经AI 算法 再生成 rtsp server (一)

1、 rtsp 工具 1 vlc 必备工具 2 wireshark 必备工具 3 自己制作的工具 player 使用tcp 拉流&#xff0c;不自己写的话&#xff0c;使用ffmpeg 去写一个播放器就行 4 live555 编译好live555&#xff0c; 将live555的参数修改以下&#xff0c;主要是缓存大小 文章使用c 来写一…...

Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

环境部署 官网下载Jmeter http://jmeter.apache.org/下载最新版本的 JMeter&#xff0c;解压文件到任意目录 安装JDK&#xff0c;配置Java环境 1、下载&#xff08;注意选择操作系统对应的位数32/64&#xff09; 官网 &#xff1a;http://www.oracle.com 2、安装&#xff0…...

更换 yum 阿里源 - 手把手教你怎么配置,在也不需要求别人了 - 看懂一个就相当于看懂了其他的linux系统

更换阿里源 我的是centos8 当然 centos7 也可以换 后面有更详细的怎么配 &#xff0c;再也不用求别人怎么弄了 最直接的方式 直接复制 执行 centos7 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo或者 wget -O /etc/yum.repos.…...

966SEO扫地僧站群·万能HTML模板[V1.9.1]

扫地僧站群万能HTML模板是一款站点管理软件,其主要特点是可以将原始的html模板放入程序中,无需编写任何标签,程序会全自动替换处理,从而快速构建出一个完整的网站,这种模式相对于传统的网站建设方式更加快速、简单,同时可以大幅度降低网站建设的成本和难度.服务器及域名量的配置…...

angular:html2canvas对ion-avatar节点渲染不正确

问题&#xff1a; 如题 解决办法&#xff1a; 简单实现头像遮罩 <div class"ion-avatar" style"width: 40px; height: 40px; border-radius: 50%; overflow: hidden"><img src"" alt""/> </div><style>.ion-…...

使用dockerfile文件部署Python+PyWebIO项目

1、安装docker 教程详见之前的内容。https://blog.csdn.net/weixin_44691253/category_12101661.html 2、打包好Python项目 之前的文章中有提到我编写测试工具使用的框架&#xff1a;PythonRequestsPyWebIO框架详解&#xff0c;编写测试工具提高团队测试效率 打包项目时&am…...

【web开发】5.Mysql及python代码执行数据库操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、MYSQL二、MySQL管理查看已有数据库创建数据库删除数据库进入数据库创建表删除表展示表的行列插入数据查看表中的数据删除数据修改数据 三、python代码执行数据库…...

Android学习之路(13) Handler详解

1. 简介 Handler是一套 Android 消息传递机制,主要用于线程间通信。 用最简单的话描述&#xff1a; handler其实就是主线程在起了一个子线程&#xff0c;子线程运行并生成Message&#xff0c;Looper获取message并传递给Handler&#xff0c;Handler逐个获取子线程中的Message.…...

介绍一些开发用到的工具

Sourcetree &#xff1a;Git 界面操作工具&#xff0c;真心好用 uTool&#xff1a;效率工具平台&#xff0c;可以了解一下&#xff0c;提供了很多强大的工具&#xff0c;加强了对电脑的操作 MobaXterm&#xff1a;带有 X11 服务器、选项卡式 SSH 客户端、网络工具等的增强型 Wi…...

【笔试真题记录】2023滴滴编程第二题

题目&#xff1a; 现在有n个由大写英文字符组成的字符串&#xff0c;且这些字符串不会互相包含&#xff0c;也不会相等。现在想知道有哪些字符串满足如下条件。设满足条件的字符串为S&#xff0c;存在其他的两个字符串拼接在一起后&#xff0c;能通过去除一个非空前缀和一个非空…...

中国ui设计师年终工作总结

一、萌芽阶段 记得初次应聘时&#xff0c;我对公司的认识仅仅局限于行业之一&#xff0c;对UI设计师一职的认识也局限于从事相对单纯的界面的设计创意和美术执行工作。除此之外&#xff0c;便一无所知了。所以&#xff0c;试用期中如何去认识、了解并熟悉自己所从事的行业&…...

CSS 滚动驱动动画 scroll()

CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll progress timeline. 并且元素滚动的位置会被转换为百分比, 滚动开始被转化为…...

基于Java+SpringBoot+Vue前后端分离在线考试系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

nvm管理多个版本的nodejs

1. 已经安装过nodejs在安装nvm的步骤 1.安装nvmhttps://github.com/coreybutler/nvm-windows/releases 2.nvm安装位置 2.nvm管理的nodejs安装位置 4.最终的安装结构 备注&#xff1a;nodejs安装 2.使用nvm安装管理nodejs 2.1配置下载镜像&#xff1a; 找到nvm安装路径…...

LeetCode 1658. 将 x 减到 0 的最小操作数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 有种说法叫做&#xff0c;正难则反。我们直接去按照题目意思去求很难去理解与操作&#xff0c;但是我们换种思想就会简单许多。我们让整个数组的和减去x得到一个target&#xff0c…...

Rasa 3.1 机器学习一构建标准的对话

1、控制请求(domain.yml) version: "3.1"intents:- hellosession_config:session_expiration_time: 60carry_over_slots_to_new_session: true2、规则制定(rules.yml) version: "3.1" rules:- rule: havebsteps:- intent: hello- action: utter_hello3、…...

MySQL的概述、版本、安装过程

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、MySQL的概述 二、MySQL的版本 三、MySQL的下载与安装 前言 本文将来谈谈MySQL的概述&#xff0c;MySQL的版本&#xff0c;以及它…...

leetcode:58. 最后一个单词的长度

题目&#xff1a; 函数原型&#xff1a; int lengthOfLastWord(char * s) 解析&#xff1a; 求最后一个单词的长度&#xff0c;我们有两种思路 第一种思路&#xff1a; 逆向求&#xff0c;先设置一个字符串下标index&#xff0c;定位到最后一个单词的最后一个字符。再一个设置长…...

Electron 两个线程

Electron&#xff1a;它允许使用最初为Web应用程序开发的前端和后端组件开发桌面GUI应用程序&#xff1a;后端的Node.js运行时和前端的Chromium。 每个Electron应用都有两个线程&#xff1a;一个是主线程&#xff08;处理应用窗口和启动&#xff09;&#xff0c;另一个是渲染线…...

基于YOLOv8和WiderFace数据集的人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8和WiderFace数据集的人脸目标检测系统可用于日常生活中检测与定位人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...