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_BITMAP

	if (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);
		else
			g_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.mfbz.cn/a/755606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GoLang语言

基础 安装Go扩展 go build 在项目目录下执行go build go run 像执行脚本文件一样执行Go代码 go install go install分为两步: 1、 先编译得到一个可执行文件 2、将可执行文件拷贝到GOPATH/bin Go 命令 go build :编译Go程序 go build -o "xx.exe"…

React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索

文章目录 前言一、Search组件封装1. 效果展示2. 功能分析3. 代码详细注释4. 使用方式 二、搜索结果展示组件封装1. 功能分析2. 代码详细注释 三、引用到文件,自行取用总结 前言 今天,我们来封装一个业务灵巧的组件,它集成了全局搜索和展示搜…

基于Java的茶文化交流系统【附源码+LW】

摘 要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话…

Meta发布LLM编译器 称将改变我们的编程方式

Meta发布了Meta 大型语言模型(LLM)编译器,这是一套强大的开源模型,旨在优化代码并彻底改变编译器设计。这项创新有望改变开发人员优化代码的方式,使代码优化更快、更高效、更具成本效益。 在将大型语言模型应用于代码和…

基于SpringBoot+Vue的大药房管理系统(带1w+文档)

基于SpringBootVue的大药房管理系统(带1w文档) 本系统主要包括管理员和用户两个用户角色;主要包括:首页,个人中心,用户管理,保健品分类管理,药品分类管理,药品信息管理,疫情常识管理…

鸿蒙登录页面及页面跳转的设计

目录 任务目标任务分析任务实施1.新建工程项目HMLogin2.设计登录页面Index.visual3.设计第二个页面SecondPage4.修改Index.ets代码5.修改SecondPage.ets代码6.运行工程 任务目标 设计一个简单的登录页面,要求可以将第一页的登录信息,传递到第二个页面&a…

3.js - 反射率(reflectivity) 、折射率(ior)

没啥太大的感觉 反射率 reflectivity 概念 反射率:指的是,材质表面反射光线的能力反射率,用于控制材质对环境光,或光源的反射程度反射率越高,材质表面反射的光线越多,看起来就越光亮使用 适用于&#xff0…

AIGC实战:LLaMA2打造中文写作利器——数据准备与模型训练全攻略

目录 一、下载并加载中文数据集二、中文数据集处理 1、数据格式 2、数据集处理之tokenizer训练格式 1)先将一篇篇文本拼凑到一起(只是简单的拼凑一起,用于训练tokenizer) 2)将数据集进行合并 3、数据集处理之模型&am…

嵌入式学习——硬件(ARM体系架构)——day51

1. S3C2440基础知识——一条指令四个字节 1.1 定义 S3C2440 是三星(Samsung)公司设计的一款基于 ARM920T 核心的微处理器,广泛应用于嵌入式系统中,属于三星的 S3C24xx 系列。 1.2 处理器核心 ARM920T:基于 ARM v5T …

Shell 脚本编程保姆级教程(下)

七、Shell 流程控制 7.1 if #!/bin/bash num1100 if test $[num1] 100 thenecho num1 是 100 fi 7.2 if else #!/bin/bash num1100 num2100 if test $[num1] -eq $[num2] thenecho 两个数相等! elseecho 两个数不相等! fi 7.3 if else-if else #!/…

Java框架的原理主要基于以下几个核心

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

算法力扣刷题记录 二十三【151.翻转字符串里的单词】

前言 字符串篇,继续。 记录 二十三【151.翻转字符串里的单词】 – 一、题目阅读 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词…

Type-C接口OTG转接器的应用与发展

随着科技的飞速发展,智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中,Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG(On-The-Go)技术则进一步扩展了Type-C接口的功能,使得设…

融资担保行业数字化转型探索与实践

融资担保行业数字化转型探索与实践 随着全球经济的快速发展和科技的不断进步,数字化转型已成为各行各业提升竞争力和实现可持续发展的必然选择。融资担保行业作为金融体系中的重要组成部分,也在积极探索和实践数字化转型,以更好地服务中小微企…

基于Datax开发支持瀚高数据库的插件_插件开发_以及部署---国产瀚高数据库工作笔记006

如果想直接使用,开发好的插件,那么可以去下载笔者上传的,打包好的插件,直接放入到 datax安装目录的./datax/plugin/reader 或者writer中就可以了 https://download.csdn.net/download/lidew521/89495306 https://download.csdn.net/download/lidew521/89495301这两个一个…

多功能引流必备神器!评论区关键词采集!斗音平台引流

大家好我今天带来的这款软件,就像是抖音引流界的“多功能引流神器”,功能全面到让你眼花缭乱,而且操作简便到连你的宠物金鱼都能学会! 下面开看看都有哪些功能​: 高级截流拓客功能:想象一下,你…

性能之巅的巴比达内网穿透访问单位的web管理系统

在这个数字化飞速发展的时代,作为一名IT部门的小主管,我经常面临着一项挑战:如何在外网环境下高效、安全地访问我们单位内部部署的Web管理系统。这不仅仅是关乎我个人的工作效率,更是影响到整个团队能否快速响应市场需求的关键。直…

昇思MindSpore学习笔记1--基本介绍

昇思MindSpore是一个全场景深度学习框架。 一、框架组成 1. 模型库ModelZoo 提供深度学习算法网络。 2. 扩展库MindSpore Extend 拓展领域场景,如GNN/深度概率编程/强化学习等。 3. 科学计算MindSpore Science 科学计算套件。 包含数据集、基础模型、预置高精度模…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天,抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力,还能有效提升品牌的知名度和用户黏性。然而,想要充分利用这一营销工具,关键在于如何高效地追踪广告数…

力扣 移除元素

class Solution {public int removeElement(int[] nums, int val) {int left 0;for(int right 0;right<nums.length;right){if(nums[right] ! val){nums[left] nums[right];left;}}return left;} }