海康解码器上大屏 怎么实现1屛(占一个完整的屏幕)

a799821554 2015-11-17 09:22:34
/// <summary>
/// 解码器视频上墙
/// </summary>
/// <param name="UserID">注册解码器成功后返回的id</param>
/// <param name="EquIP">前端摄像机设备IP</param>
/// <param name="DecoderChannel">解码器通道</param>
/// <param name="EquChannel">前端摄像机通道</param>
/// <param name="UName">设备用户名</param>
/// <param name="Upwd">设备密码</param>
/// <param name="Port">设备端口</param>
/// <param name="WindowMode">解码器分屏模式 1屏 4屏 对应传入 1或4 </param>
/// <param name="Type">解码类型 0-主动解码 1-被动解码</param>
/// <param name="WindowModeChannel">分屏模式后 屏幕对应的通道号</param>
/// <param name="Vga">输出的Vga口</param>
public void HaiKangDecoder(int UserID, string EquIP, int DecoderChannel, int EquChannel,string UName,string Upwd,string Port,uint WindowMode, int Type,string[] WindowModeChannel,ushort Vga)
{
if (Type == 0)//主动解码
{
#region 主动解码-实时流
//设备能力集结构体
CHCNetSDK.CHCNetSDK.NET_DVR_MATRIX_ABILITY_V41 struDecoderCapability=new CHCNetSDK.CHCNetSDK.NET_DVR_MATRIX_ABILITY_V41();
//结构体变量赋予初始长度
struDecoderCapability.byRes1 = new byte[5];
struDecoderCapability.byRes1 = new byte[119];
//struDecoderCapability.struDispMode = new CHCNetSDK.CHCNetSDK.NET_DVR_DISPWINDOWMODE[32];
//定义能力类型
uint dwAbilityType = 0x260;//多路解码器显示、解码能力
//定义输出长度
byte byDispMode = 0;
//获取结构体长度
uint OutSize = (uint)Marshal.SizeOf(struDecoderCapability);
//获取解码器能力集
if (CHCNetSDK.CHCNetSDK.NET_DVR_GetDeviceAbility(UserID, dwAbilityType,null, 0, out struDecoderCapability, OutSize))
{
//获取成功 将分屏模式设定为 最后一个模式
for (int i = 0; i < CHCNetSDK.CHCNetSDK.MAX_DISPNUM_V41; i++)
{
if (struDecoderCapability.struDispMode[i].byDispChanType == 1 && struDecoderCapability.struDispMode[i].byDispChanSeq == 1)
{
for (int j = 0; j <CHCNetSDK.CHCNetSDK.MAX_WINDOWS_NUM; j++)
{
if (struDecoderCapability.struDispMode[i].byDispMode[j] > 0)
{
byDispMode = struDecoderCapability.struDispMode[i].byDispMode[j];
}
}
}
}

} //Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
//设置初始通道 此处为代码事例 需后续测试
uint DecChanNum = (uint)(struDecoderCapability.byStartChan + 1);//uint.Parse(DecoderChannel.ToString());// (uint)struDecoderCapability.byStartChan + 1;
//设置解码通道为开: 0表示关闭,1表示打开
if (CHCNetSDK.CHCNetSDK.NET_DVR_MatrixSetDecChanEnable(UserID, (uint)DecoderChannel, 1))//设置解码通道开关,如果设置为关,通道将停止解码
{
//Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
}
//配置显示通道参数,包括画面分割、关联解码通道
ushort DispChanNum =ushort.Parse((struDecoderCapability.struVgaInfo.byStartChan+1).ToString());
//VGA1
CHCNetSDK.CHCNetSDK.NET_DVR_MATRIX_VOUTCFG struVoutCfg = new CHCNetSDK.CHCNetSDK.NET_DVR_MATRIX_VOUTCFG();
if (!CHCNetSDK.CHCNetSDK.NET_DVR_MatrixGetDisplayCfg_V41(UserID,Vga/*Convert.ToInt32(DispChanNum)*/, out struVoutCfg))
{
//Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
}
//取VGA1支持的画面分割能力的最后一个模式
struVoutCfg.dwWindowMode =WindowMode;
//将关联窗口初始为0
for (int i = 0; i < CHCNetSDK.CHCNetSDK.MAX_WINDOWS_V41; i++) //此处可根据实际解码器的通道设置
{
struVoutCfg.byJoinDecChan[i] =0;
}
//窗口关联解码通道
struVoutCfg.byJoinDecChan[0] =(byte)((WindowModeChannel[0] == "" || WindowModeChannel[0] == null) ? 0 :Convert.ToInt32(WindowModeChannel[0]));
struVoutCfg.byJoinDecChan[1] = (byte)((WindowModeChannel[1] == "" || WindowModeChannel[1] == null) ? 1 : Convert.ToInt32(WindowModeChannel[1]));
struVoutCfg.byJoinDecChan[2] = (byte)((WindowModeChannel[2] == "" || WindowModeChannel[2] == null) ? 2 : Convert.ToInt32(WindowModeChannel[2]));
struVoutCfg.byJoinDecChan[3] = (byte)((WindowModeChannel[3] == "" || WindowModeChannel[3] == null) ? 3 : Convert.ToInt32(WindowModeChannel[3]));


//设置分屏显示
if (!CHCNetSDK.CHCNetSDK.NET_DVR_MatrixSetDisplayCfg_V41(UserID,Vga/* DispChanNum*/, ref struVoutCfg))
{
//Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
}
//启动动态解码
CHCNetSDK.CHCNetSDK.NET_DVR_PU_STREAM_CFG_V41 struDynamicInfo = new CHCNetSDK.CHCNetSDK.NET_DVR_PU_STREAM_CFG_V41();
struDynamicInfo.Init();
struDynamicInfo.uDecStreamMode.byRes = new byte[300];
//取流模式byStreamMode:0- 无效,1- 通过IP或域名取流,2- 通过URL取流,3- 通过动态域名解析向设备取流
struDynamicInfo.byStreamMode = 1;
//获取结构体长度
struDynamicInfo.dwSize =Marshal.SizeOf(typeof(CHCNetSDK.CHCNetSDK.NET_DVR_PU_STREAM_CFG_V41));
//声明前端设备信息结构体对象
CHCNetSDK.CHCNetSDK.NET_DVR_DEC_STREAM_DEV_EX devex = new CHCNetSDK.CHCNetSDK.NET_DVR_DEC_STREAM_DEV_EX();
//初始化值
devex.struDevChanInfo.Init();
//通道类型:0-普通通道,1-零通道,2-流ID,解码器支持的通道类型可以通过能力集DECODER_ABILITY获取
devex.struDevChanInfo.byChanType = 0;
//前端设备IP地址
System.Text.Encoding.ASCII.GetBytes(EquIP).CopyTo(devex.struDevChanInfo.byAddress, 0);
//前端设备服务端口
devex.struDevChanInfo.wDVRPort = ushort.Parse(Port);
//取通道1的码流
devex.struDevChanInfo.byChannel = (byte)EquChannel;
//前端设备登录用户名
System.Text.Encoding.ASCII.GetBytes(UName).CopyTo(devex.struDevChanInfo.sUserName, 0);
//前端设备登录密码
System.Text.Encoding.ASCII.GetBytes(Upwd).CopyTo(devex.struDevChanInfo.sPassword, 0);
//厂家私有协议,其他类型可以通过接口NET_DVR_GetIPCProtoList获取
//设置协议类型 默认为0 厂家私有协议
devex.struDevChanInfo.byFactoryType = 0;
//将结构体转换为byte[]
object ModeDevChan=devex;
//将转换后的值赋值给数组
struDynamicInfo.uDecStreamMode.byRes = _analy.StructToBytes(ModeDevChan);
//开始解码
if (CHCNetSDK.CHCNetSDK.NET_DVR_MatrixStartDynamic_V41(UserID,/*Convert.ToInt32(DecChanNum)*/DecoderChannel,ref struDynamicInfo))
{
//Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
}
//Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
//停止解码
//if (!CHCNetSDK.CHCNetSDK.NET_DVR_MatrixStopDynamic(UserID, DecoderChannel))
//{
// Console.WriteLine(CHCNetSDK.CHCNetSDK.NET_DVR_GetLastError());
//}

#endregion
}

}


这个只能实现1、4屛 1屛是小的窗口和4屛中的一个小窗口一样大小 我想要实现一个1屛 占一个屏幕
...全文
2038 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

111,078

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧