博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号...
阅读量:6316 次
发布时间:2019-06-22

本文共 5912 字,大约阅读时间需要 19 分钟。

前言

     本章将服务器端几个非主要但常用的功能分享一下。

 

注意

     本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)

 

系列

     1.     

     2.     

     3.     

     4.     

     5.     

     6.     

     7.     

     8.     

     9.      

     10.      

 

正文

     一、验证

          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     用户名密码验证

               VC++ Code:

                    OnInitDialog方法

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
        return -1;
*/
    
return
 
0
;
}

               C# Code:

        
///
 
<summary>
        
///
 验证用户名密码
        
///
 
</summary>
        
///
 
<param name="username">
用户名
</param>
        
///
 
<param name="namelen">
用户名长度
</param>
        
///
 
<param name="password">
密码
</param>
        
///
 
<param name="passlen">
密码长度
</param>
        
///
 
<returns></returns>
        
public
 
int
 CheckPassword(
string
 username, 
ushort
 namelen, 
string
 password, 
ushort
 passlen)
        {
            
//
验证代码
            
return
 
0
;
        }

               这部分和验证IP差不多,唯一需要注意的是把委托写成成员变量!!

 

     二、设置画面采集质量 

           从VC++例子中Settings中可以看到这个设置:

          

          VC++ Code:

               方法OnSettings()

switch
(dlg.m_iEncodeType)
            {
            
case
 
0
:
                encodeType 
=
 ENC_4CIF_FORMAT;
                
break
;
            
case
 
1
:
                encodeType 
=
 ENC_2CIF_FORMAT;
                
break
;
            
case
 
2
:
                encodeType 
=
 ENC_DCIF_FORMAT;
                
break
;
            
case
 
3
:
                encodeType 
=
 ENC_CIF_FORMAT;
                
break
;
            
case
 
4
:
                encodeType 
=
 ENC_QCIF_FORMAT;
                
break
;
            
default
:
                encodeType 
=
 ENC_CIF_FORMAT;
                
break
;
            }
            
for
(i 
=
 
0
; i 
<
 GetTotalDSPs(); i
++
)
            {
                
if
(encodeType 
!=
 ENC_4CIF_FORMAT)
                {                    
                    SetEncoderPictureFormat(ChannelHandle[i],encodeType);
                }
                
else
 
if
 ((i
%
4
==
0
)
||
(i
%
4
==
1
))
                {                    
                    SetEncoderPictureFormat(ChannelHandle[i],encodeType);
                }
            }

          C# Code:

        
///
 
<summary>
        
///
 设置当前所有摄头录制的画面质量
        
///
 
</summary>
        
///
 
<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:

               方法OnSettings()

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
;
        
///
 
<summary>
        
///
 设置Osd
        
///
 
</summary>
        
///
 
<param name="ChannelHandle"></param>
        
///
 
<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
            {
                
for
 (
int
 i 
=
 
0
; i 
<
 ChannelHandle.Length; i
++
)
                {
                    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);

          C# Code:

        
///
 
<summary>
        
///
 获取板卡序号
        
///
 
</summary>
        
///
 
<returns></returns>
        
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
));
                }
                
break
;
            }
            
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

你可能感兴趣的文章
前端工程资源发布、优化
查看>>
nginx安装(ubuntu14.04)
查看>>
SQLServer2008备份和恢复
查看>>
WinCE 6.0 的编译
查看>>
访问Nginx上的资源时出现403的原因及解决办法
查看>>
大家好,我是蔡某某,刚刚注册的账号,希望大家支持与帮助
查看>>
shell检测输入的IP是否合法
查看>>
30 分钟快速入门 Docker 教程
查看>>
初步计划
查看>>
位运算的运用
查看>>
从G1设计到堆空间调整
查看>>
apache限制并发数,IP,带宽设置
查看>>
GraphicsMagick介绍及安装
查看>>
Linux-安装Mysql
查看>>
ansible playbook备忘
查看>>
Jmeter(二)-使用代理录制脚本
查看>>
Cloudify——The Universal Service Manager (USM)
查看>>
Cocos2d-x::Actions
查看>>
MySQL表名不区分大小写的设置方法
查看>>
C primer plus 第5章 运算符、表达式和语句 5.1循环简价
查看>>