前言
由於音頻接收這塊的代碼和說明不多,就和功能一起寫了,Let's GO! !
注意
本系列文章限於學習交流,注重過程,由於涉及公司,所以不提供原始碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,並且爭取盡所能的回答留言裡的每一個問題,感謝大家關注,歡迎交流
系列
1. C# 視頻監控系列(1):準備
2. C# 視頻監控系列(2):用戶端——封裝API
3. C# 視頻監控系列(3):用戶端——串連伺服器
4. C# 視頻監控系列(4):用戶端——音頻接收和抓圖
本文
一、 寫了三篇文章,來一張介面的草圖,讓大夥心裡有個數。
二、 音頻接受
音頻接受的代碼比較簡單,伺服器端是預設開啟的,只要你將拾音器接上板卡接上標有AID 1/2/3/4白色線就可以了。
VC++ Code:
if (nn1 >= 0 )
{
MP4_ClientAudioStart(nn1);
MP4_ClientAudioVolume(0xfff0);
}
C# Code:
if (cs >= 0)
{
PcHikClient.MP4_ClientAudioStart(cs);
PcHikClient.MP4_ClientAudioVolume(0xffff);
}
注意MP4_ClientAudioVolume設定的音量值範圍:(0-0xffff)。
三、 抓圖、
VC++ Code:
MP4_ClientSetCapPicCallBack(nn1,CapPicFun);
void CALLBACK CapPicFun(long nPort,\
char * pBuf,long nSize,\
long nWidth,long nHeight,\
long nStamp,long nType,long nReceaved)
{
if(!((g_bCapPic) && (nPort == ipos)))
return;
CString csFile;
switch(nType)
{
case T_UYVY:
csFile="c:\\uyvy.bmp";
break;
case T_YV12:
csFile="c:\\yv12.bmp";
break;
case T_RGB32:
csFile="c:\\rgb.bmp";
break;
default:
return ;
}
MP4_ClientSavePicFile(pBuf,nSize,nWidth,nHeight,nType,csFile.GetBuffer(csFile.GetLength()));
g_bCapPic=FALSE;
}
可以看得出,是通過回調來實現了,這裡注意了,我們在寫對應的回呼函數的時候,需要把回調執行個體成成員變數。
C# Code:
private const int T_UYVY = 1;
private const int T_YV12 = 3;
private const int T_RGB32 = 7;
private CapPicFun cpf;
private void button3_Click(object sender, EventArgs e)
{
PcHikClient.MP4_ClientSetCapPicCallBack(cs, cpf);
}
//public void CapPicFun1(int StockHandle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 152064)] byte[] pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
public void CapPicFun1(int StockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
{
string csFile = string.Empty;
switch (nType)
{
case T_UYVY:
csFile = @"c:\uyvy.bmp";
break;
case T_YV12:
csFile = @"c:\yv12.bmp";
break;
case T_RGB32:
csFile = @"c:\rgb32.bmp";
break;
}
PcHikClient.MP4_ClientSavePicFile(pBuf, nSize, nWidth, nHeight, nType, csFile);
//停止執行回調
PcHikClient.MP4_ClientSetCapPicCallBack(cs, null);
}
代碼說明:
1. button3點擊事件對應的是介面上點擊按鈕的事件。
2. 從API文檔中我們可以看到關於MP4_ClientSetCapPicCallBack的說明:“注意要儘快返回,如果要停止回調,可以把回呼函數指標CapPicFun設為NULL。一旦設定回呼函數,則一直有效,直到程式退出。”。
3. 請注意在上文的基礎上運行用戶端連上伺服器並顯示視頻畫面後再調用本函數,否則函數既不報錯也不會截取圖片。
4. 委託private CapPicFun cpf;的執行個體化我是在Form1_Load中進行的:cpf = new CapPicFun(CapPicFun1);
5. 不出意外的話,按照預設配置您的C盤根目錄下應該會有yv12.bmp : )
結束
功能也是在我邊寫這篇文章的時候邊實踐的,用原來的API發現能並儲存,但是圖片開啟是黑色的,後來修改參數類型才對。當然我也更新了前面的文章的API,希望一直這樣比較順利的完成這系列的文章,不得不誇海康的卡確實做的不錯!!