Raspberry Pi Streaming Camera Pi


Installing MJPEG-streamer





Unfortunately there isn't a package for MJPEG-streamer that can be installed with apt-get, so it needs to be compiled from source.


MJPEG-streamer is hosted at sourceforge.net, so head over to the project's download page to get the source tarball.


To compile this application I used the following commands:$ sudo apt-get install libjpeg8-dev $ sudo apt-get install imagemagick $ tar xvzf mjpg-streamer-r63.tar.gz $ cd mjpg-streamer-r63 $ make



This tool requires libjpeg and the convert tool from ImageMagick, so I had to install those as well.


The makefile does not include an installer, if you want to have this utility properly installed you will need to copy the mjpg_streamer and its plugins input_*.so and output_*.so to a directory that is in the path, like /usr/local/bin. It is also possible to run this tool directly from the build directory.

Setting up the JPEG source stream



The streaming server needs a sequence of JPEG files to stream, and for this we are going to use theraspistill utility that is part of Raspbian. For those that are concerned about performance, keep in mind that the JPEG encoder used by raspistill runs in the GPU, the load required to generate JPEGs is pretty small.


To setup a constant stream of JPEG images the command is as follows:$ mkdir /tmp/stream $ raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &



Let's go over the arguments to raspistill one by one:
-w sets the image width. For an HD stream use 1920 here.
-h sets the image height. For an HD stream use 1080 here.
-q sets the JPEG quality level, from 0 to 100. I use a pretty low quality, better quality generates bigger pictures, which reduces the frame rate.
-o sets the output filename for the JPEG pictures. I'm sending them to a temp directory. The same file will be rewritten with updated pictures.
-tl sets the timelapse interval, in milliseconds. With a value of 100 you get 10 frames per second.
-t sets the time the program will run. I put a large number here, that amounts to about two hours of run time.
-th sets the thumbnail picture options. Since I want the pictures to be as small as possible I disabled the thumbnails by setting everything to zero.
& puts the application to run in the background.

Starting the streaming server



Okay, so now we have a background task that is writing JPEGs from the camera at a rate of ten per second. All that is left is to start the streaming server. Assuming you are running it from the build directory the command is as follows:$ LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"



Let's break this command down to understand it:
LD_LIBRARY_PATH sets the path for dynamic link libraries to the current directory. This is so that the application can find the plugins, which are in the same directory.
-i sets the input plugin. We are using a plugin called input_file.so. This plugin watches a directory and any time it detects a JPEG file was written to it it streams that file. The folder to watch is given as the -f argument.
-o sets the output plugin. We are using the HTTP streaming plugin, which starts a web server that we can connect to to watch the video. The root directory of the web server is given as the -w argument. We will use the default web pages that come with the application for now, these can be changed and customized as necessary.

Watching the stream



Now everything is ready. Go to any device that has a web browser and connect to the following website:http://:8080



Where IP-address is the IP address or hostname of your Raspberry Pi.


The default website served by the streaming server provides access to several players to watch the stream. I've found that the "Stream" option worked on most devices I tried. For a few that "Stream" didn't show video I went to "Javascript" and I was able to play the video just fine.


I tested playback of the stream from an iPad, an Android smartphone and a variety of web browsers on Windows and OS X, and I was able to play the stream in all of them.


I hope you find this method useful. Let me know in the comments below if you have a different method of streaming.


Miguel

No hay comentarios:

Publicar un comentario