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

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章:

总述:https://blog.csdn.net/www_dong/article/details/132515446

注册与注销:https://blog.csdn.net/www_dong/article/details/132654525

心跳保活:https://blog.csdn.net/www_dong/article/details/132796612

网络设备信息查询:https://blog.csdn.net/www_dong/article/details/132912085

视音频点播(信令传输部分):https://blog.csdn.net/www_dong/article/details/132950064

媒体服务器

提供媒体流的转发、媒体存储、历史媒体信息的检索和点播服务的服务器。

设计方案

  • jrtplib+jthread:监听、视频数据接收与转发;
  • libmpeg:对ps流解复用;
  • ffmpeg:数据解码;
  • Qt(QOpenGLWidget):视频播放;

数据接收

jrtplib

jrtplib是一个面向对象的RTP封装库。

特点:

  • 该库使用户能够发送和接收数据使用RTP,无需担心SSRC冲突、调度和传输RTCP数据等。用户只需提供库通过发送有效负载数据,库为用户提供访问权限输入RTP和RTCP数据;
  • 该库提供了几个类,这些类有助于创建RTP应用程序。大多数用户可能只需要RTPSession类来构建应用程序,或者从RTPSecureSession派生一个类来支持SRTP。这些类提供了发送RTP数据的必要功能,并在内部处理RTCP部分;

jthread

jrtplib的使用依赖于jthread,使用方式用两种:

  1. 用 jthread 库提供的线程自动在后台执行对数据的接收;
  2. 用户自己调用 RTPSession 中的 Poll 方法;

下载

下载地址:https://research.edm.uhasselt.be/jori/page/Cs/JrtplibOld.html 。

该项目目前使用的是jrtplib-3.11.2.zip+jthread-1.3.3.zip。下载完成后使用cmake生成windows下.sln工程编译生成静态库使用。

流程

  • 数据接收流程,该流程目前在线程中处理。
uint8_t payload;
while (m_running)
{Poll();BeginDataAccess();if (GotoFirstSourceWithData()){do{RTPPacket* packet = nullptr;while (nullptr != (packet = GetNextPacket())){payload = packet->GetPayloadType();if (0 == payload){DeletePacket(packet);continue;}// ...// rtp载荷数据处理流程DeletePacket(packet);}} while (GotoNextSourceWithData());}EndDataAccess();Sleep(30);
}Destroy();

数据解复用

该流程使用的是libmpeg库,下载地址:https://github.com/ireader/media-server.git

由于国标流是ps封装,故需要将ps流解复用获取原始数据。

解复用代码流程:

static void* Alloc(void* /*param*/, size_t bytes)
{return malloc(bytes);
}static void Free(void* /*param*/, void* packet)
{free(packet);
}static int Write(void* param, int avtype, void* pes, size_t bytes)
{assert(param);CPSParse* parse = (CPSParse*)param;return parse->Package(avtype, pes, bytes);
}CPSParse::CPSParse()
{struct ps_muxer_func_t func;func.alloc = Alloc;func.free = Free;func.write = Write;m_ps = ps_muxer_create(&func, this);m_ps_stream = ps_muxer_add_stream(m_ps, STREAM_VIDEO_H264, nullptr, 0);
}CPSParse::~CPSParse()
{if (m_ps)ps_muxer_destroy(m_ps);
}int CPSParse::InputData(void* data, int len)
{if (nullptr == m_ps || nullptr == data || len <= 0)return -1;uint64_t clock = time64_now();if (0 == m_ps_clock)m_ps_clock = clock;ps_muxer_input(m_ps, m_ps_stream, 0, (clock - m_ps_clock) * 90, (clock - m_ps_clock) * 90, data, len);return 0;
}int CPSParse::Package(int avtype, void* payload, size_t bytes)
{// 数据处理return 0;
}

数据解码

通过对ps数据流解复用获取原始数据,本项目通过ffmpeg对原始数据进行解码获取yuv数据。

关于ffmpeg的使用,可以查看:

音视频播放器设计(一)——环境配置:https://blog.csdn.net/www_dong/article/details/124459467

音视频播放器设计(二)——ffmpeg视频处理流程:https://blog.csdn.net/www_dong/article/details/124561444

音视频播放器设计(三)——OpenGL绘制视频:https://blog.csdn.net/www_dong/article/details/124638515

音视频播放器设计(四)——ffmpeg音频处理流程:https://blog.csdn.net/www_dong/article/details/125323635

视频播放

通过ffmpeg解码获取yuv数据,本项目通过qt的QOpenGLWidget对yuv数据进行渲染达到播放的目的。

  • 使用方法:
    • 新建一个PlayWidget类继承于QOpenGLWidget;
    • 将ffmpeg解码后的yuv数据传入PlayWidget类,保存并调用update函数;
    • update()被调用后,QOpenGLWidget::paintGL()会自动被调用,在里面进行显示;
    • 使用QOpenGLFunctions::glTexImage2D传入一帧数据进行显示;
#include <QOpenGLShaderProgram>
#include <QOpenGLFunctions>
#include <QOpenGLTexture>class PlayWidget : public QOpenGLWidget, protected QOpenGLFunctions
{public:PlayWidget(QWidget *parent = nullptr);virtual ~PlayWidget();// ...
};

效果展示

在这里插入图片描述

相关文章:

GB28181学习(六)——实时视音频点播(数据传输部分)

GB28181系列文章&#xff1a; 总述&#xff1a;https://blog.csdn.net/www_dong/article/details/132515446 注册与注销&#xff1a;https://blog.csdn.net/www_dong/article/details/132654525 心跳保活&#xff1a;https://blog.csdn.net/www_dong/article/details/132796…...

JMeter接口自动化测试(数据驱动)

之前我们的用例数据都是配置在HTTP请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开JMeter重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f;我们可以将用例的数据存放在cs…...

数据结构:二叉树(超详解析)

目录​​​​​​​ 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.3.1孩子兄弟表示法&#xff1a; 1.3.2双亲表示法&#xff1a;只存储双亲的下标或指针 两节点不在同一树上&#xff1a; 2.二叉树概念及结构 2.1.概念 2.2.特殊的二叉树&#xff1a; 2…...

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 4. 对坐标的曲面积分(第二类曲面积分)与场论初步

文章目录 二、曲面积分2.2 对坐标的曲面积分&#xff08;第二类曲面积分&#xff09;1. 问题产生 —— 流量2. 对坐标的曲面积分的定义&#xff08;了解&#xff09;3. 对坐标的曲面积分的性质4. 对坐标的曲面积分的计算法&#xff08;1&#xff09; 二重积分法&#xff08;2&a…...

使用Thrift实现跨语言RPC调用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】

【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、选择控制方式-程控方式-RS2324、代码编写 4、熟悉协议-SCPI协议5、测试实验-测试指令&#xff08;1&#xff09;硬件连接&#xff08;…...

leetcode 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…...

Error string: Could not load library

启动Rivz时&#xff0c;报错&#xff1a; Error string: Could not load library (Poco exception libg2o_csparse_extension.so.0.1: cannot open shared object file: No such file or directory) [ERROR] [1696572310.529059051]: Failed to load nodelet [/radar_graph_s…...

pom.xml里的标签

pom.xml 是 Maven 项目的配置文件&#xff0c;其中包含了各种配置信息和依赖管理。下面是一些常见的 pom.xml 中的标签和其作用的简要说明&#xff1a; <project>&#xff1a;根标签&#xff0c;定义了整个项目的基本信息和结构。 <groupId>&#xff1a;指定项目所…...

微服务部署的正确策略

微服务部署挑战 单体应用程序的部署意味着您运行单个&#xff08;通常是大型应用程序&#xff09;的多个相同副本。这主要是通过配置 N 个服务器&#xff08;无论是物理服务器还是虚拟服务器&#xff09;并在每台服务器上运行应用程序的 M 个实例来完成。虽然这看起来非常简单…...

C#中的数组探究与学习

目录 C#中的数组一般分为:一.数组定义:为什么要使用数组?什么是数组?C#一维数组for和foreach的区别C#多维数组C#锯齿数组初始化的意义:适用场景:C#中的数组一般分为: ​①.一维数组。 ②.多维数组,也叫矩形数组。 ③.锯齿数组,也叫交错数组。 一.数组定义: 数组…...

计算机网络八股

1、请你说说TCP和UDP的区别 TCP提供面向连接的可靠传输&#xff0c;UDP提供面向无连接的不可靠传输。UDP在很多实时性要求高的场景有很好的表现&#xff0c;而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。TCP和UDP都是传输层协议&#xff0c;都是为应用层程序服…...

Waves 14混音特效插件合集mac/win

Waves14是一款音频处理软件&#xff0c;主要用于音频编辑、混音和母带处理。该软件提供了各种插件&#xff0c;包括EQ、压缩、混响、延迟、失真等&#xff0c;以及一些专业的音频处理工具&#xff0c;如L2限幅器、Linear Phase EQ和多频道扬声器管理。 Mac软件下载&#xff1a;…...

Python python-docx 使用教程

openpyxl是Python下的Word库&#xff0c;它能够很容易的对Word文档进行读取 安装方法&#xff1a;pip install python-docx国内镜像安装&#xff1a;pip install -i https://mirrors.aliyun.com/pypi/simple/ python-docx&#xff08;推荐&#xff0c;安装更快&#xff09;中文…...

Mac上protobuf环境构建-java

参考文献 getting-started 官网pb java介绍 maven protobuf插件 简单入门1 简单入门2 1. protoc编译器下载安装 https://github.com/protocolbuffers/protobuf/releases?page10 放入.zshrc中配置环境变量  ~/IdeaProjects/test2/ protoc --version libprotoc 3.12.1  …...

CocosCreator3.8研究笔记(二十二)CocosCreator 动画系统-动画剪辑和动画组件介绍

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 大家都知道在Cocos Creator3.x 的版本的动画编辑器中&#xff0c;可以实现不用写一行代码就能实现各种动态效果。 Cocos Creator动画编辑器中主要实现关键帧动画&#xff0c;不仅支持位移、旋转、缩放、帧动画&#xff…...

信看课堂-厘米GNSS定位

我们常常说GPS 定位&#xff0c;不过定位远不止GPS定位&#xff0c;通过本节课程&#xff0c;我们将会了解到&#xff0c;原来GPS只是定位的一种&#xff1a; GNSS概述 不同的GNSS系统使用不同的频段来传输导航信号。以下是一些主要的GNSS系统及其相应的频段&#xff0c;用表…...

2023CCPC网络赛(A E)

2023CCPC网络赛(A E) The 2nd Universal Cup. Stage 3: Binjiang - Dashboard - Contest - Universal Cup Judging System A. Almost Prefix Concatenation 思路&#xff1a;首先考虑如何求出每个位置允许失配一次的LCP长度 &#xff0c; 可以二分哈希求LCP &#xff0c; 即…...

使用 python 检测泛洪攻击的案例

使用 python 检测泛洪攻击的案例 本案例只使用python标准库通过执行命令来监控异常请求, 并封锁IP, 不涉及其他第三方库工具. import os import time from collections import Counter# 1、update 命令, 采集CPU的平均负载 def get_cpu_load():"""uptime 命令…...

SCROLLINFO scrollInfo; 2023/10/5 下午3:38:53

2023/10/5 下午3:38:53 SCROLLINFO scrollInfo;scrollInfo.cbSize = sizeof(SCROLLINFO);scrollInfo.fMask = SIF_ALL;//scrollInfo.nMin = 0; // 最小位置//scrollInfo.nMax = nRowCountToShow; // 最大位置//scrollInfo.nPage = nRowCountToShow; // 页面大小//scrollInf…...

5个Zutilo技巧让你成为Zotero文献管理高手

5个Zutilo技巧让你成为Zotero文献管理高手 【免费下载链接】Zutilo Zotero plugin providing some additional editing features 项目地址: https://gitcode.com/gh_mirrors/zu/Zutilo 还在为Zotero的批量操作烦恼吗&#xff1f;每天面对成百上千的文献条目&#xff0c;…...

PEX8796实战解析:从芯片特性到PCIe扩展设计的关键考量

1. PEX8796芯片基础认知与核心特性 第一次拿到PEX8796这颗PCIe交换芯片时&#xff0c;我盯着密密麻麻的引脚图发了半小时呆。作为PLX&#xff08;现已被博通收购&#xff09;的经典产品&#xff0c;这颗芯片在工业控制、服务器扩展等领域已经默默服役了十余年。实测中发现&…...

Ruby纳米机器人框架:构建高内聚低耦合的自动化任务管道

1. 项目概述&#xff1a;当Ruby遇上纳米机器人最近在GitHub上闲逛&#xff0c;发现了一个名为icebaker/ruby-nano-bots的项目。这个标题本身就充满了想象力——Ruby&#xff0c;一门以优雅和生产力著称的动态语言&#xff1b;Nano-Bots&#xff0c;一个源自科幻、代表微观自动化…...

如何3分钟搞定抖音无水印批量下载:免费工具终极指南

如何3分钟搞定抖音无水印批量下载&#xff1a;免费工具终极指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

别再死记公式了!用Python+NumPy手撸一个卡尔曼滤波器(附代码详解)

用PythonNumPy从零实现卡尔曼滤波器&#xff1a;原理剖析与调参实战 卡尔曼滤波器这个听起来高大上的算法&#xff0c;其实离我们并不遥远。想象一下你在玩一个无人机航拍游戏&#xff0c;屏幕上的无人机位置总是飘忽不定——GPS信号有延迟&#xff0c;惯性传感器有漂移&#…...

Smart_rtmpd配置全解:从单局域网到跨网段,你的OBS推流服务器搭建指南

Smart_rtmpd高阶配置指南&#xff1a;从局域网到跨网段的OBS推流实战 在当前的数字内容创作浪潮中&#xff0c;实时视频流传输已成为游戏直播、在线教育、企业内训等场景的刚需。对于技术爱好者和小型团队而言&#xff0c;自建推流服务器不仅能避免第三方平台的限制&#xff0c…...

Tegra K1深度解析:192核GPU如何重塑移动游戏与异构计算

1. 项目概述&#xff1a;一次移动游戏体验的底层革命 2014年&#xff0c;当小米发布其首款平板电脑MiPad&#xff0c;英伟达&#xff08;Nvidia&#xff09;同步推出Shield Tablet时&#xff0c;整个移动计算领域&#xff0c;尤其是安卓游戏生态&#xff0c;感受到了一次来自底…...

搜极星破局:拆解企业 “看不见、控不住、比不过” 困局

引言&#xff1a;AI 时代&#xff0c;企业陷入三重信息绝境2026 年&#xff0c;生成式 AI 全面主导用户决策链路&#xff0c;品牌竞争从搜索排名转向 AI 认知权重。但多数企业正深陷看不见、控不住、比不过的三重困局&#xff1a;看不见自身在 AI 平台的真实曝光状态&#xff0…...

超导输电技术:从原理到工程应用的挑战与前景

1. 超导输电线路&#xff1a;从技术神话到工程现实的漫长跋涉大约二十年前&#xff0c;当“高温超导”这个名词开始从实验室走向产业界的视野时&#xff0c;整个电力工程领域都为之振奋。想象一下&#xff0c;我们日常依赖的庞大电网&#xff0c;其输电线路中高达5%到10%的电能…...

Elasticsearch实战:从索引设计到性能优化的完整指南

Elasticsearch实战&#xff1a;从索引设计到性能优化的完整指南 大家好&#xff0c;我是迪哥。Elasticsearch 是我们系统的核心搜索组件&#xff0c;从商品搜索到日志分析&#xff0c;从全文检索到聚合分析&#xff0c;它无处不在。今天就聊聊 ES 的索引设计和性能优化经验。 索…...