MJPEG是一种通过HTTP协议传输JPG图像流的技术,常用于多媒体应用,特别是在数字摄像头(IP摄像头)中。尽管有许多方法可以将图像作为视频发送到任何远程计算机,MJPEG因其不需要在远程计算机上安装任何客户端软件而受到青睐。这是因为大多数常见的网络浏览器,如Firefox和Chrome,都支持MJPEG,但遗憾的是,Internet Explorer并不直接支持(尽管有一些插件可以使它与Internet Explorer一起工作)。
在许多情况下,需要将桌面、摄像头或其他任何视频流传输到没有客户端软件的远程计算机上...在这种情况下,使用Motion-JPEG流是首选,因为它只需要一个网络浏览器。在本文中,不会描述MJPEG流的内部结构(有关更多信息,请访问)。相反,将描述如何使用这个库进行MJPEG流。
库中的主要类是ImageStreamingServer()
,它包含以下方法和属性:
void Start()
: 在指定的TCP端口上启动服务器void Stop()
: 停止服务器并关闭任何打开的连接ImagesSource
: 要流式传输到任何连接客户端的图像集合(IEnumerable<Image>
)Interval
: 从ImagesSource
集合发送每张图像之间的延迟时间(以毫秒为单位)IsRunning
: 一个只读的bool
属性,指示服务器的状态Clients
: 返回当前连接的每个客户端的只读套接字集合为了实现一个可以向任何连接客户端发送桌面屏幕视频的流媒体服务器,只需要使用ImageStreamingServer
编写两行代码:
ImageStreamingServer server = new ImageStreamingServer();
server.Start(8080);
就是这样!现在,如果打开(例如)Chrome或Internet Explorer,并输入服务器的IP地址,后面跟着冒号和端口号,在例子中,就是这样...
http://127.0.0.1:8080
...应该能在浏览器中正确地看到计算机屏幕视频...如果从另一台计算机(使用服务器的正确IP地址)这样做,应该看到类似的东西:
实际上,选择了IEnumerable<Image>
作为图像源,因为这个接口提供了灵活性。例如,类ImageStreamingServer
的默认ImagesSource
属性是桌面屏幕的IEnumerable<Image>
,但同时,可以通过更改该属性的值来实现任何其他类型的图像源。
假设想从摄像头或计算机的任何文件夹中的图像文件中获取图像源,那么代码应该是这样的:
IEnumerable<Image> CameraImagesSource() {
// 代码必须在这里
}
IEnumerable<Image> FolderImagesSource(string path) {
// 代码必须在这里
}
作为一个真实的例子,让实现一个图像源,它流式传输指定文件夹路径中的所有"*.jpg"照片,如下所示:
private IEnumerable<Image> FolderImagesSource(string path) {
var files = System.IO.Directory.GetFiles(path, "*.jpg");
foreach (var file in files)
yield return Image.FromFile(file);
}
private void Form1_Load(object sender, EventArgs e) {
var source = FolderImagesSource(@"C:\Pictures\");
_Server = new ImageStreamingServer();
_Server.ImagesSource = source;
_Server.Start(8080);
}
注意:上述代码可以缩短如下(感谢IEnumerable
扩展和LINQ):
var source = System.IO.Directory.GetFiles(@"C:\Pictures\", "*.jpg").Select(s => Image.FromFile(s));
_Server = new ImageStreamingServer(source);
_Server.Start(8080);
要查看服务器的流媒体视频,需要使用支持Motion-JPEG流的任何软件,如Mozilla Firefox、Google的Chrome或VideoLAN Player(VLC):
最后,对于移动设备(Android),使用FireFox或在Google市场上可以找到的任何其他免费应用程序,如tinyCamMonitor(在下面的图片中使用):
在库的未来版本中,将添加各种图像源,例如: