当前位置: 首页 > 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目标检测算…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...