MJPEG Linux Video Streaming and Recording over HTTP

Posted by   June 7th, 2016



We got a requirement, where the client was looking for a USB camera or IP camera which could stream and record live video from multiple cameras to the mobile devices and web browsers. So we, at Tech Vedika, built a complete solution of a Linux based system with USB and IP Camera.

We selected MJPEG based Video compression since MJPEG is supported by most of the cameras and client viewers. Motion JPEG or MJPEG is basically a stream of JPEG images transmitted over HTTP protocol. Nowadays it is commonly being used for many multimedia applications, especially in digital cameras, IP cameras and webcams. The basic advantage of using MJPEG is that, it does not require any client software to be installed in the remote computer. To see the streaming video of the MJPEG Streaming server, you need to use any software that supports Motion-JPEG streaming such as a Firefox, Chrome or VLC.


MJPEG based Linux DVR Architecture


MJPEG encoded videos are then sent over the HTTP protocol and shall be watched over the web browsers. It requires a special MIME (Multi-purpose Internet Mail Extension) type, which is “multipart/x-mixed-replace”. After this MIME-header, we need to write “;boundary=<boundary name>” This <boundary name> is chosen by the programmer. The separator pattern used, indicates the client (browser or media player) the beginning and ending of the image block. As long as the client wants to receive new frames and the server is willing to provide those, the TCP connection is kept open.

For this project, MJPG-Streamer was used as the streaming server. MJPG streamer is a command line application. It copies the JPEG frames from one or more input plugins to multiple output plugins. It was used to stream the JPEG files over the IP-based network from webcams to various types of viewers such as Chrome, Firefox, VLC, and other software capable of receiving JPEG streams.

Since it was originally written for embedded devices with very limited resource in terms of RAM and CPU, it uses very less computing power for compressing the video frames. This helps to reduce the CPU cycles of the server.

MJPEG Streamer Installation

MJPEG-streamer is not in the official repositories and must itself be compiled from the source code.

  1. Install dependencies

The following libraries are required to build the MJPG-Streamer.

  • build-essential
  • Libjpeg8-dev
  • Imagemagick
  •  v4l-utils (optional)
  • libv4l-dev (optional)
  • checkinstall (optional)

The above can be installed by following command.

sudo apt-get install build-essential libjpeg8-dev imagemagick libv4l-dev v4l-utils checkinstall

  1. Add missing videodev.h

The “videodev.h” header file that MJPEG-Streamer needs has been replaced with a videodev2.h in latest Linux kernels. To make MJPEG-Streamer happy you have to create a symbolic link.

$ sudo ln -s /usr/include/linux/videodev2.h usr/include/linux/videodev.h

  1. Download MJPEG-Streamer

The source code for MJPEG-Streamer is available at sourceforge.net, but it is tricky to find the direct download link.

$ wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip 

Note that sometimes the link above fails to work. If that is the case, you can also download from your web browser by opening page.: http://sourceforge.net/p/mjpg-streamer/code/HEAD/tarball

  1. Unzip the MJPEG-Streamer source code

The source code download is a compressed zip file. Put the file in your home directory (or a temporary folder, if you prefer) and run the following command to extract the files.

$ unzip mjpg-streamer-code-182.zip

  1. Build and Install MJPEG-Streamer

MJPG-Streamer comes with several plugins, but only a couple of them are needed to stream video. The command below only builds what’s needed:

$ cd mjpg-streamer-code-182/mjpg-streamer

$ sed -i ‘/PLUGINS += input_raspicam.so/c\#PLUGINS += input_raspicam.so’ Makefile  // to disable raspicam as we are building it for a pc

$ make USE_LIBV4L2=true clean all && make install

By this time, you can see the mjpg_streamer in the command line.

Using MJPEG Streamer

  1. Check the available video camera

Execute following command to know the available video cameras.

$ ls -lst /dev/video* 

Above command will give something like below output , it tells us that we have one camera attached.

0 crw-rw—-+ 1 root video 81, 0 May  9 11:31 /dev/video0

  1. Start the mjpeg streaming

MJPG streaming can be started by executing below command.

$ mjpg_streamer -i “/usr/local/lib/input_uvc.so -d /dev/video0 -r 1280×720 -f 24” -o “/usr/local/lib/output_http.so -p 8085 -w /var/www/mjpg_streamer”

  1. Stop the mjpeg streaming

MJPG streaming can be stopped by executing below command.

$ killall mjpg_streamer

Watch the Stream

Now you can connect with your web browser and watch the stream live. If you want to watch from within the same PC, you can enter http://localhost:8085 in the browser’s address bar.   If you want to watch from another computer in your network use http://<IP-address>:8085.

Recording the stream

The stream can be recorded by using ffmpeg command line tool with following command.

ffmpeg -i http://<IP-address>:8085 <file name>.avi


Leave a Reply

Your email address will not be published. Required fields are marked *