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

linux平台RTMP|RTSP播放器如何回调SEI数据?

我们在对接Linux平台RTMP|RTSP播放的时候,有遇到这样的技术需求,合作企业在做无人机视觉分析场景的时候,除了需要低延迟的拿到解码后的RGB|YUV数据,然后投递给他们自己的视觉算法处理模块外,还需要播放器支持SEI的回调,拿到无人机通过SEI扩展发送的一些重要信息,比如经纬度、高度或一些监测数据。

实际上,SEI数据回调这块,我们一直都有,我们还有自己的H.264 SEI扩展发送模块,如果需要回调H.264 SEI,只需要在StartPlay之前,调用下SetSEIDataCallBack即可。

具体代码示例如下:

player_api.SetSEIDataCallBack(handle, nullptr, on_player_sdk_sei_data);

on_player_sdk_sei_data设计如下,为了演示方便,我们仅把数据打印出来前面一些字节,实际上,SEI和RGB|YUV数据回调一样,我们也带了timestamp,方便数据帧和SEI对的起来:

extern "C" void on_player_sdk_sei_data(NT_HANDLE handle, NT_PVOID user_data,NT_BYTE*  data,NT_UINT32 size,NT_UINT64 timestamp,NT_UINT64 reserve1,NT_INT64  reserve2,NT_PVOID  reserve3) {if (!data || size < 1)return;std::ostringstream ss;char buffer[8];int print_len = size < 64 ? size : 64;for (auto i = 0; i < print_len; ++i) {sprintf(buffer, "%02x,", data[i]);ss << buffer;}fprintf(stdout, "on_sdk_sei:size:%d, data:%s\n", size, ss.str().c_str());fflush(stdout);
}

如果需要回调RGB数据,设置如下:

/** single_player_demo.cpp* Created by daniusdk.com (C) All rights reserved.*///player_api.SetVideoFrameCallBack(handle, NT_SP_E_VIDEO_FRAME_FROMAT_I420, nullptr, &NT_SDK_SDKVideoFrameCallBack);player_api.SetVideoFrameCallBackV2(handle, 640, 360, 3, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, nullptr, &NT_SDK_SDKVideoFrameCallBack);player_api.SetFastStartup(handle, 1);
player_api.SetLowLatencyMode(handle, 0);if (NT_ERC_OK != player_api.StartPlay(handle))
{player_api.Close(handle);handle = nullptr;player_api.UnInit();fprintf(stderr, "player_api.StartPlay failed!\n");XDestroyWindow(display, sub_wid);XDestroyWindow(display, main_wid_);XCloseDisplay(display);return 0;
}

可以看到,除了正常的回调yuv或rgb的接口外,我们还有扩展的指定分辨率输出的回调接口设计,方便让开发者更方便的处理数据。

/** single_player_demo.cpp* Created by daniusdk.com (C) All rights reserved.*/extern "C" void NT_SDK_SDKVideoFrameCallBack(NT_HANDLE handle, NT_PVOID user_data, NT_UINT32 status,const NT_SP_VideoFrame* frame)
{if (!frame)return;fprintf(stdout, "OnSDKVideoFrameCallBack handle:%p frame:%p, timestamp:%llu\n", handle, frame, frame->timestamp_);#if NEED_SAVE_BITMAPif (NT_SP_E_VIDEO_FRAME_FORMAT_RGB32 == frame->format_|| NT_SP_E_VIDEO_FRAME_FORMAT_ARGB == frame->format_) {struct timeval tv;if (gettimeofday(&tv, nullptr) != 0) {fprintf(stderr, "save bitmap file call gettimeofday failed");return;}uint64_t local_time_us = tv.tv_sec*UINT64_C(1000000) + tv.tv_usec;char file_name[128] = { 0 };sprintf(file_name, "./outbitmaps/%llu.bmp", (unsigned long long)local_time_us);if (!save_bitmap_file(frame->width_, frame->height_, frame->plane0_, frame->stride0_, frame->stride0_*frame->height_, file_name))fprintf(stderr, "save bitmap file failed, name:%s", file_name);elseg_bitmap_file_names_.emplace_back(file_name);while (g_bitmap_file_names_.size() > 32) {remove(g_bitmap_file_names_.front().c_str());g_bitmap_file_names_.pop_front();}}#endif // NEED_SAVE_BITMAP
}

以RTMP|RTSP播放器为例,Linux平台我们设计的功能如下:

  • 音频:AAC/PCMA/PCMU/SPEEX;
  • 视频:H.264;
  • 播放协议:RTMP;
  • 支持纯音频、纯视频、音视频播放;
  • 支持多实例播放;
  • [RTSP协议]支持RTSP TCP/UDP模式设置;
  • [RTSP协议]支持RTSP TCP、UDP模式自动切换;
  • [RTSP协议]支持RTSP超时时间设置,单位:秒;
  • 支持buffer时间设置,单位:毫秒;
  • 支持超低延迟模式;
  • 断网自动重连,支持视频追赶;
  • 支持视频view实时旋转(0° 90° 180° 270°);
  • 支持视频view水平反转、垂直反转;
  • 支持buffer状态等回调;
  • 支持H.264 SEI扩展数据回调;
  • 支持实时音量调节;
  • 支持实时快照功能;
  • 支持实时录像功能;
  • 支持yuv或rgb数据回调;
  • 支持unity接口;
  • 支持x86_64|aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。

相关文章:

linux平台RTMP|RTSP播放器如何回调SEI数据?

我们在对接Linux平台RTMP|RTSP播放的时候&#xff0c;有遇到这样的技术需求&#xff0c;合作企业在做无人机视觉分析场景的时候&#xff0c;除了需要低延迟的拿到解码后的RGB|YUV数据&#xff0c;然后投递给他们自己的视觉算法处理模块外&#xff0c;还需要播放器支持SEI的回调…...

Vue uni-app免手动import

unplugin-auto-import 是一个流行的 JavaScript/TypeScript 插件&#xff0c;可以自动导入常用的库、API 或自定义函数&#xff0c;减少手动书写 import 语句的繁琐操作。它常用于 Vue、React 等框架&#xff0c;帮助开发者提高效率和减少样板代码。 核心功能&#xff1a; 自…...

7. 计算机视觉

计算机视觉&#xff08;Computer Vision&#xff0c;简称 CV&#xff09;是人工智能&#xff08;AI&#xff09;领域中的一个重要分支&#xff0c;旨在使计算机能够像人类一样“看”并理解数字图像或视频。它结合了计算机科学、数学、图像处理、模式识别、机器学习等多个学科&a…...

在服务器进行docker部署频繁提示permission denied

当你频繁遇到permission denied&#xff0c;证明当前用户的权限不够 可以参考如下操作&#xff1a; 1.创建用户组docker sudo groupadd docker把当前用户添加到docker用户组中 sudo usermod -aG docker $USER优点&#xff1a; 可以在不使用sudo的情况下运行docker命令...

c/c++ static

定义 修饰普通变量&#xff0c;修改变量的存储区域和生命周期&#xff0c;使变量存储在静态区&#xff0c;在 main 函数运行前就分配了空间&#xff0c;如果有初始值就用初始值初始化它&#xff0c;如果没有初始值系统用默认值初始化它。修饰普通函数&#xff0c;表明函数的作…...

C#中System.Text.Json:从入门到精通的实用指南

一、引言 在当今数字化时代&#xff0c;数据的高效交换与处理成为软件开发的核心环节。JSON&#xff08;JavaScript Object Notation&#xff09;凭借其简洁、轻量且易于读写的特性&#xff0c;已然成为数据交换领域的中流砥柱。无论是前后端数据交互&#xff0c;还是配置文件…...

内存故障原因与诊断(Reasons and Diagnosis of Memory Failure)

内存故障原因与诊断 您是否曾遇到过电脑无法启动、黑屏、死机&#xff0c;或者系统卡顿的情况&#xff1f;这些问题看起来很复杂&#xff0c;实际上大多数都是内存故障引起的。内存是电脑的核心组成部分之一&#xff0c;任何小东西问题都可能导致系统死机&#xff0c;严重时甚…...

[操作系统] 进程状态详解

在操作系统中&#xff0c;进程是程序执行的基本单位&#xff0c;操作系统负责管理进程的生命周期。为了高效地管理进程&#xff0c;操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kerne…...

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…...

【Maui】下拉框的实现,绑定键值对

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/05795ee1c24c49129b822b530ef58302.png) 前言 .NET 多平台应用 UI (.NET MA…...

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…...

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…...

MPLS VPN 原理与配置

一.简介 MPLS&#xff0c;称之为多协议标签交换&#xff0c;在九十年代中期被提出来&#xff0c;用于解决传统IP报文依赖查表转发而产生的瓶颈&#xff0c;现多用于VPN技术&#xff0c;MPLS报头封装在数据链路层之上&#xff0c;网络层之下。本文为结合了华为技术和新华三技术…...

稳定的通信桥梁,CCLINKIE转ModbusTCP网关实现AGV运输的光速效应

三菱PLC与AGV机器人搬运车通过稳联技术协议转换网关建立通信 一、现场情况概述 - 三菱PLC&#xff1a;使用CC-Link IE协议进行通信。 - AGV机器人搬运车&#xff1a;使用Modbus TCP协议进行通信。 - 协议转换网关&#xff1a;使用稳联技术的协议转换网关将PLC和AGV连接&#xf…...

Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences

Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路2. 代码实现 题目链接&#xff1a;3428. Maximum and Minimum Sums of at Most Size K Subsequences 1. 解题思路 这一题不需要连续性&#xff0c;因此我们就是考虑取得子串长度为别为1…...

第2章:Python TDD构建Dollar类基础

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

【算法学习笔记】34:扩展欧几里得算法

裴蜀定理 描述 对于任意正整数 a a a、 b b b&#xff0c;一定存在整数系数 x x x&#xff0c; y y y&#xff0c;使得&#xff1a; a x b y g c d ( a , b ) ax by gcd(a, b) axbygcd(a,b) 并且 g c d ( a , b ) gcd(a, b) gcd(a,b)是对于任意的系数 x x x和 y y y放在…...

云原生周刊:K8s 生产环境架构设计及成本分析

开源项目推荐 KubeZoneNet KubeZoneNet 旨在帮助监控和优化 Kubernetes 集群中的跨可用区&#xff08;Cross-Zone&#xff09;网络流量。这个项目提供了一种简便的方式来跟踪和分析 Kubernetes 集群中跨不同可用区的通信&#xff0c;帮助用户优化集群的网络架构、提高资源利用…...

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…...

海量数据的处理

一般来说都是针对数据量特别大&#xff0c;内存有限制的。 第一类&#xff1a;topk问题 比如&#xff0c;在海量数据中找前50大的数据怎么办&#xff1f; 方法一&#xff1a;使用小顶堆&#xff0c;用小顶堆维护这50个元素&#xff0c;当有新元素到来时&#xff0c;直接与堆…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...