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

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
简介: 在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。

技术背景

我们在对接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

image.gif

开始播放之前,设置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);

image.gif

开始播放后,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
}

image.gif

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

image.gif

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

总结

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

相关文章
|
20天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
219 55
|
9天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
102 66
|
30天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
155 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
3天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
6天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
9天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
26 7
|
11天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
42 5
|
12天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6
|
11天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要

热门文章

最新文章