首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 視訊監控系列(10):服務端進階功能——IP/帳號驗證、畫質設定、OSD 疊加與板卡序列號

     編輯:關於C#

本文彙整服務端非核心但實用的四大功能模組:客戶端連線驗證(IP 與帳號密碼)、動態調整編碼畫質、OSD 字幕疊加(LOGO/時間)、讀取板卡序列號,並提供完整 C# 封裝程式碼。

一、客戶端連線驗證

1.1 IP 白名單/黑名單驗證


// 回調委派
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int CheckIP(int nChannel, string nIP);

// 註冊
HikServer.MP4_ServerCheckIP(new CheckIP(CheckIPCallback));

// 實作
public int CheckIPCallback(int nChannel, string nIP)
{
    // 例:拒絕特定 IP
    // if (nIP == "192.168.0.200") return -1;
    return 0; // 0=允許, -1=拒絕
}

1.2 帳號密碼驗證


[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int CheckPassword(string username, ushort namelen, string password, ushort passlen);

HikServer.MP4_ServerCheckPassword(new CheckPassword(CheckPasswordCallback));

public int CheckPasswordCallback(string username, ushort namelen, string password, ushort passlen)
{
    // 實際驗證邏輯(查資料庫、比對雜湊等)
    // 注意:namelen/passlen 固定為 50,非實際長度
    return ValidateUser(username, password) ? 0 : -1;
}

關鍵:委派必須聲明為類別成員,否則會被 GC 回收導致驗證失效。

二、動態設定編碼畫質

對應 VC++ SetEncoderPictureFormat,支援即時切換:


public enum PictureFormat
{
    ENC_QCIF_FORMAT = 0,  // 低畫質
    ENC_CIF_FORMAT = 1,   // 中畫質
    ENC_DCIF_FORMAT = 2,  // 中高畫質
    ENC_4CIF_FORMAT = 3   // 高畫質
}

public static void SetCurrentEncoderPictureFormat(IntPtr[] channelHandles, PictureFormat format)
{
    foreach (var handle in channelHandles)
        HikVisionSDK.SetEncoderPictureFormat(handle, format);
}

設定後畫面即時生效,無需重啟服務。

三、OSD 字幕疊加(LOGO + 時間)

OSD 疊加效果圖


private const ushort OSD_BASE = 0x9000;
private const ushort OSD_YEAR4 = OSD_BASE + 0;
private const ushort OSD_MONTH2 = OSD_BASE + 3;
private const ushort OSD_DAY = OSD_BASE + 4;
private const ushort OSD_HOUR24 = OSD_BASE + 7;
private const ushort OSD_MINUTE = OSD_BASE + 9;
private const ushort OSD_SECOND = OSD_BASE + 10;

public void SetOsd(IntPtr[] channelHandles, bool enable)
{
    if (enable)
    {
        // 第一行:固定文字 "HIKVISION"
        ushort[] fmt1 = { 48, 16, 'H','I','K','V','I','S','I','O','N', '\0' };
        // 第二行:時間格式 YYYY-MM-DD HH:MM:SS
        ushort[] fmt2 = { 24, 50, OSD_YEAR4, '-', OSD_MONTH2, '-', OSD_DAY, '-', OSD_HOUR24, ':', OSD_MINUTE, ':', OSD_SECOND, '\0' };

        foreach (var h in channelHandles)
        {
            HikVisionSDK.SetOsdDisplayMode(h, 255, true, 0, fmt1, fmt2);
            HikVisionSDK.SetOsd(h, true);
        }
    }
    else
    {
        foreach (var h in channelHandles)
            HikVisionSDK.SetOsd(h, false);
    }
}

中文顯示補充:將 fmt1 中對應字元替換為 Unicode 內碼(如「保」= 0xB1A3)即可顯示漢字。

四、取得板卡序列號


public static string GetBoardSN()
{
    uint count = HikVisionSDK.GetBoardCount();
    StringBuilder sn = new StringBuilder();
    for (uint i = 0; i < count; i++)
    {
        DS_BOARD_DETAIL detail = new DS_BOARD_DETAIL();
        HikVisionSDK.GetBoardDetail(i, ref detail);
        for (int j = 0; j < 12; j++)
            sn.Append((char)(detail.sn[j] + 0x30));
        break; // 只取第一張
    }
    return sn.ToString();
}

注意:結構體需 ref 傳遞;sn 陣列實際僅前 12 位有效。

結語

服務端核心功能至此完結,後續將進入播放器篇。感謝持續關注本系列!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved