VideoWin.cpp的OnPaint方法
StartVideoPrevIEw(&dc);
VideoWin.cpp的StartVideoPrevIEw方法
for(int i = 0; i < GetTotalDSPs(); i++){
StopVideoPrevIEw(ChannelHandle[i]);
}
RECT prevIEwWnd;
GetClientRect(&prevIEwWnd);
//CDC *pDC = GetDlgItem(IDC_VIDEOWIN)->GetDC();
CBrush tempBrush(RGB(10, 10, 10));
CBrush *oldBrush = dc->SelectObject(&tempBrush);
dc->Rectangle(&prevIEwWnd);
dc->SelectObject(oldBrush);
int rectWidth = previewWnd.right - prevIEwWnd.left;
int rectHeight = previewWnd.bottom - prevIEwWnd.top;
int numRects = GetTotalDSPs();
ZeroMemory(rectList, sizeof(rectList));
numRects = CacRects(GetTotalDSPs());
for(i = 0; i < GetTotalDSPs(); i++){
if(bDdrawMode)
::StartVideoPrevIEw(ChannelHandle[i], m_hWnd, &rectList[i], FALSE, vdfRGB16, 25);
else
::StartVideoPrevIEw(ChannelHandle[i], m_hWnd, &rectList[i], FALSE, vdfYUV422Planar, 25);
}
1.2.代碼分析
1.從OnInitDialog中並參照《DS-4000HC、HCS、HC+、HF、HS、MD卡的Windows編程指南V4.3》的 [API調用順序](pdf 21頁)以及對應的注釋能看得出基本上是做板卡的初始化,服務器的初始化等。
2.StreamDirectReadCallback回調 函數主要是通過MP4_ServerWriteDataEx將數據寫入內存(文檔注釋:往發送緩存寫數據。)和用_write寫文件做存儲視頻錄像。
3.預覽的 代碼是在OnPaint事件調用的。
二、服務器端預覽
C# Code:
#region 變量
IntPtr ChannelHandle;
#endregion
#region 窗體事件
private void Form2_Load(object sender, EventArgs e)
{
//設置系統默認的視頻制式
HikVisionSDK.SetDefaultVideoStandard(VideoStandard_t.StandardNTSC);
//初始化板卡
if (HikVisionSDK.InitDSPs() < 0)
{
MessageBox.Show("初始化DSPs失敗!!");
return;
}
if (HikVisionSDK.GetTotalDSPs() == 0)
{
MessageBox.Show("沒有可用的通道!!您是否已經啟動服務器端?");
return;
}
//打開通道
ChannelHandle = HikVisionSDK.ChannelOpen(0);
//設置編碼幀結構、幀率
HikVisionSDK.SetIBPMode(ChannelHandle, 100, 2, 1, 25);
//設置編碼圖像質量
HikVisionSDK.SetDefaultQuant(ChannelHandle, 15, 15, 20);
//視頻預覽
StartVideoPrevIEw();
}
/// <summary>
/// 視頻預覽
/// </summary>
private void StartVideoPrevIEw()
{
Rectangle rect = panel1.ClIEntRectangle;
HikVisionSDK.StartVideoPrevIEw(ChannelHandle, panel1.Handle, ref rect, false, (int) TypeVideoFormat.vdfRGB16, 25);
}
/// <summary>
/// 窗體移動
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form2_Move(object sender, EventArgs e)
{
HikVisionSDK.StopVideoPrevIEw(ChannelHandle);
StartVideoPrevIEw();
}
#endregion