C# \ VB.NET 摄像头通信库
使用 TCP 协议在应用程序之间传输实时摄像头视频流或单个图像。
引言
我看到很多人在寻找一个库,能够通过局域网或任何其他类型的网络在两个应用程序之间传输实时摄像头视频。
我自己也需要在我的学校项目中使用它 - 但我在网上找不到任何免费可用的库,所以我做了一些研究,并将所有不同的部分连接起来创建了这个库。
该库允许您将摄像头视频流传输到使用 .NET Framework 编写的另一个应用程序。
虽然本文是用 VB.NET 编写的 - 您也可以在 C# 项目中使用它!
在局域网上,摄像头流应该可以很好地工作,几乎没有延迟,但在使用互联网连接时会延迟。
我使用了Pino 开发的 ICam
类来捕获摄像头帧;您可以在此处找到原始的 ICam
类:http://www.vbforums.com/showthread.php?p=2048466 (查看他的网站)。在此项目中,我修改了 ICam 以满足我的需求。
背景
该库包括摄像头捕获类和摄像头流类。我将此库分成了两种不同的使用方式
- 作为 ActiveX(控件),您可以像其他控件一样将其拖放到窗体上 - 包括主机和客户端方法都在同一个控件中。
- 作为两个类;客户端和主机,包含一些面向高级用户的进阶方法。
该库的主要概念是,连接到图像源(摄像头)的客户端将帧发送给主机(先序列化帧,然后发送);主机反序列化图像并更新 PictureBox
/控件。
使用代码 - 作为 ActiveX
如果您想在几个简单的步骤中传输视频,可以使用此方法,无需大量编程 - 只需拖放控件并编写少量代码。
解压附带的“TCPCam.zip”,您应该会找到这个目录:“TCPCamActivex\TCPCamActivex\bin\Release”。
在您的项目中,请执行以下操作
- 打开工具箱,右键单击工具箱中的空白区域。
- 点击“选择项...” ,会弹出一个对话框。
- 进入“ .NET Framework 组件”选项卡,然后点击“浏览...” 。
- 导航到我前面提到的解压目录路径,并导入此文件:TCPCamActivex.dll。
- 接受对话框。
- 现在只需将
TCPClientActivex
控件拖到您的窗体上;在这里将显示您的摄像头帧。
我将客户端和主机应用程序中的 ActiveX 命名为相同:“Webcam
”。此 ActiveX 默认使用端口 2020。
在主机端应用程序中,我们应该开始监听任何传入的连接,因此我们将在 Form_Load
事件处理程序中使用此方法
Webcam.StartListening() 'Opens the connection to accept clients
关闭应用程序时,请确保关闭监听线程。
Webcam.StopListening() 'Closes the connection and does not accept clients
在客户端应用程序中,我们应该首先连接捕获源(摄像头)。在 Form_Load
事件(或您想要的任何其他事件)处理程序中,执行以下操作
Webcam.Connect(IPAddress) 'Connects to the host (Replace the IPAddress variable)
Webcam.StartCamera() 'Starts up the camera to capture the video stream
请确保先连接再启动摄像头! 完成后,如果您想停止连接并关闭摄像头,请执行以下操作
Webcam.Disconnect() 'Disconnects any open connection
Webcam.StopCamera() 'Stops the camera capture
ActiveX 事件
此 ActiveX 附带以下事件
OnFrameDraw(ByVal e As System.Windows.Forms.PaintEventArgs)
Connected()
Disconnected()
OnConnection()
LostConnection()
OnFrameDraw
事件附带 e as PaintEventArgs
参数,允许您直接在帧上绘图,并且可以在两侧使用。
Connected
和 Disconnected
事件仅在客户端触发;每次成功建立连接时,控件都会引发 Connected
事件。每次连接结束时,控件都会引发 Disconnected
事件。
OnConnection
和 LostConnection
事件仅在主机端触发;每次连接到客户端时,都会引发 OnConnection
事件。每次客户端断开连接时,都会引发 LostConnection
事件。
您可以处理这些事件来监控您的连接状态,并使用 GDI 在摄像头帧上绘图。
使用代码 - 作为类(高级)
如果您想获得更多控制,例如发送自己的图像,并选择要绘制帧的 PictureBox
,可以使用此方法。
解压附带的“TCPCam.zip”文件,您应该会找到这个目录:“TCPCam\TCPCam\bin\Release”。
在主机端,您应该有一个用于绘制帧的 PictureBox
控件,并声明 TCPHost
对象(作为全局变量)
Dim WithEvents Host As TCPCam.Host
在 Form_Load
事件处理程序中,实例化类
Host = New TCPCam.Host(PictureBox1, 8080)
PictureBox1
指的是您窗体上的 PictureBox
控件;8080 是连接使用的端口。
现在在上面的代码之后添加以下内容
Host.StartConnection() 'Opens the connection to accept clients
在客户端,您应该有一个用于绘制摄像头帧捕获的 PictureBox
控件,并声明 TCPClient
对象(作为全局变量)
Dim WithEvents Client As TCPCam.Client
在 Form_Load
事件处理程序中,实例化类
Client = New TCPCam.Client(PictureBox1) 'Set to null if you only you want to send images
Client.CameraFPS = 30 'The number of frames per second (refresh rate)
Client.CameraOutputSize = PictureBox1.Size 'Set the output size to the Picturebox size
Client.StartCamera() 'Start the camera video stream
现在我们需要连接到主机,创建一个文本框或任何您想要的用于获取 IP 地址的控件,创建一个按钮(连接按钮),并在 Button_Click
方法中,添加以下内容
Client.Connect(TextBox1.Text, 8080)
将 Textbox1.Text
替换为 IP 地址;8080 是主机使用的端口号。
您可以使用此类来传输图像而不是视频流,只需将 Picturebox1
变量设置为 Null
并且不使用 CameraStart
方法。每次想要发送图像时,请使用以下方法
Client.SendImage(Image) 'Image is the image object to send
类事件
主机附带以下事件
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" 'The path of the recorded file
Client.StartRecording() 'Start the camera recording
并使用 StopRecording
方法来停止录制。
Client.StopRecording()
非常感谢 BertMan 分享这个修改后的 TCPCam 代码并帮助他人!
兴趣点
您可以使用 TCPCam 库非常轻松地将摄像头视频流从一个应用程序传输到另一个应用程序。使用 ActiveX 来轻松传输视频流,或者使用类来使用更多高级方法并发送单个图像。
使用 ActiveX,您可以通过处理 OnFrameDraw
事件和一些 GDI 代码在视频帧上绘图。
使用此类,您可以使用 OnPaint
在新帧上绘图。如果您想在帧上绘制一些图形,这会很有用。
我曾花费大量时间寻找此类库,却未能找到,于是我构建了自己的。希望它能有所帮助!
历史
- 15.12.11 - 添加了 BertManRecordableTCPCam.zip。
- 26.09.10 - 添加了一个示例图片。
- 27.09.10 - 修改了描述以匹配库。