Build a Raspberry Pi Webcam Server in Minutes

This tutorial will take you through how to set up a webcam server on the Raspberry Pi. You can have your very own Webcam visible on a web page.

Raspberry Pi Webcam Server

In this tutorial, we will be using a package called Motion. If you want to learn more about it, you can check out their website at Motion. This software will allow us to stream footage from a webcam connected to the Raspberry Pi. You will be able to view the stream via a web page in your favorite browser.

If you’re after more of a security-like system, check out the Raspberry Pi security camera tutorial as it features fully-fledged web streaming, motion detection, recording, and multi-camera functionality.

This tutorial is marked intermediate as it can be challenging to get it working, especially if you have hardware that differs to the versions used in this tutorial. If you can’t get this to work, the security camera solution linked above is much easier to get going.

Equipment

Below are some of the pieces of equipment that you will need to be able to complete this tutorial.

Optional

Setting up the Webcam Server on the Raspberry Pi

Firstly, we will need to install Raspberry Pi OS onto the Raspberry Pi. If you haven’t already done this, check out our guide on installing Raspberry Pi OS. It will take you through all the steps that you will need to do to get up and running.

1. We will be using the terminal, so open the terminal on the Pi or connect to it via SSH.

2. To begin, first, update the Raspberry Pi OS, so you’re running on the latest packages.

sudo apt update
sudo apt upgrade

3. Next, install the following packages. This command will work on the full and lite versions of Raspberry Pi OS.

sudo apt install autoconf automake build-essential pkgconf libtool git libzip-dev libjpeg-dev gettext libmicrohttpd-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev libavdevice-dev default-libmysqlclient-dev libpq-dev libsqlite3-dev libwebp-dev libcamera-v4l2

4. Next, download the Motion deb file for Raspberry Pi OS from GitHub using the wget command and install it using the dpkg command. You can view all the releases for Motion over at their Github.

Run the two lines below to download and install Motion.

sudo wget https://github.com/Motion-Project/motion/releases/download/release-4.6.0/$(lsb_release -cs)_motion_4.6.0-1_$(dpkg --print-architecture).deb

sudo dpkg -i $(lsb_release -cs)_motion_4.6.0-1_$(dpkg --print-architecture).deb

That’s all you need to do before moving on to configuring Motion so that it will run on your Raspberry Pi.

Configuring Motion

1. We need to edit the configuration file, motion.conf. To do this, open the file in the nano text editor.

sudo nano /etc/motion/motion.conf

2. Find the following lines and ensure they are set to the values below.

  • daemon off
  • stream_localhost off

Note: Change the following two lines from on to off if you have issues with the stream freezing whenever motion occurs.

  • picture_output off
  • movie_output off

Optional (Don’t include the text after the #)

  • stream_maxrate 100 This change will allow for real-time streaming but requires more bandwidth and resources. It needs to be added to the config file. Default is 1
  • framerate 100 Changing this option will allow for 100 frames to be captured per second, allowing for smoother video. Default is 50
  • width 640 # This line changes the width of the image displayed. Default is 640
  • height 480 # This option changes the height of the image displayed. Default is 480

Altering these options can drastically affect the performance. You may need to tinker to get the best results.

3. Once done, save and exit by pressing CTRL + X then Y.

4. We need to enable the Motion service by running the command below.

This command will make Motion start when your Raspberry Pi powers on.

sudo systemctl enable motion

5. Ensure the camera is connected and run the following line.

sudo systemctl start motion

If you need to stop the service, run the following command.

sudo systemctl stop motion

6. You should be able to check out the webcam stream at the IP address of the Raspberry Pi. To get the IP address, use the hostname command.

hostname -I

7. In your browser, go to the IP address of your Raspberry Pi, followed by the port 8081.

192.168.1.121:8081

If you are using a Raspberry Pi camera, you will need to do a few extra steps, mentioned further down the page. You will see a grey box with an error if you do not do these steps.

8. If the web page isn’t loading, try restarting the service.

sudo systemctl restart motion

9. You should now have a fully working Raspberry Pi Webcam server that you can place wherever you would like (Given it is within Wi-Fi range) and be able to view the stream via the web browser.

If you want to allow external access to the camera, check out my instructions at the bottom of this tutorial.

raspberry pi USB webcam in action

Additional Steps for Using a Raspberry Pi Camera

If you want to use the Raspberry Pi camera module, you will need to do a few additional steps to set it up.

A Raspberry Pi 5 uses a different port, so you may need to acquire a ribbon cable (Amazon) designed to fit into the new ports.

1. First, go to the CSI (Camera Serial Interface) ribbon cable slot on the Pi and with two fingers on each side of the connector, pull up. This technique should now open the connector. This port is labeled CAM/DISP 0 on the Raspberry Pi 5.

2. Insert the ribbon cable with the metal leads facing away from the Ethernet Port. If you are using a Raspberry Pi 5, the metal leads must face toward the ethernet port.

3. Once you have lined it up, gently press the connector back down, and the cable will lock in place.

Clips and Ribbon Cable

4. Since the Raspberry Pi camera relies on a library called libcamera we will need to edit the service file. To do this, enter the following line.

sudo nano /lib/systemd/system/motion.service

5. In this file, find the line that contains the following text.

ExecStart=/usr/bin/motion

Update the line to the following text.

ExecStart=/usr/bin/libcamerify /usr/bin/motion

Once done, exit the file by pressing CRTL + X and then Y.

6. Since we just changed the source service file, we will need to reload the systemctl daemon. You can do this by running the following command.

sudo systemctl daemon-reload

7. Lastly, restart the motion service to ensure our changes have taken effect.

sudo systemctl restart motion

8. You should now be able to access the Raspberry Pi webcam stream by going to the Pi’s IP address on port 8081.

192.168.1.121:8081

You should now have a fully working Raspberry Pi camera server accessible within your local network. If you want to allow external access to the camera, please follow my instructions below.

Webcam Server Browser

Saving Motion Footage and Photos

By default, you will likely have permission problems when saving the photos and video triggered by motion. I go through the steps below on how to set this up to work correctly.

1. Firstly, let’s make a new directory for our photos and videos.

sudo mkdir /motion

2. Next, we need to change the group of the motion folder so motion can write into it. After that, we give the group; read, write, and execute permissions using the chmod command.

sudo chgrp motion /motion 
sudo chmod g+rwx /motion

3. We need to go back into the motion configuration file and change the target_dir to our new directory. First, open up the file with the nano text editor.

sudo nano /etc/motion/motion.conf

4. Update the target_dir line so it looks like the one below. Ensure you remove the ; from the start of the line.

target_dir /motion

5. Next, restart the motion service to load the configuration correctly.

sudo systemctl restart motion

6. When the camera detects motion, it will be saved into the specified folder. You can check this by running the following command.

ls /motion

Check out our Linux permissions guide for more information on setting permissions correctly.

Setting Up External Access

To enable external access to the Raspberry Pi webcam server, we will need to change some settings on the router. However, all routers are designed differently, so you may need to look up instructions for your router brand.

Please note that opening ports to the internet comes with a security risk. Please use strong security measures to prevent unauthorized access to your local network.

If you need a more in-depth guide, be sure to look at my guide on how to set up Raspberry Pi port forwarding and dynamic DNS.

If you’re unable to connect outside your local network, then you can try the following.

  • Check your router settings and confirm they are correct.
  • Check your IP hasn’t changed. Some internet service providers will provide you with a dynamic IP rather than a static IP. You can set up dynamic DNS to counter this.
  • Ensure that the port mapping matches correctly with the motion port. For example, the internal port must be set to 8081.
  • Restart the router.

Conclusion

I hope you enjoyed this tutorial on how to build a Raspberry Pi webcam server. You should now be able to view your camera stream using a web browser.

If you want more projects, please check out all our Raspberry Pi projects. We are always working on more, so be sure to check back in the future or stay up to date by signing up to our newsletter.

Please feel free to use the comment section below to provide feedback for this tutorial.

Leave a Reply

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

300 Comments

  1. Avatar for Giovanni Filippi
    Giovanni Filippi on

    Hi,

    i have used a webcam tutorial, but when i read motion.conf i don’t find the line : webcam_localhost off
    I don’t find any line with webcam, any idea?

    Thank’s
    Giovanni

  2. Avatar for Brendan
    Brendan on

    Thanks for the tutorial! All goes well until the motion.conf step. I look for “webcam_localhost” And I can’t find it anywhere in the file, I don’t know if this will majorly effect the Pi, as when I continue with the other steps, I finish with no problem, but when I type the Pi’s IP and port 8081 into my browser, it doesn’t load. Tried on Safari and Chrome and the Pi just doesn’t load, I know it is on the network as I access it through SSH, any ideas?

  3. Avatar for Kepler
    Kepler on

    Hey, great tutorial! I’m a little nervous about opening up my raspberry to outside connections. Are there any security concerns from forwarding the 48461 port to the pi?

  4. Avatar for Stefan
    Stefan on

    Hi

    Using a PI3 with Jessie
    produces the following error:
    ./motion: error while loading shared libraries: libavformat.so.53: cannot open shared object file: No such file or directory

  5. Avatar for darshan
    darshan on

    how much speed internet connection does it need

  6. Avatar for Aaron
    Aaron on

    Hi

    I just tried your guide and i am stuck at the test the motion:

    pi@raspberrypi_Bplus:~/mmal $ ./motion -n -c motion-mmalcam.conf

    when i enter the command i get this error:

    ./motion: error while loading shared libraries: libavformat.so.53: cannot open shared object file: No such file or directory

    Where or what directory is it looking for? Doesn’t the first part of the command mean to goo up one level in the directory tree and enter the directory “motion”?

    what is the absolute path to that directory?

    Thanks
    Aaron

  7. Avatar for Hezarfen
    Hezarfen on

    I was following your steps until step number 8, then it seems so hard to change the file with theses settings because it doesn’t seem to match. Suggestions anybody?

  8. Avatar for beka beridze
    beka beridze on

    hi, it works but has a bug. when i reboot pi the stream starts to work for a few seconds but then i crashes. please tell me what to do 🙁

  9. Avatar for amin
    amin on

    when i run ./motion -n -c motion-mmalcam.conf
    i get
    /mmal $ ./motion -n -c motion-mmalcam.conf
    ./motion: error while loading shared libraries: libavformat.so.53: cannot open shared object file: No such file or directory

  10. Avatar for Ian
    Ian on

    H,

    Thankyou for the tutorial. It is easy to follow. However, I have run into a problem. I am using a pi 2B and a pi a+ with the latest Jessie. I have seen here a few comments ie., in the motion file the daemon is already set to “on” and there is no webcam_localhost configuration any more…
    When I start the motion with “sudo service motion start” there is no [OK] that appears (as in the video) and the motion stream is not found by my browser, even localy on the board. There is even no error.
    My webcam works fine with fswebcam taking stills so I am confident that it is compatible.
    If I enter “sudo motion start” instead then it does come up with “Motion 3.2.12+git20140228 Started” but still no streaming in the browser – either IE11 or Firefox or Chrome!
    Is this an issue to do with jessie? Please can someone help?

  11. Avatar for Danny Martin
    Danny Martin on

    Hello Gus. I am trying unsuccessfully to install and run motion on a Raspberry Pi Zero. Any suggestions on how to make this work? I will be using a USB webcam.
    Thanks

    1. Avatar for Gus
      Gus on
      Editor

      Haven’t been able to get my hands on a Raspberry Pi zero yet but I’ll take a look when I finally do. Unsure why it wouldn’t work, looking at the GIT page this seems to be a common issue.

  12. Avatar for Mia
    Mia on

    Hi, thanks for sharing. My Lifecam HD-3000 works perfectly.
    How do we record the motion? maybe for few mins.

  13. Avatar for Matt
    Matt on

    I followed this tutorial to set up my streaming webcam. One issue I ran into is that motion would crash almost immediately when something moved. I looked in /var/log/syslog and saw that the issue was that motion didn’t have permission to write in /var/lib/motion. I resolved the issue by running the following command:

    sudo chmod -R 777 /var/lib/motion

    This is just a FYI in case anybody runs into the same issue in the future.

    1. Avatar for James
      James on

      Matt,

      That worked on my setup! I now have a steady stream. Thanks for sharing that!

  14. Avatar for Stefan
    Stefan on

    Hi,

    I’ve tried to run this webcam server with two different USB cameras, and I get the same result: it’s only possible to run the camera and view it in a browser more than 7 sec (approx). then I have to open the ‘pagea again.

    And after a couple of minutes I have to restart motion to be able to watch it again.

    My cameras are a Logitech QuickCam Pro 9000 and a PlayStation 3-camera. I’ve tried to connect them directly to an USB-port on my Pi, and to a port on a USB-hub with external power.

    Any ideas on what is wrong? Any setting in the motion software?

    Thnx in advance for your support.

  15. Avatar for Rajap
    Rajap on

    Hi, I tried doing this, but I don’t know what URL to put in the browser. I am trying to access it remotely from another network.

  16. Avatar for Ulrich Engel
    Ulrich Engel on

    Hi,
    I followed your tutorial to install motion for the Pi Camera. At the end I started “startmotion” file and opened my firefox browser with the local IP for the raspi.
    A new window opened with a video-window 320×240 (width and high of the conf) but no video. Error: Unable to open video device.
    In the raspi-config I had enabled the camera.

  17. Avatar for Stefan
    Stefan on

    Hi,

    I’ve just tested the gude for setting up an webcam server using an USB-cam (Logitech Pro 9000).

    It starts up fine, but each session/video stream won’t last more than 7 secs, then I have to reload my browser for another 7 secs. This is possible to repeat a couple of minutes the I have to restart motion on my RasPi to be able to see the next 7 sec video stream.

    Any idea if it depends on any setting?

    Thanks in advance,

    Sponkenberg

  18. Avatar for James
    James on

    Hey Gus,

    Loved this tutorial made it really simple to get setup and started. I am having only one issue. I’ve looked through all of the comments and did not see anyone else having this issue.
    The issue I am having is when i get the stream going and I have to manually focus my camera, when my hand goes across the screen it kills the live stream. I am using the RPi 2 with an older usb camera.

    1. Avatar for Ryan
      Ryan on

      Hey James, I get the same issue as you. Originally I thought it was related to bandwidth or processing power. But after extensive experimenting with lots of different Low res/low framerate setting I don’t think this is the case. From what I’ve read on other forums, I think it potentially depends on what sort of usb cam you are using. Some need drivers, some dont- I think. If I had another on on hand I’d check it. What sort do you have?

    2. Avatar for James
      James on

      Ryan,

      I don’t know what kind I have, all I know is that it was a really cheap off brand camera. I’m going to be purchasing the camera that attaches to the board and give that a shot probably will work better. I will post here again and let you know my success.

    3. Avatar for Douwe
      Douwe on

      Hey guys!

      Did you found a solution to this problem yet?
      I have the same issue, as soon as the camera get moved or someone walks across it, the stream goes down.

      Let me know

  19. Avatar for david
    david on

    hi there
    is it possible to have the video stored online at all on my own server?

    Dave

    1. Avatar for Mark
      Mark on

      Hi David,
      I am Mark (see Jan 15, 2016 above). Not sure what versions you are using but I was not able to get Motion to work with Raspberry Pi 2 and the Raspberry Camera (B) 2.0. Gus has a great tutorial but I think as he mentioned above, some software sections were dropped out since the rev he wrote the tutorial on. I have seen similar problems with other tutorials. Check out my Raspberry Post here to find out what works with the latest revisions as of this writing… https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=134141&p=893318#p893318 This is a recipe of tutorials to allow you to stream live video from anywhere in the world, even modify the software from anywhere in the world. Since it is YouTube live, I think it records the last 4 hours of video that you can do what you want with it.