.NET框架下的摄像头视频流传输库

在许多项目中,经常需要在两个应用程序之间传输摄像头视频流,无论是通过局域网还是互联网。在学校项目中也遇到了这样的需求,但遗憾的是,在网上没有找到合适的免费库,因此进行了一些研究,将不同的组件整合在一起,创建了这个库。这个库允许将摄像头视频流传输到另一个使用.NET框架编写的应用程序。虽然本文是用VB.NET编写的,但也可以在C#项目中使用它!在局域网上,摄像头流应该能够很好地工作,几乎没有延迟,但通过互联网连接时会有延迟。

这个库包括摄像头捕获类和摄像头流类。将这个库分为两种不同的使用方式:作为ActiveX控件(一个可以像其他控件一样拖放到表单上的控件),包括主机和客户端方法在同一个控件中;作为两个类,客户端和主机,包括一些高级方法供高级用户使用。

使用ActiveX控件

如果想在几个简单的步骤中传输视频,不需要大量的编程,拖放控件并编写少量代码即可。

首先,解压缩附带的"TCPCam.zip"文件,应该找到这个目录:"TCPCamActivex\TCPCamActivex\bin\Release"。在项目中,按照以下步骤操作:

Toolbox中右键点击空白区域。 点击"选择项...",弹出对话框。 进入".NET框架组件"标签页,点击"浏览..."。 转到前面提到的提取目录路径,并导入这个文件:TCPCamActivex.dll。 接受对话框。

现在只需将TCPClientActivex控件拖放到表单上;这是显示摄像头帧的地方。

在主机端应用程序中,应该开始监听任何传入的连接,所以会在Form_Load事件处理程序中使用这个方法:

Webcam.StartListening() ' 打开连接以接受客户端

当关闭应用程序时,确保关闭监听线程:

Webcam.StopListening() ' 关闭连接,不接受客户端

在客户端应用程序中,首先应该连接捕获源(摄像头)。在Form_Load事件(或任何其他事件处理程序)中,执行以下操作:

Webcam.Connect(IPAddress) ' 连接到主机(替换IPAddress变量) Webcam.StartCamera() ' 启动摄像头以捕获视频流

确保首先连接,然后启动摄像头!

当完成并想要断开连接并关闭摄像头时,执行以下操作:

Webcam.Disconnect() ' 断开任何打开的连接 Webcam.StopCamera() ' 停止摄像头捕获

ActiveX事件

这个ActiveX控件带有以下事件:

OnFrameDraw(ByVal e As System.Windows.Forms.PaintEventArgs) Connected() Disconnected() OnConnection() LostConnection()

OnFrameDraw事件带有e作为PaintEventArgs参数,允许直接在帧上绘制,并且可以在两端使用。Connected和Disconnected事件仅在客户端触发;每次成功建立连接时,控件都会引发Connected事件。每次连接结束时,控件都会引发Disconnected事件。OnConnection和LostConnection事件仅在主机端触发;每当客户端连接时,OnConnection事件被引发。每当客户端断开连接时,LostConnection事件被引发。

使用类(高级)

如果想有更多的控制,比如发送自己的图像,并选择PictureBox想要绘制帧的地方。

在主机端,应该有一个PictureBox控件用于绘制帧,并声明TCPHost对象(作为全局变量):

Dim WithEvents Host As TCPCam.Host

在Form_Load事件处理程序中实例化类:

Host = New TCPCam.Host(PictureBox1, 8080) PictureBox1指向表单上的PictureBox控件;8080是连接中使用的端口。

现在在上述代码之后添加以下代码:

Host.StartConnection() ' 打开连接以接受客户端

在客户端,应该有一个PictureBox控件用于捕获摄像头帧以绘制,并声明TCPClient对象(作为全局变量):

Dim WithEvents Client As TCPCam.Client

在Form_Load事件处理程序中实例化类:

Client = New TCPCam.Client(PictureBox1) ' 如果只想发送图像,将其设置为null Client.CameraFPS = 30 ' 每秒帧数(刷新率) Client.CameraOutputSize = PictureBox1.Size ' 将输出大小设置为Picturebox大小 Client.StartCamera() ' 启动摄像头视频流

现在需要连接到主机,创建一个文本框或任何想要的东西来获取IP地址,创建一个按钮(连接按钮),并在Button_Click方法中添加以下代码:

Client.Connect(TextBox1.Text, 8080) 替换Textbox1.Text为IP地址;8080是主机使用的端口号。

类事件

主机带有以下事件:

OnConnection() LostConnection() errEncounter(ByVal ex As System.Exception)

onConnection和LostConnection事件分别在创建连接或丢失连接时引发。errEncounter在发生错误时引发。客户端带有以下事件:

Connected() Disconnected() errEncounter(ByVal ex As System.Exception)

Connected事件在成功建立连接时引发,Disconnected事件在断开连接时引发。errEncounter在发生错误时引发。

BertMan可录制TCPCam

BertMan对TCPCam库进行了修改,增加了客户端录制功能。下载BertManRecordableTCPCam.zip以使用具有客户端录制功能的TCPCam。修改后的代码提供了StartRecording方法来开始录制:

Client.CapturePathAndFileName = "c:\videos\myvideo.avi" ' 录制文件的路径 Client.StartRecording() ' 开始录制摄像头

并使用StopRecording方法停止录制:

Client.StopRecording()

非常感谢BertMan分享这个修改后的TCPCam代码,帮助了其他人!

要点

可以使用TCPCam库轻松地从一个应用程序传输摄像头视频流到另一个应用程序。使用ActiveX轻松传输视频流,或使用类使用一些更高级的方法并发送单个图像。使用ActiveX,可以通过处理OnFrameDraw事件和一些GDI编码在视频帧上绘制。使用这个类,可以使用OnPaint在新帧上绘制。这在想在帧上绘制一些图形时很有用。

2015年12月15日 - 添加了BertManRecordableTCPCam.zip。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485