基于C#局域网视频聊天设计

上传人:仙*** 文档编号:31678717 上传时间:2021-10-12 格式:DOC 页数:35 大小:461.12KB
收藏 版权申诉 举报 下载
基于C#局域网视频聊天设计_第1页
第1页 / 共35页
基于C#局域网视频聊天设计_第2页
第2页 / 共35页
基于C#局域网视频聊天设计_第3页
第3页 / 共35页
资源描述:

《基于C#局域网视频聊天设计》由会员分享,可在线阅读,更多相关《基于C#局域网视频聊天设计(35页珍藏版)》请在装配图网上搜索。

1、1绪论视频监控是各行业重点部门或重要场所进行实时监控的物理基础,管理部门可通过它获得有效数据、图像或声音信息,对突发性异常事件的过程进行及时的监视和记忆,用以提供高效、及时地指挥和高度、布置警力、处理案件等。本系统采用DirectShow网络组播技术实现了视频捕获、视频压缩、网络传输、视频解码和实时回放,减小了网络带宽占用,高效的传输视频数据,独立于硬件。可扩展性好。完全利用现有1P数据网络传输数据不需要单独布线,显著降低了系统成本,缩短了系统开发周期,并且可以容易的实现远程监测2 Windows服务一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Win

2、dows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序。同样,一个Windows服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时

3、使得Windows服务程序自动停止。因为Windows服务程序没有用户界面,为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。2.1 添加文件监视服务将生成的服务名为Webcamservice的服务添加视频监视功能: 首先,在C盘创建文件夹w 将程序生成的debug中的文件复制到w文件夹 在C/windows/搜索installutil.exe执行文件,将其复制到w文件夹 启动cmd,打

4、开命令提示符窗体键入如图2-1所示 图2-1 添加服务功能 用net start命令启动服务Webcamservice如图2-2所示 图2-2启动Webcamservice3项目的设计原理3.1 DirectShow技术采用网络摄像机的远程视频监控具有录像时间长、图像质量好、查询速度快等优点,目前应用非常广泛。对于网络摄像机传输的视频数据,需要专门的Filter 来处理并在DirectShow 的框架下或回放,或保存。监控服务器通过Internet/Intranet 轮询网络摄像机获取视频。本文以视频数据接收Filter 的设计过程介绍基于DirectShow 的视频数据流的传输以及通过自定义

5、的通讯协议的数据解析过程和Filter 程序设计与实现过程。DirectShow1是微软公司在ActiveMovie 和Video for Windows 的基础上推出的基于COM 的流媒体处理的开发包,与DirectX 开发包一起发布。DirectShow 为多媒体流的捕捉和回放以及二次开发提供了强有力的支持。运用DirectShow,可以很方便地从支持WDM 驱动模型的采集卡上采集数据,并且调用其API 函数进行后期处理。它广泛地支持各种媒体格式,包括Asf,Mpeg,Avi,Dv,Mp3,Wave等等,使得多媒体数据的回放变得轻而易举。DirectShow 是一个开放的框架,因此只要有合

6、适的Filter 来分析和解码,可以支持任何格式。3.2 TCP/IP协议在TCP/IP协议组分两种协议:网络层的协议,应用层的协议 网络层协议 网络层协议管理离散的计算机间的数据传输。这些协议是在系统表层以下工作的。比如,IP协议为用户和远程计算机提供了信息包的传输方法。它是在许多信息的基础上工作的,好比说是机器的IP地址。在机器IP地址和其它信息的基础上,IP确保信息包能正确地到达目的机器。通过这一过程,IP和其它网络层的协议共同用于数据传输。如果没有网络工具,用户就看不到在系统里工作的IP。 应用层协议相反地,应用层协议用户是可以看得到的。比如,文件传输协议(FTP)用户是看得到的。用户

7、为了传输一个文件请求一个和其它计算机的连接,连接建立后,就开始传输文件。在传输时,用户和远程计算机的交换的一部分是能看到的。 IPIP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信

8、数据包是从一个有效的主机发送来的。 TCP如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。3.3 C/S架构服务器客户端客户端 . . .在网络连接模式中除对等网外,还有另一种形式的网络,即客户机/服务器网,Client/Server。在客户机/服务

9、器网络中,服务器是网络的核心,而客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络必须的资源。 图3-1 c/s结构4程序流程图及设计4.1程序时序图与系统架构本系统采用面向连接的客户/服务模型,服务器必须首先启动,否则客户进程的Connect()系统调用将返回错误代码表示连接失败。无连接的服务进程也必须首先启动以指定本地的套接字地址否则客户进程的数据服务请求传送不到服务器进程。面向连接的c/s时序图如图4-1所示Accept()Recv()Send()Close()Listen()Bind()Socket()服务器发送数据-确认发送数据-请求建立连接Recv(

10、)Close()Send()Connect()Socket()客户 图4-1 程序时序图系统由服务器终端采集传输系统和客户端接收系统两部分组,系统构架如图4-2所示摄像头采集卡服务器服务程序网络传输模块网络接收模块客户端程序解码显示视频流控制指令视频流控制指令 图4-2 系统架构4.2程序设计分析4.2.1任务目标服务器端程序目标:服务器服务器端服务程序进行数据采集(捕捉摄像头捕获数据),提供IP端口实现数据流的传输。客户端程序目标:客户端程序通过IP协议与服务器端通信,接收并回放服务器端采集的视频数据流。4.2.2程序描述Socket类:socket之间的连接可以分为三种类型:客户端连接,监

11、听连接以及服务器端连接。 客户端连接是指由客户端的socket提出连接请求,要连接的目标是服务器端的socket。为此,客户端的socket必须首先描述它要连接的服务器端socket(主要是指服务器 端socket的地址和端口号),然后再定位所要连接的服务器端socket,找到以后,就向服务器端 socket请求连接。当然,服务器端的socket此时未必正好处于准备好状态,不过,服务器端的 socket会自动维护客户请求连接的队列,然后在它认为合适的时候向客户端socket发出允许连接 (accept)的信号,这时客户端socket与服务器端socket的连接就建立了。监听连接,服务器端 so

12、cket并不定位具体的客户端socket,而是处于等待连接的状态。当服务器端socket监听到或者说 接收到客户端socket的连接请求,它就响应客户端socket的请求建立一个新的socket句柄并与客户 端连接,而服务器端socket继续处于监听状态,还可以接收其它客户端socket的连接请求。服务器端连接,是指当服务器端socket接收到客户端socket的连接请求后,就把服务器端socket的描述发给客户端,一旦客户端确认了此描述,连接就建立了。在本文中的聊天程序用的就是监听连接,即服务器设置连接个数后进行监听,客户端进行对服务器端的连接,这样就可以进行相互通信了。TcpService

13、类namespace TCP internal class TcpServer : IDisposable / This is not the max number of connections you can have, its the number / that can queue up waiting for you to Accept them. If more than MAXCONNECTION / more clients try to connect while you are servicing another, OnConnect is / probably taking

14、too long. const int MAXCONNECTIONS = 3; #region Member variables private ArrayList m_aryClients; private Socket m_sockListener; private volatile bool m_bShuttingDown; private ManualResetEvent ShutDownReady; #endregion / Return an array of the ip addresses assigned to this pc public static IPAddress

15、GetAddresses() IPAddress aryLocalAddr = null; string strHostName = ; / NOTE: DNS lookups are nice and all but quite time consuming. strHostName = Dns.GetHostName();#if USING_NET11 IPHostEntry ipEntry = Dns.GetHostByName( strHostName );#else IPHostEntry ipEntry = Dns.GetHostEntry( strHostName );#endi

16、f aryLocalAddr = ipEntry.AddressList; / Verify we got an IP address. if( aryLocalAddr = null | aryLocalAddr.Length 0 ) if (DataReceived != null) DataReceived(this, ref s.obj, ref s.byBuff, nBytesRec); / Restablish the callback AsyncCallback receiveData = new AsyncCallback( OnReceivedData ); s.Client

17、.BeginReceive( s.byBuff, 0, s.byBuff.Length, SocketFlags.None, receiveData, s ); else / If no data was received then the connection is probably dead RemoveConnection(s); catch RemoveConnection(s); / Remove a connection from the list of active connections private void RemoveConnection(SockWrapper s)

18、try s.Client.Shutdown( SocketShutdown.Both ); s.Client.Close(); catch / Remove it from the array try m_aryClients.Remove( s ); catch / Fire the Disconnected event if (Disconnected != null) Disconnected(this, ref s.obj); / Wrapper for each client (stored in m_aryClients) internal class SockWrapper /

19、The buffer is used by receive public Socket Client; public byte byBuff; public object obj; public SockWrapper(Socket client) Client = client; byBuff = new byte256; obj = new object(); public delegate void TcpConnected(Object sender, ref object o); public delegate void TcpSend(Object sender, ref obje

20、ct o, ref bool b); public delegate void TcpReceive(Object sender, ref object o, ref byte b, int ByteCount);WebCamService 类:namespace WebCamService public class WebCamService : ServiceBase #region Required Service Related Methods private System.ComponentModel.Container components = null; public WebCa

21、mService() InitializeComponent(); private void InitializeComponent() components = new System.ComponentModel.Container(); this.ServiceName = WebCamService; protected override void Dispose( bool disposing ) if( disposing ) if (components != null) components.Dispose(); base.Dispose( disposing ); #endre

22、gion STAThread public static void Main(string args) Thread.CurrentThread.Name = Main thread; WebCamService ServiceToRun = new WebCamService() ; if ( Debugger.IsAttached ) ServiceToRun.Run(); else ServiceToRun.CanPauseAndContinue = false; ServiceBase.Run(ServiceToRun); #region Member Variables privat

23、e const int MAXOUTSTANDINGPACKETS = 3; / / The thread will run the job. / The job is the Method Run() below / protected Thread thread = null; private ManualResetEvent ConnectionReady; private volatile bool bShutDown; private volatile int iConnectionCount; #endregion / / Set things in motion so your

24、service can do its work. / 为了服务器可以工作而设置的选项 / protected override void OnStart(string args) ThreadStart starter = new ThreadStart(Run);/实例化进程 thread = new Thread(starter); thread.Start(); / / Stop this service. / 停止服务 / The Run() Method tests for this thread state each second / 每秒都为这个进程启动方法测试 / protec

25、ted override void OnStop() / Set exit condition /设置退出状态 bShutDown = true; / Need to get out of wait /需要退出等待 ConnectionReady.Set(); public void Run() const int VIDEODEVICE = 0; / zero based index of video capture device to use const int FRAMERATE = 15; / Depends on video device caps. Generally 4-30.

26、const int VIDEOWIDTH = 640; / Depends on video device caps const int VIDEOHEIGHT = 480; / Depends on video device caps const long JPEGQUALITY = 30; / 1-100 or 0 for default const int TCPLISTENPORT = 399; Capture cam = null; TcpServer serv = null; ImageCodecInfo myImageCodecInfo; EncoderParameters my

27、EncoderParameters; / Set up logging /建立日志记录 StreamWriter sw = File.AppendText(d:WebCam.log); try / Set up member vars ConnectionReady = new ManualResetEvent(false); bShutDown = false; / Set up tcp server /建立TCP服务 iConnectionCount = 0; serv = new TcpServer(TCPLISTENPORT, TcpServer.GetAddresses()3); s

28、erv.Connected += new TcpConnected(Connected); serv.Disconnected += new TcpConnected(Disconnected); serv.DataReceived += new TcpReceive(Receive); serv.Send += new TcpSend(Send); myEncoderParameters = null; myImageCodecInfo = GetEncoderInfo(image/jpeg); if (JPEGQUALITY != 0) / If not using the default

29、 jpeg quality setting /如果不适用默认的JPEG质量设置 EncoderParameter myEncoderParameter; myEncoderParameter = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, JPEGQUALITY); myEncoderParameters = new EncoderParameters(1); myEncoderParameters.Param0 = myEncoderParameter; cam = new Capture(VIDEODEVICE, FRAMERATE, VIDEOWIDTH, VIDEOHEIGHT); / Initialization succeeded. Now, start serving up frames /初始化成功,现在,启动服务器发送帧 DoIt(cam, serv, sw, myImageCodecInfo, myEncoderParameters); catch(Exception ex)

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!