前言
本章将伺服器端幾個非主要但常用的功能分享一下。
注意
本系列文章限于學習交流,注重過程,由于涉及公司,是以不提供源代碼下載下傳,非常抱歉!!但是請大家放心,核心、實作以及其他能夠貼出來的代碼我都會貼出來,并且争取盡所能的回答留言裡的每一個問題,感謝大家關注,歡迎交流 :)
系列
正文
一、驗證
1.1 ip驗證
vc++ code:
oninitdialog方法
mp4_servercheckip(checkip);
checkip委托
int callback checkip(dword nchannel,char* nip)
{
/*
cstring ctemp;
ctemp.format("%s",nip);
if (ctemp == "192.0.0.215")
return -1;
*/
return 0;
}
代碼說明:
1. 自帶的例子ip驗證部分注釋掉了,但是可以看得出傳回-1表示錯誤,傳回0表示驗證通過,并且實際證明如果傳回-1的話用戶端是不出圖像的。
c# code:
/// <summary>
/// 驗證ip
/// </summary>
/// <param name="nchannel">通道号</param>
/// <param name="nip">ip位址</param>
/// <returns></returns>
public int checkip(int nchannel, string nip)
{
//驗證代碼
return 0;
}
代碼說明:
1. 比較簡單,填寫自己的驗證代碼,正确傳回0,不正确反正-1就可以了。
1.2 使用者名密碼驗證
mp4_servercheckpassword(checkpassword);
checkpassword委托
int callback checkpassword(char *username,word namelen,char *password,word passlen)
if ((username[0] == '1') && (username[1] == '2') && (username[2] == '3') && (password[0] == 'w'))
return 0;
else
/// 驗證使用者名密碼
/// <param name="username">使用者名</param>
/// <param name="namelen">使用者名長度</param>
/// <param name="password">密碼</param>
/// <param name="passlen">密碼長度</param>
public int checkpassword(string username, ushort namelen, string password, ushort passlen)
這部分和驗證ip差不多,唯一需要注意的是把委托寫成成員變量!!
二、設定畫面采集品質
從vc++例子中settings中可以看到這個設定:
vc++ code:
方法onsettings()
switch(dlg.m_iencodetype)
{
case 0:
encodetype = enc_4cif_format;
break;
case 1:
encodetype = enc_2cif_format;
case 2:
encodetype = enc_dcif_format;
case 3:
encodetype = enc_cif_format;
case 4:
encodetype = enc_qcif_format;
default:
}
for(i = 0; i < gettotaldsps(); i++)
if(encodetype != enc_4cif_format)
{
setencoderpictureformat(channelhandle[i],encodetype);
}
else if ((i%4==0)||(i%4==1))
c# code:
/// 設定目前所有攝頭錄制的畫面品質
/// <param name="channelhandle"></param>
/// <param name="t">編碼圖像分辨率</param>
public static void setcurrentencoderpictureformat(intptr[] channelhandle, pictureformat_t t)
for (int i = 0; i < channelhandle.length; i++)
hikvisionsdk.setencoderpictureformat(channelhandle[i], t);
代碼說明:
1. 枚舉pictureformat_t說明:
pictureformat_t.enc_qcif_format 低品質
pictureformat_t.enc_cif_format 中品質
pictureformat_t.enc_dcif_format 中高品質
pictureformat_t.enc_4cif_format 高品質
2. 設定後畫面效果能實時改變。
三、設定字幕疊加
一般用于顯示公司logo和日期,下圖黃色區域所示
vc ++ code:
ushort format1[40] = {48, 16, 'h','i','k','v', 'i','s','i','o','n', '\0'};
ushort format2[40] = {24, 50, _osd_year4, '-',_osd_month2,'-',_osd_day,'-', _osd_hour24, ':', _osd_minute,':', _osd_second, '\0'};
//
其他代碼
for(i = 0; i < gettotaldsps(); i++){
setosddisplaymode(channelhandle[i], 255, true, 0, format1, format2);
setosd(channelhandle[i], true);
c# code:
private const ushort _osd_base = 0x9000;
private const ushort _osd_year4 = _osd_base + 0;
private const ushort _osd_year2 = _osd_base + 1;
private const ushort _osd_month3 = _osd_base + 2;
private const ushort _osd_month2 = _osd_base + 3;
private const ushort _osd_day = _osd_base + 4;
private const ushort _osd_week3 = _osd_base + 5;
private const ushort _osd_cweek1 = _osd_base + 6;
private const ushort _osd_hour24 = _osd_base + 7;
private const ushort _osd_hour12 = _osd_base + 8;
private const ushort _osd_minute = _osd_base + 9;
private const ushort _osd_second = _osd_base + 10;
/// 設定osd
/// <param name="setvalue"></param>
public void setosd(intptr[] channelhandle, bool setvalue)
if (setvalue)
ushort[] format1 = new ushort[]{ 48, 16, 'h', 'i', 'k', 'v', 'i', 's', 'i', 'o', 'n', '\0' };
ushort[] format2 = new ushort[]{ 24, 50, _osd_year4, '-', _osd_month2, '-', _osd_day, '-', _osd_hour24, ':', _osd_minute, ':', _osd_second, '\0' };
for (int i = 0; i < channelhandle.length; i++)
{
hikvisionsdk.setosddisplaymode(channelhandle[i], 255, true, 0, format1, format2);
hikvisionsdk.setosd(channelhandle[i], true);
else
hikvisionsdk.setosd(channelhandle[i], false);
代碼說明:
1. 注意設定中文字元有問題,暫時沒有解決。
2. 關于時間顯示可以翻閱api文檔,說明得很詳細。
四、擷取闆卡序列号
vc++ code: 這段代碼并不在net server demo項目裡面,而是在system demo(src\sysdemosource)項目裡。
boardlist.cpp
char str[100];
char sn[12+1];
m_list.deleteallitems();
boardcount=getboardcount();
for(uint board=0;board<boardcount;board++)
{
getboarddetail(board,&boarddetail);
for(uint i=0;i<12;i++)
sn[i]=boarddetail.sn[i]+0x30;
sn[12]=0;
sprintf(str,"board:%2u type:%s,sn:%s",
board,boardtype[boarddetail.type],sn);
/// 擷取闆卡序号
public static string getboardsn()
uint boardcount = hikvisionsdk.getboardcount();
stringbuilder sn = new stringbuilder();
for (uint i = 0; i < boardcount; )
ds_board_detail boarddetail = new ds_board_detail();
hikvisionsdk.getboarddetail(i, ref boarddetail);
for (int j = 0; j < 12; j++)
sn.append((char)(boarddetail.sn[j] + 0x30));
return sn.tostring();
1. 注意結構體用ref;以及boarddetail.sn[j]的類型轉換。
五、文章後期維護
5.1 2010-10-9 osd顯示漢字辦法
漢字"保"的機器内碼是"b1a3h",将如下代碼替換:
替換前:new ushort[]{ 48, 16, 'h', 'i', 'k', 'v', 'i', 's', 'i', 'o', 'n', '\0' };
替換後:new ushort[]{ 48, 16, 0xb1a3, 'i', 'k', 'v', 'i', 's', 'i', 'o', 'n', '\0' };
這樣就能顯示漢字了,這裡再次感謝,也歡迎大家分享和交流!
結束
伺服器端和用戶端一樣三篇文章,至此結束,接下來是播放器。感謝大家繼續關注該系列文章!!
轉載:http://www.cnblogs.com/over140/archive/2009/03/22/1415041.html