在许多项目中,经常需要在两个应用程序之间传输摄像头视频流,无论是通过局域网还是互联网。在学校项目中也遇到了这样的需求,但遗憾的是,在网上没有找到合适的免费库,因此进行了一些研究,将不同的组件整合在一起,创建了这个库。这个库允许将摄像头视频流传输到另一个使用.NET框架编写的应用程序。虽然本文是用VB.NET编写的,但也可以在C#项目中使用它!在局域网上,摄像头流应该能够很好地工作,几乎没有延迟,但通过互联网连接时会有延迟。
这个库包括摄像头捕获类和摄像头流类。将这个库分为两种不同的使用方式:作为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控件带有以下事件:
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库进行了修改,增加了客户端录制功能。下载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。