个人开发历程知识库

关注C++/Java/C#技术, 致力于安防监控/移动应用/WEB方面开发
------------------------------------ 业精于勤,荒于嬉;行成于思,毁于随
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

也用C#做个视频监控客户端来玩玩

Posted on 2009-05-31 21:42  peterzb  阅读(18385)  评论(18编辑  收藏  举报

   前几天看到园友农民伯伯写的C# 视频监控系列实现了对海康板卡的封装,这几天参与的项目进入了后续阶段了,现进行性能测试.测试流媒体服务器的稳定性,并发性,看看并发处理300-500路视频效果如何,部门没有那么多电脑用来测试,简单写了一个模拟客户端访问的程序来测试服务端程序性能.流媒体是用C++语言实现的,我现在要使用C#与之通信,会涉及下面几个方面内容.举例我现在想浏览前端大华的DVR/DVS上某一路视频,这里我们采用流媒体连接视频监控设备而非客户端去直连设备,流媒体接收到数据后再一一转发给当前想预览该路视频的客户端,客户端使用大华的PlaySDK解码播放.(至于通过大华NetSDK直连设备,你可以到大华网站下载其SDK包,当前最新版本好像是3.4,有提供封装好的C#访问Demo程序;这里流媒体支持多种厂商的监控设备的接入,包含海康,大华等)

客户端视频预览一般过程

1)如果当前已有画面正在预览,发送停止正在预览该路画面命令到服务端,关闭该路视频

一般调用PLAY_StopSound,PLAY_Stop,PLAY_CloseStream函数停止该路视频预览

2)发送视频预览请求

打开视频输入流PLAY_OpenStream,PLAY_Play,PLAY_PlaySound(同时开启音频);然后可以专门开一视频数据接收线程,把接收到视频数据提供给函数PLAY_InputData解码播放即可

   一般C++下我们进行网络传输模块开发,会采用结构体来封装组织通信报文,那采用C#开发的流媒体客户端程序需与服务端流媒体通信,就会碰到怎么把一个结构体转成一个byte数组,以及如何把收到的byte数组数据还原成结构体对象.我们这里就涉及到了C#与其它语言的互操作,也就是所谓的P/Invoke技术,主要也就是System.Runtime.InteropServices命名空间下的Marshal类的使用.(可参考园友tuyile006文章struct和byte[]相互转换(用Marshal类实现))还有就是C++与C#之间数据类型转换如unsigned char-->byte,char * -->string,HWND-->IntPtr,LONG/DWORD-->int,传递空指针使用IntPtr.Zero等(农民伯伯在其C# 视频监控系列(14):总结贴——VC++代码转成C#小结也做了一些介绍,可借鉴C#封装的海康DVR客户端SDK )

  接下来就实现代码,编译通过,运行一下.呀,弹出了一个提示在所指定的dll文件中找不到某函数的入口地址,检查代码,原来太粗心把函数PLAY_OpenStream定义成了Play_OpenStream,汗一个先,以后写程序要注意.(函数调用不成功,一般是函数定义错误,如函数名称或参数数据类型错误,可参考文章BugHunter 也谈c#调用C++的DLL找不到入口点 )最终效果如下图,很粗劣,大家不要见笑,画面1传输是文件流,画面2是实时视频流数据.