Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析

技术背景

我们在对接Linux平台RTSP播放模块的时候,遇到这样的技术需求,开发者需要把Linux RTSP播放器拉取的数据,除了实时播放外,还要投递给python,用于视觉算法分析。

技术实现

Linux平台RTSP、RTMP直接播放不再赘述,这块我们非常成熟,python需要数据,我们可以在播放的同时,直接把数据回上来。回上来的数据,跟python交互,有多种方式,比如共享内存、或者写bitmap文件,然后python实时读取就好。

本文以写bitmap为例,介绍下大概的实现:

	NT_HANDLE handle = nullptr;// 打开一个播放实例,可以Open多个播放实例, 然后播放多路if (NT_ERC_OK != player_api.Open(&handle, 0, nullptr)){player_api.UnInit();fprintf(stderr, "player_api.Open failed!\n");XDestroyWindow(display, sub_wid);XDestroyWindow(display, main_wid_);XCloseDisplay(display);return 0;}player_api.SetEventCallBack(handle, nullptr, &NT_OnSDKEventHandle);player_api.SetVideoSizeCallBack(handle, nullptr, &NT_SDKVideoSizeHandle);player_api.SetReportDownloadSpeed(handle, 1, 5); // 5秒上报一次下载速度player_api.SetRtspTimeout(handle, 15);player_api.SetRtspAutoSwitchTcpUdp(handle, 1);player_api.SetBuffer(handle, 0); // 设置缓存player_api.SetIsOutputAudioDevice(handle, 1);player_api.SetAudioOutputLayer(handle, 0); // 使用pluse 或者 alsa播放, 两个可以选择一个//player_api.SetAudioVolume(handle, 100);player_api.SetURL(handle, player_url_); // 设置播放地址, rtsp或者rtmp地址//player_api.SetXDisplayName(handle, NULL);player_api.SetXScreenNumber(handle, screen);player_api.SetRenderXWindow(handle, sub_wid); // 设置绘制的X窗口player_api.SetRenderScaleMode(handle, 1); // 按比例绘制或者全填充player_api.SetRenderTextureScaleFilterMode(handle, 3); //player_api.SetVideoFrameCallBack(handle, NT_SP_E_VIDEO_FRAME_FROMAT_I420, nullptr, &NT_SDK_SDKVideoFrameCallBack);#if NEED_SAVE_BITMAP// player_api.SetVideoFrameCallBack(handle, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, nullptr, &NT_SDK_SDKVideoFrameCallBack);player_api.SetVideoFrameCallBackV2(handle, 640, 360, 3, NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, nullptr, &NT_SDK_SDKVideoFrameCallBack);#endif

开始播放之前,设置videoframe回调(本文以rgb32为例),videoframe回调,我们有两组接口,一组是原始数据回调,另外一组,是回调缩放后的数据,这里考虑到算法识别对分辨率的要求,我们以缩放的接口为例。

/** nt_linux_smart_player_sdk.h* Author: daniusdk.com*/
/*
设置视频回调, 吐视频数据出来, 可以指定吐出来的视频宽高
*handle: 播放句柄
*scale_width:缩放宽度(必须是偶数,建议是 16 的倍数)
*scale_height:缩放高度(必须是偶数
*scale_filter_mode: 缩放质量, 0 的话 SDK 将使用默认值, 目前可设置范围为[1, 3], 值越大 缩放质量越好,但越耗性能
*frame_format: 只能是NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, NT_SP_E_VIDEO_FRAME_FROMAT_I420
成功返回NT_ERC_OK
*/
NT_UINT32(NT_API *SetVideoFrameCallBackV2)(NT_HANDLE handle,NT_INT32 scale_width, NT_INT32 scale_height,NT_INT32 scale_filter_mode, NT_INT32 frame_format,NT_PVOID call_back_data, SP_SDKVideoFrameCallBack call_back);

开始播放后,video frame数据回调处理如下:

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
}

video frame回调后的数据,直接调研save_bitmap_file()实现bitmap文件写入即可,写bitmap非常简单,这里不再赘述,整体效果如下:

python程序,只需要到指定的文件夹下,读取生成的bitmap即可,实现视频数据视觉算法分析。

总结

Linux平台RTSP、RTMP播放器数据跟python交互,两种方式均可,bitmap实现,也不麻烦,需要注意的时候,由于解码后的单帧数据比较大,建议适当控制导出的bitmap文件数。

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

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

相关文章

IDM下载器怎么用 IDM下载器使用技巧 idm下载器怎么下载网页视频

IDM总能让新用户们眼前一亮,它不仅是工作学习上的好帮手,更是帮你解锁信息世界的钥匙。下载全程无广告、无弹窗、畅享高速下载,这无疑是下载软件市场中的一股清流。有关IDM下载器怎么用,IDM下载器使用技巧的问题,本文将…

App Inventor 2 列表排序,函数式编程轻松实现高级排序算法

本文主要介绍 列表 的高级用法,即函数式编程,可以按照指定的逻辑进行列表的排序,而无需我们自己写代码实现排序功能。 指定的逻辑也包括很复杂的逻辑,也就是说如果你的排序逻辑很复杂,函数式编程就是最好的使用场景。…

Vue--》从零开始打造交互体验一流的电商平台(四)完结篇

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

shiro漏洞利用记录

shiro漏洞利用记录 获取heapdump 访问http://39.100.119.172:8082/actuator/heapdump​下载heapdump nginx waf可能限制下载heapdump,但里面的配置可能是精确匹配,因此可以使用http://39.100.119.172:8082/actuator/heapdump//​来绕过 获取shrio ke…

Webpack: 构建 NPM Library

概述 虽然 Webpack 多数情况下被用于构建 Web 应用,但与 Rollup、Snowpack 等工具类似,Webpack 同样具有完备的构建 NPM 库的能力。与一般场景相比,构建 NPM 库时需要注意: 正确导出模块内容;不要将第三方包打包进产…

IDM(Internet Download Manager)下载器的安装激活与换机方法 IDM怎么用

很多人都知道 Internet Download Manager(以下简称 IDM)是一款非常优秀的下载提速软件。它功能强大,几乎能下载网页中的所有数据(包括视频、音频、图片等),且适用于现在市面上几乎所有的浏览器,非常受大家欢迎。IDM 是…

河南企业劳务资质申请:技术负责人角色与职责

河南企业劳务资质申请中,技术负责人的角色与职责至关重要,以下是对其角色与职责的清晰归纳: 一、角色定位 技术核心:技术负责人是企业技术团队的核心,是企业技术实力和专业水平的象征。战略规划者:根据行…

subline设置打开文件重启一个新的窗口

问题 打开文件后,用的是同一个窗口的子tab页面 想要打开一个新的窗口 解决 点解preferences->setting 在右边的配置文件新增一行 “open_files_in_new_window”: “always” 保存 搞定!

LeetCode 1667, 36, 199

目录 1667. 修复表中的名字题目链接表要求知识点思路代码 36. 有效的数独题目链接标签思路代码 199. 二叉树的右视图题目链接标签思路代码 1667. 修复表中的名字 题目链接 1667. 修复表中的名字 表 表Users的字段为user_id和name。 要求 编写解决方案,修复名字…

SET加密:电子商务安全的基石

随着电子商务的飞速发展,如何确保在线交易的安全性和可信度已成为消费者、商家和金融机构共同关注的焦点。SET协议(Secure Electronic Transaction)作为一种安全电子交易的国际标准,凭借其卓越的安全性能和广泛的行业认可&#xf…

食品行业怎么用JSON群发短信

食品作为日常生活不可缺少的元素,市场需求是很稳定的,但是份额就那么多,商家都要来抢占的话,就需要运营推广各凭本事,市场运营中选择合适的推广方式,可以增加店铺销售额,很多实体店或商城都会建…

MATLAB-振动问题:两自由度耦合系统自由振动

一、基本理论 二、MATLAB实现 以下是两自由度耦合系统自由振动质量块振动过程动画显示的MATLAB程序。 clear; clc; close allx0 1; D1 40; D12 8; D2 D1; m1 1; omega0 sqrt(D1/m1); k1 D12 / D1; k2 D12 / D2; k sqrt(k1 * k2); omegazh omega0 * sqrt(1 k); omeg…

pytest中的极其重要固件(request)的理解

pytest 是一个非常流行的Python测试框架,它为开发人员提供了丰寴的测试工具和功能。 在pytest中,固件(fixture)是一种非常核心的概念,用于设置测试前的预条件,清理测试后的环境,或者提供测试过…

高效实现虚拟机(VMware)安装教程(附安装包)

目录 一.下载VMware Wworkstation Pro 二 安装: 注:若是安装完VMware,还想在上面安装Centos、Ubuntu,系统请转到基于VMware的linux操作系统安装(附安装包)-CSDN博客 一.下载VMware Wworkstation Pro 渠道…

文心一言用户达3亿!文心大模型4.0 Turbo发布,支持API,真GPT-4 Turbo国产来了!

文心一言用户规模达到3亿了! 这是笔者在今天的百度Wave Summit 2024大会上的看到的数字。需要强调的是,文心一言的用户规模是在去年12月破亿的。这意味着,仅仅隔了6个月,文心一言用户数量在亿这个级别的数字上竟然直接翻了三倍。…

【C++】线程库

在 C11 问世之前,多线程基本和平台关系密切,不同的平台下多线程各有特点,使得 Windows 和 Linux 下必须拥有各自的系统调用接口,但同时也使得代码的可移植性较差。 C11中最重要的特性,就是支持了多线程编程&#xff0c…

【高性能服务器】服务器概述

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 服务器概述 服…

计算机网络 —— 基本概念

基本概念 1. 通信协议2. 面向连接 v.s. 面向无连接3. 电路交换 v.s. 分组交换4. 单工通信 v.s. 双工通信 1. 通信协议 通信协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使那些由不同厂商的设备、不同的CPU 以及不同的操作系统组成的计算…

C# 实现websocket双向通信

🎈个人主页:靓仔很忙i 💻B 站主页:👉B站👈 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C# 🤝希望本文对您有所裨益,如有不足之处&#xff…

人工智能在多模态多组学领域的最新研究进展|顶刊速递·24-06-29

小罗碎碎念 本期推文主题:人工智能在多模态与多组学中的最新研究进展 今天这期推文比较特殊,起来就开始干活,只能跑来会场写了。 小罗观点 今天这期推文覆盖面挺广的,前四篇与肿瘤治疗相关,并且两篇都直接与免疫微环境…