For mobile clients:
Other clients (such as Firefox, Chrome and VLC player):
Motion JPEG is a stream of JPG images over HTTP protocol and it is commonly used for many multimedia applications specially in digital cameras (IP
Although there are many ways to send images as a video to any remote computer MJPEG is the
preferred one since normally it does not need any client software to be installed in the remote computer!. that is because it is supported by most of the common web browsers like Firefox and Chrome but
unfortunately, it is not yet supported by Internet Explorer directly (but there
are some plug-ins that make it possible to work with IE).
In many I needed to stream a video of my desktop, camera, or whatever to a remote computer which has no client software to see my stream...
In such a case, using Motion-JPEG streams is preferred because it needs no more than
an internet browser. In this article I'm not going to describe
the internal structure of an MJPEG stream (for more information, please visit Motion_JPEG) instead of that
I'm going to describe how to use this library for MJPEG streaming.
How to use this library
The main class in our library is
ImageSreamingSever() which contains
the following methods and properties:
void Start(): Starts the server on a specified TCP port.
void Stop(): Stops the server and closes any open connections.
ImagesSource: The images collection (
IEnumerable<Image>) to be streamed to any connected client.
Interval: The delay time (in milliseconds) between each sending image from the
IsRunning: Is a read-only
bool property indicating the status of the
Clients: Returns a read-only collection of the currently connected socket of each client.
In order to implement a streaming server that can send a video of your desktop screen to any connected client, you'll need only two lines of code using our
ImageStreamingServer, as follow:
ImageStreamingServer server = new ImageStreamingServer();
That's it !!!..
Now if you open (for example) the chrome internet explorer and write the IP of the server followed by colon and then the port number, in our example it is something like this :
you will properly see a video of your computer screen in the explorer .. and same if you do this from another computer (with the correct IP of your server), you should see something like this :
Implementing your own ImagesSource
Actually I've chosen
IEnumerable<Image> as a source of images because of the
flexibility that this interface is providing, for example the default
ImagesSource property of the class
ImageStreamingServer is an
IEnumerable<Image> of the desktop screen, but at the same time you
are free to implement any other type of image source you like by changing the value of that property.
Suppose you want to make the images source from the camera or from the images file of any folder in your computer, then your code should be something like this:
IEnumerable<Image> FolderImagesSource(string path)
As a real example, let's implement a source of images that streams all "*.jpg" photos from a specified folder path as follows:
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;
Note: the above code can be shortened as follows (thanks for IEnumerable extensions and LINQ):
var source = System.IO.Directory.GetFiles(@"C:\Pictures\", "*.jpg").Select(s => Image.FromFile(s));
_Server = new ImageStreamingServer(source);
Supported client software
To see the streaming video of our server, you will need to use any software that supports Motion-JPEG streaming such
as a Mozilla Firefox, Google's Chrome or VideoLAN Player (VLC) :
And finally for your mobile (android) use FireFox or any other free app that can be found on Google's market such as
tinyCamMonitor (that was used in the picture below):
In the future versions of the library I'm going to add a variety of images sources such as:
- Images from a specific region of the screen.
- Images from a specific window in the system.
- Streaming images from a camera.
- All photos from any folder in a disk.
- And any other suggested sources of images you may want !? ...
And till that time, fill free to enjoy this version ;-)