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

C# 視頻監控系列(八):服務端預覽與客戶端連接(五)

     編輯:關於C語言

服務端核心功能:本地預覽 + 允許客戶端連接。關鍵在於 `MakeIFrame` 回調必須執行,否則客戶端無畫面。

核心流程


// 成員變量:委托防 GC
private STREAM_DIRECT_READ_CALLBACK _streamCallback;

private void PreviewAndClientConnect() {
    _streamCallback = new STREAM_DIRECT_READ_CALLBACK(OnStreamData);

    // [必須] 註冊流數據回調
    HikVisionSDK.RegisterStreamDirectReadCallback(_streamCallback, Handle);

    // [必須] 註冊服務端回調
    HikServer.MP4_ServerSetStart(new StartCap(OnStartCap));
    HikServer.MP4_ServerSetCapIFrame(new MakeIFrame(OnMakeIFrame));
    // 可選:MP4_ServerSetStop, MP4_ServerSetIBPMode, MP4_ServerSetTTL...

    // 啟動服務端
    var info = new PSERVER_VIDEOINFO {
        m_datatype = new byte[64],
        m_channum = 1,
        m_waittime = 5
    };
    info.m_datatype[0] = (byte)ChannelDataType.SMALLPIC;
    HikServer.MP4_ServerSetBufNum(0, 90);
    if (HikServer.MP4_ServerStart(ref info) == 0)
        MessageBox.Show("服務端啟動失敗");

    // 開啟本地預覽
    StartVideoPreview();
}

// 回調實現
public void OnStartCap(int port) => HikVisionSDK.StartVideoCapture(_channelHandle);
public void OnMakeIFrame(ulong port) => HikVisionSDK.CaptureIFrame(_channelHandle);

public int OnStreamData(int chan, IntPtr data, int len, FrameType_t type, IntPtr ctx) {
    int status = 0;
    HikServer.MP4_ServerWriteDataEx(chan, data, len, (int)type, status, 0);
    return 0;
}

關鍵提示

  • `StartVideoPreview` 參數用 `Rectangle` 而非 `RECT`
  • `GetDspCount` 返回可用 DSP 數,`GetTotalDSPs` 返回總數
  • 委托必須聲明為成員變量,否則 Release 模式下回調失效
  • 本功能完成即意味著服務端 60% 核心就緒

修正記錄

2009-03-30:`_streamCallback` 改為成員變量,解決 Release 下內存錯誤。

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