代碼說明:
1.僅僅實現服務器端的預覽代碼並不多,這也 是在VC++ Demo中不斷注釋代碼、在已經成功完成大部分功能的基礎上才試出來的,可見預覽和服務器啟動是相對獨立的。
2.Form2_Move是窗體移動時執行的,在VC++的也是在窗體移動中進行了同樣處理,否則你一移動窗體會出現難看的一幕呢 : )
3.StartVideoPrevIEw的參數RECT *rect 直接使用Rectangle結構體即可。
4.panel1是窗體是的一個面板Panel。
三、讓 客戶端連接並預覽
C# Code:
//將委托聲明為成員變量!!
STREAM_DIRECT_READ_CALLBACK sdrc;
/// <summary>
/// 預覽並客戶端連接
/// </summary>
private void PreviewAndClIEntConnect()
{
sdrc = new STREAM_DIRECT_READ_CALLBACK(STREAM_DIRECT_READ_CALLBACK1);
//[必須]注冊編碼圖像數據流直接讀取回調函數
HikVisionSDK.RegisterStreamDirectReadCallback(sdrc, this.Handle);
//[必須]啟動服務端
HikServer.MP4_ServerSetStart(new StartCap(StartCap));
//HikServer.MP4_ServerSetStop(sc);
//HikServer.MP4_ServerSetIBPMode (new SetIBP(SetIBP));
//[必須]設置回調,重新生成一個I幀
HikServer.MP4_ServerSetCapIFrame(new MakeIFrame(MakeIFrame));
//HikServer.MP4_ServerSetTTL(64);
//HikServer.MP4_ServerSetNetPort(5050, 6050);
PSERVER_VIDEOINFO videoInfo = new PSERVER_VIDEOINFO();
//初始化
videoInfo.m_datatype = new byte[64];
//設置發送緩沖區大小
HikServer.MP4_ServerSetBufNum((ushort)0, (ushort)90);
videoInfo.m_datatype[0] = (byte)ChannelDataType.SMALLPIC;
videoInfo.m_channum = (byte)1;
videoInfo.m_waittime = 5;
//設置每個通道的最大用戶數量
//HikServer.MP4_ServerMaxUser(0, 24);
if (HikServer.MP4_ServerStart (ref videoInfo) == 0)
{
MessageBox.Show("服務端啟動錯誤!!");
}
//開啟視頻預覽
StartVideoPrevIEw();
}
#region 回調函數
public void StartCap(int port)
{
HikVisionSDK.StartVideoCapture(ChannelHandle);
}
public void MakeIFrame(ulong port)
{
HikVisionSDK.CaptureIFrame(ChannelHandle);
}
public int STREAM_DIRECT_READ_CALLBACK1(int channelNum, IntPtr DataBuf, int Length, FrameType_t frameType, IntPtr context)
{
int status = 0;
HikServer.MP4_ServerWriteDataEx(channelNum, DataBuf, Length, (int)frameType, status, 0);
return 0;
}
#endregion