Plug in your USB webcam. By listing al USB devices you can see if Raspbian sees your webcam.
lsusb
Search for your USB webcam in the list of USB devices:
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 005: ID 046d:0807 Logitech, Inc. Webcam B500
In my case the webcam is detected.
Make sure you are a root user if you want to install new packages. If you are not a root user, become a root user by entering the following command.
sudo su
These packages are necessary for MJPEG Streamer.
To install these packages run the following command.
apt-get install libjpeg8-dev imagemagick libv4l-dev subversion
MJPG Streamer expects videodev.h
to exist, but it is replaced by a newer version videodev2.h
. By creating a symbolic link the compiler uses the new file without a problem.
By entering the following command a symbolic link is created.
ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
You can download MJPG Streamer from the original sourceforge website, or the mirror from my own server by entering one of these commands.
svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code
or download and unpack the tar file from this server.
wget http://www.steinvoorte.nl/mjpgstreamer/download/mjpg-streamer-code.tar tar -xvf mjpg-streamer-code.tar
Enter the directory made by svn or unpacking the tar file.
cd mjpg-streamer-code/mjpg-streamer
Now we have to patch the checkout or download with a patch file. Because of the linux kernel update to 3.18 mjpg-streamer needs to be fixed. (I did an update of the pi and mjpg-streamer stopped working. koos wrote a patch to fix the problem here) Create the file input_uvc_patch and open the file in nano.
nano nano input_uvc_patchCopy the following code and past this in nano by right click the mouse in putty.
--- plugins/input_uvc/input_uvc.c (revision 174) +++ plugins/input_uvc/input_uvc.c (working copy) @@ -405,9 +405,13 @@ if(pcontext->videoIn->formatIn == V4L2_PIX_FMT_YUYV) { DBG("compressing frame from input: %d\n", (int)pcontext->id); pglobal->in[pcontext->id].size = compress_yuyv_to_jpeg(pcontext->videoIn, pglobal->in[pcontext->id].buf, pcontext->videoIn->framesizeIn, gquality); + /* copy this frame's timestamp to user space */ + pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp; } else { DBG("copying frame from input: %d\n", (int)pcontext->id); - pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->buf.bytesused); + pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->tmpbytesused); + /* copy this frame's timestamp to user space */ + pglobal->in[pcontext->id].timestamp = pcontext->videoIn->tmptimestamp; } #if 0 @@ -418,8 +422,6 @@ prev_size = global->size; #endif - /* copy this frame's timestamp to user space */ - pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp; /* signal fresh_frame */ pthread_cond_broadcast(&pglobal->in[pcontext->id].db_update); Index: plugins/input_uvc/v4l2uvc.c =================================================================== --- plugins/input_uvc/v4l2uvc.c (revision 174) +++ plugins/input_uvc/v4l2uvc.c (working copy) @@ -450,6 +450,8 @@ */ memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused); + vd->tmpbytesused = vd->buf.bytesused; + vd->tmptimestamp = vd->buf.timestamp; if(debug) fprintf(stderr, "bytes in used %d \n", vd->buf.bytesused); Index: plugins/input_uvc/v4l2uvc.h =================================================================== --- plugins/input_uvc/v4l2uvc.h (revision 174) +++ plugins/input_uvc/v4l2uvc.h (working copy) @@ -28,6 +28,7 @@ #include <stdio.h> +#include <stdint.h> #include <string.h> #include <fcntl.h> #include <unistd.h> @@ -105,6 +106,8 @@ int framecount; int recordstart; int recordtime; + uint32_t tmpbytesused; + struct timeval tmptimestamp; }; /* context of each camera thread */
Use Ctrl+O to save the file and press Enter to confirm.
Press Ctrl+X to exit nano.
Now the patch with the fix for the new kernel must be applied to the code. This is done with the following command.
patch -p0 < input_uvc_patch
Build MJPG Streamer for your platform. mjpg_streamer
is the program, input_uvc.so
is a plug-in for mjpg_streamer
to get images from the webcam and output_http.so
is a plug-in for exporting the images to the http web server.
make mjpg_streamer input_uvc.so output_http.so
To give MJPG Streamer a more permanent home at a more global location, run the following commands.
Copy mjpg_streamer to the local binary directory.
cp mjpg_streamer /usr/local/bin
Copy the libraries to the local library directory.
cp output_http.so input_uvc.so /usr/local/lib/
Copy the www files to local www directory.
cp -R www /usr/local/www
Now we have to define the location of the plug-ins so MJPG Streamer will be able to find them.
nano ~/.bashrc
At de last line of the file add the following line.
export LD_LIBRARY_PATH=/usr/local/lib/
You will end up with a file like this.
# ~/.bashrc: executed by bash(1) for non-login shells. # Note: PS1 and umask are already set in /etc/profile. You should not # need this unless you want different defaults for root. # PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ ' # umask 022 # You may uncomment the following lines if you want `ls' to be colorized: # export LS_OPTIONS='--color=auto' # eval "`dircolors`" # alias ls='ls $LS_OPTIONS' # alias ll='ls $LS_OPTIONS -l' # alias l='ls $LS_OPTIONS -lA' # # Some more alias to avoid making mistakes: # alias rm='rm -i' # alias cp='cp -i' # alias mv='mv -i' export LD_LIBRARY_PATH=/usr/local/lib/
Use Ctrl+O to save the file and press Enter to confirm.
Press Ctrl+X to exit nano.
To make this change effective you can either log out and log in or run the following command to reload the file.
source ~/.bashrc
By running the following command you will start MJPG Streamer.
mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0 -r 640x480 -f 15" -o "/usr/local/lib/output_http.so -p 8080 -w /usr/local/www"
Open a browser and surf to http://IPaddressFromStep4InstallRaspbian:8080. In my case http://192.168.0.200:8080
Yeay MJPG Streamer is operational!!
You can stop MJPG-streamer by pressing Ctrl+C.
By pressing ↑-key you will get your command you ran last time. This will enable you to adapt settings for input_uvc.so
and output_http.so
.
Options for mjpg_streamer options -i and -o are mandatory:
-i | --input | "<input-plugin.so> [parameters]" |
-o | --output | "<output-plugin.so> [parameters]" |
[-h | --help ] | display this help |
[-v | --version ] | display version information |
[-b | --background] | fork to the background, daemon mode |
Options for input_uvc.so:
[-d | --device ] | video device to open (your camera) |
[-r | --resolution ] | the resolution of the video device, can be one of the following strings: QSIF QCIF CGA QVGA CIF VGA SVGA XGA SXGA or a custom value like the following example: 640x480 |
[-f | --fps ] | frames per second |
[-y | --yuv ] | enable YUYV format and disable MJPEG mode (this uses a lot of CPU power maybe to much for the Pi) |
[-q | --quality ] | JPEG compression quality in percent (activates YUYV format, disables MJPEG this also uses a lot of CPU power) |
[-m | --minimum_size ] | drop frames smaller then this limit, useful if the webcam produces small-sized garbage frames may happen under low light conditions |
[-n | --no_dynctrl ] | do not initialize dynctrls of Linux-UVC driver |
[-l | --led ] | switch the LED "on", "off", let it "blink" or leave it up to the driver using the value "auto" (It does not work for my Webcam) |
Options for output_http.so:
[-w | --www ] | folder that contains web pages in flat hierarchy (no subfolders) |
[-p | --port ] | TCP port for this HTTP server |
[-c | --credentials ] | ask for "username:password" on connect |
[-n | --nocommands ] | disable execution of commands |