视频监控平台-OSD源代码解释和分享:通过大华SDK设置大华设备的OSD

2024-05-03 05:44

本文主要是介绍视频监控平台-OSD源代码解释和分享:通过大华SDK设置大华设备的OSD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、OSD介绍

(一)OSD的定义

(二)OSD的设置

1、自定义文本

2、图标和符号

3、定位和叠加

二、代码和解释

(一)代码和注释

(二)代码解释

1、概述

2、代码详细解释


一、OSD介绍

(一)OSD的定义

        网络摄像机的OSDOn-Screen Display)定义为在视频输出上叠加文本、图形、图像等信息的显示技术。它主要用于为摄像头用户提供实时的操作反馈、设置信息以及其他重要数据。

        通过OSD设置,用户可以自定义要显示在视频画面上的内容,如日期、时间、摄像头分辨率、帧率、亮度、对比度等。这些设置允许用户根据具体需求调整摄像机的输出内容,从而提高监控视频的可读性和可用性。

(二)OSD的设置

        网络摄像机的OSD设置允许用户自定义和显示在摄像机视频画面上的各种信息或图标。这些设置通常用于增强摄像机的功能和用户体验。以下介绍OSD设置的一些常见选项。

1、自定义文本

        用户可以在OSD设置中定义要显示在视频画面上的文本信息,如日期、时间、位置标识符、摄像机名称等。这有助于在查看监控视频时快速识别摄像机的位置和记录的时间。

2、图标和符号

        OSD设置还允许用户添加各种图标和符号,如移动侦测图标、警报状态图标等。这些图标可以直观地显示摄像机的状态或功能,使用户更容易理解。

3、定位和叠加

        用户可以通过OSD设置调整文本和图标的位置、大小、颜色等属性,以确保它们不会遮挡视频画面中的重要信息。此外,一些高级OSD设置还支持文本和图标的叠加效果,可以将多个信息项组合在一起显示。

二、代码和解释

(一)代码和注释

       以下部分C++代码是用于设置视频流的OSD(On Screen Display,屏幕显示)信息,如用户名等。具体如下:

/***************************************************************************// 设置OSD的函数// 参数://   bStart:是否开始显示OSD//   LoginID:登录ID//   channelid:通道ID//   pExtPtzInfo:指向TExtPtzInfo结构的指针,可能包含用户名等信息*****************************************************************************/int CNetSdkForDaHua::SetOSD(bool bStart, long LoginID, int channelid, TExtPtzInfo* pExtPtzInfo)
{if(m_bIsSetOSD == false)return 0;// 如果m_bIsSetOSD标志为false,则不执行任何操作并返回NET_OSD_CUSTOM_TITLE g_stCustomTitle; // 定义OSD自定义标题结构体NET_OSD_CUSTOM_TITLE_TEXT_ALIGN g_stTextAlign; // 定义OSD文本对齐结构体int channel = channelid - 1; // 通道ID减1,因为通常ID从0开始// 获取g_stCustomTitle.dwSize = sizeof(g_stCustomTitle); // 设置结构体大小g_stCustomTitle.emOsdBlendType = NET_EM_OSD_BLEND_TYPE_MAIN; // 设置OSD混合类型为主bool r = CLIENT_GetConfig(LoginID, NET_EM_CFG_CUSTOMTITLE, channel, &g_stCustomTitle, sizeof(g_stCustomTitle)); // 获取配置if (r == false){DBGPrint(M_DevCtrl, ERROR_LEVEL,"%s fail: error = %llu", __FUNCTION__, _EC(CLIENT_GetLastError())); // 如果获取失败,打印错误信息return  -1; // 返回-1表示错误}g_stCustomTitle.nCustomTitleNum = dahuuseindex + 1; // 设置自定义标题编号g_stCustomTitle.dwSize = sizeof(g_stCustomTitle); // 重新设置结构体大小if (bStart){// 设置char szOSDString[DH_VIDEO_OSD_NAME_NUM] = {0}; // 初始化OSD字符串数组int iUserNameLength = pExtPtzInfo->UserName.size(); // 获取用户名长度if(iUserNameLength <= 0){memset(szOSDString, 0, sizeof(szOSDString)); // 如果用户名为空,将OSD字符串数组设置为空}else{strncpy(szOSDString, pExtPtzInfo->UserName.c_str(), DH_VIDEO_OSD_NAME_NUM-1); // 否则,复制用户名到OSD字符串// 以下注释掉的代码可能是另一种格式化用户名的方式// snprintf(szOSDString, DH_VIDEO_OSD_NAME_NUM-1, "用户:%s",pExtPtzInfo->UserName.c_str());}char OSDOutBuf[DH_VIDEO_OSD_NAME_NUM] = {0}; // 初始化OSD输出缓冲区CCodeConvertMgr::CodeConverterToUTF8((unsigned char*)szOSDString,strlen(szOSDString), (unsigned char*)OSDOutBuf, sizeof(OSDOutBuf)); // 将UTF-8转换为另一种编码g_stCustomTitle.stuCustomTitle[dahuuseindex].bEncodeBlend = true; // 设置编码混合为真g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nLeft = 0; // 设置文本左边界为0g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nTop = 6500; // 设置文本顶部边框为6500(可能是像素值)g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nRight = 0; // 设置文本右边界为0g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nBottom = 6500; // 设置文本底部边框为6500(可能是像素值)strcpy(g_stCustomTitle.stuCustomTitle[dahuuseindex].szText, OSDOutBuf); // 将转换后的UTF-8字符串复制到OSD文本缓冲区}else{// 如果不启动OSD,则重置相关参数g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nLeft = 0; // 设置文本左边界为0g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nTop = 6500; // 设置文本顶部边框为6500(可能是像素值)g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nRight = 0; // 设置文本右边界为0g_stCustomTitle.stuCustomTitle[dahuuseindex].stuRect.nBottom = 6500; // 设置文本底部边框为6500(可能是像素值)g_stCustomTitle.stuCustomTitle[dahuuseindex].bEncodeBlend = false; // 设置编码混合为假}// 设置配置r = CLIENT_SetConfig(LoginID, NET_EM_CFG_CUSTOMTITLE, channel, &g_stCustomTitle, sizeof(g_stCustomTitle)); // 应用配置if (r == false){DBGPrint(M_DevCtrl, ERROR_LEVEL,"%s fail: error = %lu", __FUNCTION__, _EC(CLIENT_GetLastError())); // 如果设置失败,打印错误信息return -1; // 返回-1表示错误}// 获取文本对齐信息g_stTextAlign.dwSize = sizeof(g_stTextAlign); // 设置结构体大小r = CLIENT_GetConfig(LoginID, NET_EM_CFG_CUSTOMTITLETEXTALIGN, channel, &g_stTextAlign, sizeof(g_stTextAlign)); // 获取对齐配置if (r == false){DBGPrint(M_DevCtrl, ERROR_LEVEL,"%s fail: error = %lu", __FUNCTION__, _EC(CLIENT_GetLastError())); // 如果获取失败,打印错误信息return -1; // 返回-1表示错误}// 设置文本对齐g_stTextAlign.nCustomTitleNum = dahuuseindex + 1; // 设置自定义标题编号g_stTextAlign.emTextAlign[dahuuseindex] = EM_TEXT_ALIGNTYPE_LEFT; // 设置文本对齐类型为左对齐r = CLIENT_SetConfig(LoginID, NET_EM_CFG_CUSTOMTITLETEXTALIGN, channel, &g_stTextAlign, sizeof(g_stTextAlign)); // 应用对齐配置if (r == false){DBGPrint(M_DevCtrl, ERROR_LEVEL,"%s fail: error = %lu", __FUNCTION__, _EC(CLIENT_GetLastError())); // 如果设置失败,打印错误信息return -1; // 返回-1表示错误}DBGPrint(M_DevCtrl, DEBUG_LEVEL,"%s dahua net sdk set OSD succeed!", __FUNCTION__); // 如果一切成功,打印成功信息return 0; // 返回0表示成功}

(二)代码解释

1、概述

        这段C++代码是一个函数,名为CNetSdkForDaHua::SetOSD,其作用是设置视频流的OSDOn Screen Display,屏幕显示)信息。是大华视频设备OSD设置的一个例子,涉及到了与设备交互、错误处理和日志记录等多个方面。

2、代码详细解释

1)函数原型

        int CNetSdkForDaHua::SetOSD(bool bStart, long LoginID, int channelid, TExtPtzInfo* pExtPtzInfo) 这个函数接受五个参数:一个布尔值bStart,表示是否开始OSD显示;一个长整型LoginID,可能用于登录设备;一个整型channelid,表示视频通道号;一个指向TExtPtzInfo结构的指针pExtPtzInfo,该结构可能包含了用户名等额外信息。

2)初始检查

        if(m_bIsSetOSD == false) return 0; 如果m_bIsSetOSD标志为false,则表示不允许设置OSD,函数直接返回0

3)变量定义

        NET_OSD_CUSTOM_TITLE g_stCustomTitle; NET_OSD_CUSTOM_TITLE_TEXT_ALIGN g_stTextAlign; 定义了两个结构体变量,用于存储OSD的定制标题和文本对齐信息。

4)通道号处理

        int channel = channelid - 1; channelid1后作为通道号使用。

5)获取OSD配置

        通过CLIENT_GetConfig函数获取当前的OSD配置。

6)设置OSD显示

  • 如果bStarttrue,则开始OSD显示。
  • 创建一个字符数组szOSDString来存储OSD显示的文本。
  • pExtPtzInfo中的用户名复制到szOSDString,并对其进行编码转换以适配UTF-8格式。
  • 设置定制标题的显示位置和文本。

7)关闭OSD显示

        如果bStartfalse,则关闭OSD显示,这通过重置相关变量实现。

8)应用配置

        使用CLIENT_SetConfig函数将OSD配置应用到设备上。

9)获取和设置文本对齐

        获取当前的文本对齐设置。

        设置新的文本对齐方式。

10)错误处理

        在获取和设置配置的过程中,如果发生错误,函数会打印错误信息并返回-1

11)成功提示

        如果设置成功,打印成功信息。

12)返回值

        函数最终返回0表示成功,返回-1表示发生错误。

13)注意

  • 代码中存在一些未定义的宏,如DH_VIDEO_OSD_NAME_NUM、EM_TEXT_ALIGNTYPE_LEFT等,这些应该是在其他地方定义的常量。
  • TExtPtzInfo类型未在代码中定义,应该是外部结构体或类。
  • CLIENT_GetConfig和CLIENT_SetConfig可能是特定于某个SDK的函数,用于与视频设备进行交互。
  • DBGPrint函数用于打印日志,可能是自定义的日志函数。
  • _EC函数用于获取错误代码,也可能是特定SDK的函数。

文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


这篇关于视频监控平台-OSD源代码解释和分享:通过大华SDK设置大华设备的OSD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955949

相关文章

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

Java利用Spire.XLS for Java设置Excel表格边框

《Java利用Spire.XLSforJava设置Excel表格边框》在日常的业务报表和数据处理中,Excel表格的美观性和可读性至关重要,本文将深入探讨如何利用Spire.XLSforJava库... 目录Spire.XLS for Java 简介与安装Maven 依赖配置手动安装 JAR 包核心API介

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔