spw1234 2025-05-12 16:08 采纳率: 0%
浏览 6

使用海康设备网络sdk修改osd后页面不更新

使用设备网络sdk修改osd后页面不更新,前往网页中的‘配置-常用配置-OSD配置’页面查看字符叠加下对应的字符内容是正常更新的,点击该页面下的保存按钮才会更新视频中的OSD。

下面是我使用C#调用相应功能的代码


#region OSD
 
/// <summary>/// 获取OSD/// </summary>/// <param name="device_num"></param>private NET_DVR_SHOWSTRING_V30 getOSD(int i_lUserID){
    //获取球机位置信息结构体大小
    int size = Marshal.SizeOf(typeof(NET_DVR_SHOWSTRING_V30));
    //设置指针空间大小
    IntPtr ptrOSD = Marshal.AllocHGlobal(size);
    uint result = 0;
    NET_DVR_GetDVRConfig(i_lUserID, 1030, 1, ptrOSD, (uint)size, ref result);
    NET_DVR_SHOWSTRING_V30 dVR_OSDPOS = (NET_DVR_SHOWSTRING_V30)Marshal.PtrToStructure(ptrOSD, typeof(NET_DVR_SHOWSTRING_V30));
 
    return dVR_OSDPOS;
}
 
/// <summary>/// 设置OSD/// </summary>/// <param name="device_num"></param>private void setOSD(int i_lUserID, NET_DVR_SHOWSTRING_V30 structure){
    int size = Marshal.SizeOf(typeof(NET_DVR_SHOWSTRING_V30));
    byte[] buffer = new byte[size];
    IntPtr bufferIntPtr = Marshal.AllocHGlobal(size);
    try
    {
        Marshal.StructureToPtr(structure, bufferIntPtr, true);
        Marshal.Copy(bufferIntPtr, buffer, 0, size);
    }
    finally
    {
        Marshal.FreeHGlobal(bufferIntPtr);
    }
 
    IntPtr imgPtr = Marshal.AllocHGlobal(buffer.Length);
    Marshal.Copy(buffer, 0, imgPtr, buffer.Length);
 
    if (!NET_DVR_SetDVRConfig(i_lUserID, 1031, 1, imgPtr, (uint)size))
    {
        Console.WriteLine("osd没改上:" + NET_DVR_GetLastError());
    }
 
}
 
 
 
#endregion OSD
 
private void osd_button_Click(object sender, EventArgs e){
    NET_DVR_SHOWSTRING_V30 osds = getOSD(real_PlayPOJOs[0].I_lUserID);
 
    Console.WriteLine("===================================================================================");
    for (int i1 = 0; i1 < osds.struStringInfo.Length; i1++)
    {
        /*
                            Console.WriteLine("预览的图象上是否显示字符,0-不显示,1-显示 区域大小704*576,单个字符的大小为32*3");
                            Console.WriteLine("wShowString:" + dVR_OSDPOS.struStringInfo[i1].wShowString);
 
                            Console.WriteLine(" 该行字符的长度,不能大于44个字符");
                            Console.WriteLine("wStringSize:" + dVR_OSDPOS.struStringInfo[i1].wStringSize);
 
                            Console.WriteLine("字符显示位置的x坐标");
                            Console.WriteLine("wShowStringTopLeftX:" + dVR_OSDPOS.struStringInfo[i1].wShowStringTopLeftX);
 
                            Console.WriteLine("字符名称显示位置的y坐标");
                            Console.WriteLine("wShowStringTopLeftY:" + dVR_OSDPOS.struStringInfo[i1].wShowStringTopLeftY);
 
                            Console.WriteLine("要显示的字符内容");
        */
        Console.WriteLine("sString:" + i1 + osds.struStringInfo[i1].sString + "asdhujgkasdhukj");
        //osds.struStringInfo[0].sString = "CH4:" + 50 + "ppm.m";
    }
    osds.struStringInfo[0].wShowString = 1;
    osds.struStringInfo[0].sString += "C";
    //  Console.WriteLine("===================================================================================");
 
    setOSD(real_PlayPOJOs[0].I_lUserID, osds);
}





  • 写回答

1条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-12 17:03
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。
    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    根据您描述的问题和提供的代码,问题在于通过SDK修改OSD后需要手动在网页界面点击保存才能生效。以下是分析和解决方案:

    问题分析

    1. 您的代码逻辑是正确的,能够成功调用SDK接口修改OSD配置
    2. 海康设备可能存在两种配置模式:
      • 运行时配置(临时生效)
      • 持久化配置(需要保存到设备)

    解决方案

    1. 强制保存配置(推荐)

    在设置OSD后,调用保存配置的接口:

    // 在setOSD方法后添加保存配置的调用
    if (!NET_DVR_SaveConfig(i_lUserID))
    {
        Console.WriteLine("保存配置失败:" + NET_DVR_GetLastError());
    }
    

    2. 修改代码确保完全配置

    您的代码中可能需要更完整的OSD配置:

    private void setOSD(int i_lUserID, NET_DVR_SHOWSTRING_V30 structure)
    {
        // 确保所有必要字段已设置
        structure.dwSize = (uint)Marshal.SizeOf(typeof(NET_DVR_SHOWSTRING_V30));
        
        int size = Marshal.SizeOf(typeof(NET_DVR_SHOWSTRING_V30));
        IntPtr ptr = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.StructureToPtr(structure, ptr, false);
            if (!NET_DVR_SetDVRConfig(i_lUserID, NET_DVR_SET_SHOWSTRING, 1, ptr, (uint)size))
            {
                Console.WriteLine("设置OSD失败:" + NET_DVR_GetLastError());
            }
            else
            {
                // 保存配置
                NET_DVR_SaveConfig(i_lUserID);
            }
        }
        finally
        {
            Marshal.FreeHGlobal(ptr);
        }
    }
    

    3. 检查设备参数

    确保设备支持实时更新OSD:

    • 某些设备型号需要重启通道或设备才能生效
    • 检查设备固件是否为最新版本

    4. 完整调用示例

    以下是修改后的按钮点击事件处理:

    private void osd_button_Click(object sender, EventArgs e)
    {
        NET_DVR_SHOWSTRING_V30 osds = getOSD(real_PlayPOJOs[0].I_lUserID);
        
        // 修改OSD内容
        osds.struStringInfo[0].wShowString = 1;
        osds.struStringInfo[0].sString = "CH4:50ppm.m"; // 使用固定长度避免截断
        
        // 设置并保存
        setOSD(real_PlayPOJOs[0].I_lUserID, osds);
        
        // 可能需要刷新视频流
        // NET_DVR_RefreshPlay(real_PlayPOJOs[0].I_lRealPlayHandle);
    }
    

    注意事项

    1. 字符串长度不要超过wStringSize限制
    2. 确保坐标值wShowStringTopLeftX/Y在有效范围内
    3. 某些设备可能需要调用NET_DVR_RefreshPlay刷新视频流

    如果问题仍然存在,建议联系海康技术支持确认设备的具体行为特性。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月12日