65.9K
CodeProject 正在变化。 阅读更多。
Home

Motion JPEG 流媒体服务器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (67投票s)

2012年4月23日

CPOL

3分钟阅读

viewsIcon

467415

downloadIcon

44892

实现一个 MJPEG (或 Motion JPEG) 流媒体服务器,该服务器可用于通过 HTTP 协议将屏幕截图或任何其他图像源流式传输到任何 Web 浏览器客户端(MJPEG 流写入器包含在库中)

用于移动客户端

Samsung Galaxy SII

其他客户端(例如 Firefox、Chrome 和 VLC 播放器)

Streaming the desktop images to different remote clients

引言

Motion JPEG 是通过 HTTP 协议传输的 JPG 图像流,通常用于许多多媒体应用程序,尤其是在数码相机(IP 摄像机)中。尽管有许多方法可以将图像作为视频发送到任何远程计算机,但 MJPEG 是首选方案,因为它通常不需要在远程计算机上安装任何客户端软件!这是因为它受到大多数常见 Web 浏览器(如 Firefox 和 Chrome)的支持,但不幸的是,它尚未被 Internet Explorer 直接支持(但有一些插件可以使其与 Internet Explorer 一起使用)。

动机

在许多情况下,我需要将我的桌面、摄像头或任何东西的视频流式传输到没有客户端软件的远程计算机上以查看我的流...在这种情况下,推荐使用 Motion-JPEG 流,因为它只需要一个互联网浏览器。在本文中,我不会描述 MJPEG 流的内部结构(有关更多信息,请访问 Motion_JPEG)。相反,我将描述如何使用此库进行 MJPEG 流式传输。

如何使用此库

我们库中的主要类是 ImageSreamingSever(),它包含以下方法和属性

方法

  • 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),您应该会看到类似这样的内容

Google Chrome

实现您自己的 ImagesSource

实际上,我选择了 IEnumerable<Image> 作为图像源,因为此接口提供了灵活性,例如,类 ImageStreamingServer 的默认 ImagesSource 属性是桌面的 IEnumerable<Image> 屏幕,但同时,您可以自由地通过更改该属性的值来实现您喜欢的任何其他类型的图像源。

假设您想从摄像头或计算机中任何文件夹的图像文件中获取图像源,那么您的代码应该类似于这样

IEnumerable<Image> CameraImagesSource() 
{ 
    // Your code must be here 
} 

IEnumerable<Image> FolderImagesSource(string path) 
{ 
    // Your code must be here 
}

作为一个真实的例子,让我们实现一个图像源,该源从指定文件夹路径流式传输所有 "*.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);

    yield break;
}

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 FirefoxGoogle ChromeVideoLAN Player (VLC)

Free client software for Windows PC

最后,对于您的移动设备(Android),请使用 FireFox 或您可以在 Google 市场中找到的任何其他免费应用程序,例如 tinyCamMonitor(用于下图)

Samsung Galaxy SII

未来版本

在库的未来版本中,我将添加各种图像源,例如

  • 来自屏幕特定区域的图像
  • 来自系统中特定窗口的图像
  • 来自摄像头的流式图像
  • 来自磁盘中任何文件夹的所有照片
  • 以及您可能想要的任何其他建议的图像来源!?

在此之前,请随意享受此版本。 ;-)

历史

  • 2012 年 4 月 23 日:初始版本
© . All rights reserved.