When you want something a little simpler and more lightweight than Zoneminder for operating surveillance cameras, try Motion.
Motion is a nice lightweight, yet capable application for operating surveillance cameras on Linux. It works with any Linux-supported video camera, including all V4L Webcams, many IP cameras, Axis cameras, and it controls pan and tilt functions. Motion records movies and snapshots in JPEG, PPM, and MPEG formats, and you can view these remotely in a Web browser thanks to Motion’s built-in HTTP server. It stores image files in a directory of your choosing, and it does not require a database, though it supports MySQL and PostgreSQL if you do want to use one.
First let’s look at how to get an IP camera working with Motion using my trusty Foscam FI8905W (figure 1), and then we’ll add a USB Webcam.
Installation is easy on Debian and Debian derivatives, because Motion is included in the standard software repositories. So all you need to do is run
apt-get install motion. You also need
libav-tools, which is a fork of
ffmpeg. Many moons ago, Debian dropped
ffmpeg and replaced it with
libav-tools (See Is FFmpeg missing from the official repositories in 14.04? to learn the gory details, and how to get
ffmpeg itself if that’s what you really want). On other distros, check the downloads page and installation guide for instructions. Most other distros still include
The installer should create a
motion group and user, and add the
motion user to the
video group. If it doesn’t, then you must create them yourself. Add yourself to the video group as well, to get around permissions hassles.
motion to see if it works:
$ sudo motion  Processing thread 0 - config file /etc/motion/motion.conf  Motion 3.2.12 Started  ffmpeg LIBAVCODEC_BUILD 3547904 LIBAVFORMAT_BUILD 3544067  Thread 1 is from /etc/motion/motion.conf  Thread 1 started  motion-httpd/3.2.12 running, accepting connections  Failed to open video device /dev/video0: No such file or directory  motion-httpd: waiting for data on port TCP 8080  Could not fetch initial image from camera  Motion continues using width and height from config file(s)  Resizing pre_capture buffer to 1 items  Started stream webcam server in port 8081 [...]
It will go on for many more lines, until you see:
 Failed to open video device /dev/video0: No such file or directory  Video signal lost - Adding grey image
Point your Web browser to
localhost:8081 and you will see a gray image:
This is good, as it means Motion is installed correctly, and all you have to do is configure it. Press Ctrl+C to stop it. Then create a
.motion directory in your home directory, copy the default configuration file into it, and change ownership to you:
~$ mkdir .motion ~$ sudo cp /etc/motion/motion.conf .motion/ ~$ sudo chown carla:carla .motion/motion.conf
You also need a directory to store images captured by motion:
~$ mkdir motion-images
When you start Motion it looks for a configuration file in the current directory, then in
~/.motion, and finally
/etc/motion. Now edit your
~/.motion/motion.conf file– this example includes basic configurations, and the lines relevant to my Foscam IP camera:
# Start in daemon (background) mode and release terminal (default: off) daemon on # Output 'normal' pictures when motion is detected (default: on) [...] output_normal off # File to store the process ID, also called pid file. (default: not defined) process_id_file /var/run/motion/motion.pid # Image width (pixels). Valid range: Camera dependent, default: 352 width 640 # Image height (pixels). Valid range: Camera dependent, default: 288 height 480 # Maximum number of frames to be captured per second. # Valid range: 2-100. Default: 100 (almost no limit). framerate 7 # URL to use if you are using a network camera, size will be autodetected (incl http:// ftp:// or file:///) # Must be a URL that returns single jpeg pictures or a raw mjpeg stream. Default: Not defined netcam_url value http://http://192.168.10.250:8080/videostream.cgi # Username and password for network camera (only if required). Default: not defined # Syntax is user:password netcam_userpass admin:mypassword # Target base directory for pictures and films # Recommended to use absolute path. (Default: current working directory) target_dir /home/carla/motion-images # Codec to used by ffmpeg for the video compression. [...] ffmpeg_video_codec mpeg4
You need to create the directory for storing the PID file, as it says in
$ sudo mkdir /var/run/motion
Now try starting it up again:
$ sudo motion  Processing thread 0 - config file /home/carla/.motion/motion.conf  Motion 3.2.12 Started  Motion going to daemon mode
Good so far, now try
Well look, there is my driveway. Now I will have plenty of warning when visitors come, so I can loose the moat monsters. Run around in front of your camera to trigger motion detection, and when you come back your images directory should have some
.avi movies in it. You should also find a simple Motion control panel at
IP Camera Settings
How to Operate Your Spycams with ZoneMinder on Linux (part 1) goes into some detail on setting up your camera. You must follow the vendor’s instructions for the initial setup, such as assigning a login and password, and setting the IP address. You may have other options as well, such as frame size, motion sensitivity, and color depth or black and white.
Getting the correct
netcam_url is sometimes a hassle. For my Foscam I brought up its control panel in Firefox, right-clicked on the image (figure 4), then left-clicked View Image Info. This opens a screen like figure 5, which shows the exact URL of the videostream. In the Chrome browser use “Inspect element.”
Fine-tuning Configuration Values
You can make all kinds of adjustments in your configuration file such as image size, image quality, frame rate, sensitivity to movement, greater sensitivity in selected areas of the frame, file paths, HTTP server settings, and time stamp formats. Motion Guide – Alphabetical Option Reference Manual gives detailed information on each option. Remember to harmonize your Motion settings with the settings in your camera’s control panel, if it has one.
Any V4l-supported USB Webcam should work with little fuss. The video device will be
/dev/video0 will be present only when a video camera is connected directory to your computer. This is a basic example configuration for my Logitech Webcam:
videodevice /dev/video0 width 640 height 480 framerate 24 output_normal off ffmpeg_video_codec mpeg4 target_dir /home/carla/motion
And again, remember that settings such as frame rate and size are dependent on what your camera supports.
Once you have everything working, make Motion run as a daemon by editing
/etc/default/motion, and changing
start_motion_daemon=yes. Now Motion will start automatically when you start your computer, and you can start and stop it like any other daemon.
Controlling Multiple Cameras
Motion manages multiple cameras with ease — all you do is give each camera its own configuration file, named
thread1.conf, and so on. You still need your main
motion.conf for common options such as
daemon on and filepaths. Then each “thread” file has configurations specific to each camera.