服務端核心功能:本地預覽 + 允許客戶端連接。關鍵在於 `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;
}
2009-03-30:`_streamCallback` 改為成員變量,解決 Release 下內存錯誤。