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)。

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

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

相关文章

vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的状态管理库。它是一个让你能在应用中集中管理共享状态的工具。当应用的规模逐渐增大&#xff0c;组件之间的数据传递变得越来越复杂时&#xff0c;Vuex 就成为了救星&#xff0c;提供了一个集中式的存储来管理所有的组件状态&#xff0c;并且保证状态以一…

Linux系统之kill命令的基本使用

Linux系统之kill命令的基本使用 一、kill命令介绍1. kill命令简介2. kill命令的使用场景3. kill命令使用注意事项 二、kill命令的使用帮助1. 查看kill命令帮助信息2. kill命令帮助解释 三、kill常用的信号1. 列出所有的信号2.kill常用的信号 四、kill命令的基本使用1. 运行一个…

HTML之拜年/跨年APP(改进版)

目录&#xff1a; 一&#xff1a;目录 二&#xff1a;效果 三&#xff1a;页面分析/开发逻辑 1.页面详细分析&#xff1a; 2.开发逻辑&#xff1a; 四&#xff1a;完整代码&#xff08;不多废话&#xff09; index.html部分 app.json部分 二&#xff1a;效果 三&#xff1a;页面…

深入探索Python人脸识别技术:从原理到实践

一、引言在当今数字化时代,人脸识别技术已然成为了计算机视觉领域的璀璨明星,广泛且深入地融入到我们生活的各个角落。从门禁系统的安全守护,到金融支付的便捷认证,再到安防监控的敏锐洞察,它的身影无处不在,以其高效、精准的特性,极大地提升了我们生活的便利性与安全性…

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…

mac m1下载maven安装并配置环境变量

下载地址&#xff1a;Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令&#xff1a; 1. 确保你已经安装了 Visual Studio…

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…

VSCode的配置与使用(C/C++)

从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境&#xff0c;添加到环境变量&#xff08;默认你是全新的电脑&#xff0c;没有安装vs2019之类的&#xff09; 原因&#xff1a;因为相比于vs2019&#xff0c;vscode只是个代码编辑器&#xff0c;相当于一个彩色的、…

QTableWidget的简单使用

1.最简单的表格示例&#xff1a; ui->tableWidget->setRowCount(2);// 设置行数ui->tableWidget->setColumnCount(3);// 设置列数&#xff0c;一定要放在设置行表头之前QStringList rowHeaderList;// 行表头rowHeaderList << QStringLiteral("姓名"…

七大排序算法

文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间&#xff08;仅供参考&#xff09; 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…

前端常见标签

1. <!-- ! 快速生成标签 --> &#xff01;回车会立刻生成模板 2. <!-- CTRL / 生成注释--> 3. 文本标签 <!-- span 文本标签 --> 生成如下&#xff1a; 4. <!-- h1-h6标题标签 --> 大小依次递减 生成&…

PHP教育系统小程序

&#x1f310; 教育系统&#xff1a;全方位学习新体验&#xff0c;引领未来教育风尚 &#x1f680; 教育系统&#xff1a;创新平台&#xff0c;智慧启航 &#x1f4f1; 教育系统&#xff0c;一款深度融合科技与教育的创新平台&#xff0c;匠心独运地采用先进的ThinkPHP框架与U…

MySQL配置my.ini文件

my.ini文件中存储了数据库的文件地址&#xff0c;数据库数据存储地址以及登录密码等基础信息。在遇到忘记密码或者其他基础问题时&#xff0c;修改my.ini文件很方便。但是部分数据库版本默认不生成my.ini文件&#xff0c;需要自己进行配置。 1.停止数据库服务。在搜索框中输入…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Java中的构造器

Java中的构造器详解 1. 什么是构造器 构造器&#xff08;Constructor&#xff09; 是一种特殊的方法&#xff0c;用于在创建对象时初始化对象的状态。构造器的名字必须与类名相同&#xff0c;且没有返回类型&#xff0c;连 void 也不能使用。 2. 构造器的特点 名称与类名相同…

Zabbix监控山特UPS电源:实现高效监控与告警

背景 近期&#xff0c;随着机房迁移的进行&#xff0c;为了提升电力保障并确保设备的持续运行&#xff0c;我们在原有基础上新增了多台山特UPS电源作为备用电源。这些UPS电源的主要作用是在电力中断时为机房设备提供足够的电力支持&#xff0c;确保设备有充足的时间进行正常关…

计算机系统原理:一些断言

0 虚拟机和解释器 在Java中&#xff0c;JVM既充当了一个虚拟机的角色&#xff0c;也包含了用于执行字节码的解释器。同样地&#xff0c;Python的CPython实现也是先将源代码编译成字节码&#xff0c;然后由Python虚拟机执行。 1 从源代码中提取token的过程就是词法分析 词法分…

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据 4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值…

Jenkins 启动

废话 这一阵子感觉空虚&#xff0c;心里空捞捞的&#xff0c;总想找点事情做&#xff0c;即使这是一件微小的事情&#xff0c;空余时间除了骑车、打球&#xff0c;偶尔朋友聚会 … 还能干什么呢&#xff1f; 当独自一人时&#xff0c;究竟可以做点什么&#xff0c;填补这空虚…