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';}
}

下一节继续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/115352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++面试题(叁)---操作系统篇

目录 操作系统篇 1 Linux中查看进程运行状态的指令、查看内存使用情况的指令、 tar解压文件的参数。 2 文件权限怎么修改 3 说说常用的Linux命令 4 说说如何以root权限运行某个程序。 5 说说软链接和硬链接的区别。 6 说说静态库和动态库怎么制作及如何使用&#xff0c;区…

界面控件DevExpress WinForms(v23.2)下半年发展路线图

本文主要概述了官方在下半年&#xff08;v23.2&#xff09;中一些与DevExpress WinForms相关的开发计划&#xff0c;重点关注的领域将是可访问性支持和支持.NET 8。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能…

自然语言处理-NLP

目录 自然语言处理-NLP 致命密码&#xff1a;一场关于语言的较量 自然语言处理的发展历程 兴起时期 符号主义时期 连接主义时期 深度学习时期 自然语言处理技术面临的挑战 语言学角度 同义词问题 情感倾向问题 歧义性问题 对话/篇章等长文本处理问题 探索自然语言…

四、高并发内存池整体框架设计

四、高并发内存池整体框架设计 现代很多的开发环境都是多核多线程&#xff0c;在申请内存的场景下&#xff0c;必然存在激烈的锁竞争问题。malloc本身其实已经很优秀&#xff0c;那么我们项目的原型TCmalloc就是在多线程高并发的场景下更胜一筹&#xff0c;所以这次我们实现的…

centos 7的超详细安装教程

打开虚拟机&#xff0c;创建一个新电脑 我们选择经典&#xff0c;然后选择下一步 我们选择稍后安装&#xff0c;我们在后面进行改设备 因为centos系统是linux系统的一个版本&#xff0c;所有我们选择linux&#xff0c;版本选择centos 7 64位&#xff0c;然后就是点击下一步 这一…

HTML <template> 标签

实例 使用 <template> 保留页面加载时隐藏的内容。使用 JavaScript 来显示: <button οnclick="showContent()">显示被隐藏的内容</button><template><h2>Flower</h2><img src="img_white_flower.jpg" width=&q…

2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌&#xff0c;每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌&#xff0c;S随机抽取n张蓝色卡牌&#xff0c;他们进行n回合拼点&#xff0c;每次两人各出一张卡牌&#xff0c;点数大者获…

Word导出创建Adobe PDF其中emf图片公式马赛克化及文字缺失

软件版本 Word 2021 Visio 2019 Adobe Acrobat Pro 2020 问题描述 公式马赛克化&#xff0c;是指在Word中使用MathType编辑的公式&#xff0c;然后在Visio中使用图片(增强型图元文件)形式得到的粘贴对象&#xff0c;效果如下 文字缺失&#xff0c;是指Word导出→创建Adobe P…

源码安装cv_bridge

1. 下载源码 1去github上下载GitHub - ros-perception/vision_opencv&#xff0c;进去后注意选择与自己的ros对应的版本&#xff1a;&#xff08;我的为noetic&#xff09; 如果你直接使用 git clone https://github.com/ros-perception/vision_opencv.git 来拉取的话cmake的…

MySQL 8 数据清洗总结

MySQL 8 数据清洗三要素&#xff1a; 库表拷贝和数据备份数据清洗SQL数据清洗必杀技-存储过程 前提&#xff1a;数据库关联库表初始化和基础数据初始化&#xff1a; -- usc.t_project definitionCREATE TABLE t_project (id varchar(64) NOT NULL COMMENT 主键,tid varchar(…

网络基础之重中之重

目录 IP协议 ​编辑 基本概念&#xff1a; 协议头格式&#xff1a; ​编辑 网段划分 DHCP &#xff1a; CIDR&#xff1a; 特殊的IP地址&#xff1a; IP地址的数量限制&#xff1a; 私有IP和公网IP 路由 路由的过程&#xff1a; 数据链路层 认识以太网&#x…

GAN原理 代码解读

模型架构 代码 数据准备 import os import time import matplotlib.pyplot as plt import numpy as np import torchvision.transforms as transforms from torch.utils.data import DataLoader from torchvision import datasets import torch.nn as nn import torch# 创建文…

I IntelliJ IDEA 2023.2 最新解锁方式,支持java20

在 IntelliJ IDEA 2023.1 中&#xff0c;我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强&#xff0c;从而更快导入 Maven&#xff0c;以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程。 IntelliJ IDEA Ultimate 现在支…

C语言每日一练------------Day(7)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;两个数组的交集     双指针 &#x1f493;博主csdn个人主页&#xf…

【MySQL】存储引擎

1.MySQL体系结构 1). 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地 sock 通信和大多数基于客户端 / 服务端工具实现的类似 于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入 了线程池的概念&#xff0c;为通过认证安全接…

Ubuntu 启动出现grub rescue

​ 一&#xff0c;原因 原因&#xff1a;出现 “grub rescue” 错误通常表示您的计算机无法正常引导到操作系统&#xff0c;而是进入了 GRUB&#xff08;Grand Unified Bootloader&#xff09;紧急模式。这可能是由于引导加载程序配置错误、硬盘驱动器损坏或其他引导问题引起…

js定位到元素底部

文字的一行一行添加的&#xff0c;每次添加要滚动条自动定位到元素底部 <div class"An">//要父元素包裹&#xff0c;父元素设置max-height&#xff0c;overflow啥的<div class"friendly_pW"></div></div>//添加文字时找子元素的高…

Windows右键添加用 IDEA 打开

1.安装IDEA时 安装时会有个选项来添加&#xff0c;如下&#xff1a; 勾选即可 2.修改注册表 安装时未勾选&#xff0c;可以把下面代码中程序路径改为自己的&#xff0c;保存为对应的 idea.reg文件&#xff0c;双击即可 Windows Registry Editor Version 5.00[HKEY_CLASSES…

Screaming Frog SEO Spider,为您的网站提供全方位的优化解决方案

Screaming Frog SEO Spider是一款适用于Mac的软件&#xff0c;它可以帮助用户分析网站的优化信息。该软件可以模拟蜘蛛爬行的方式&#xff0c;抓取网站的各种信息&#xff0c;并将这些信息整理成易于理解的报告。这些报告可以帮助用户评估网站的优化情况&#xff0c;发现链接的…

pyqt5-快捷键QShortcut

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *""" 下面示例揭示了&#xff0c;当关键字绑定的控件出现的时候&#xff0c;快捷键才管用&#xff0c; 绑定的控件没有出现的时候快捷键无效 """…