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 James
    James on

    Hi,
    Has your written steps changed since creating the video?

    I’ve followed the written steps on an rpi 3 with rpi camera and am getting a grey box with “unable to open video device”

    Thanks

    1. Avatar for Gus
      Gus on
      Editor

      Written steps have changed and should work with the Pi camera or a webcam (depending on drivers etc). If you followed the video then you may run into issues getting the Pi camera to work.

    2. Avatar for James
      James on

      Hi, thanks for your comments.

      I started fresh with a new load of raspbian and it works this time. I must not have done something right. Thanks again.

      Now I need to make it more secure.

  2. Avatar for Quentin
    Quentin on

    I got everything working, the only question i have is if its possible to add this stream to the synology Surveillance station? if yes then how?

  3. Avatar for PE4000
    PE4000 on

    First try with my Logitech C920 HD cam on RPi 3 with powered usb-hub, video capture size 1280×720 or more…
    Viewing on W10/64 up-to-date computer / Acer 8″ tablet W10/32
    Firefox 54: it works perfect.
    Microsoft Edge: it don’t want to view, only download the stream.
    Pale Moon: also perfect viewing.

    Thanks for this great tutorial.

  4. Avatar for William Quintas de Melo
    William Quintas de Melo on

    Hi!

    Can I configure the motion to access the webcam with a link like “ip:/cam1” where ip is like “146.106.91.100” instead using the port “:8081“?

    Thanks!

  5. Avatar for Metai
    Metai on

    Thank you sir it works perfectly, it helped me a lot. 😀

  6. Avatar for Tesso
    Tesso on

    Great post, just a question, how do i setup multiple webcams?

  7. Avatar for sunil
    sunil on

    can I send the motion detection notification with image or jpg files to the email..

  8. Avatar for Apostolos
    Apostolos on

    Hello,

    thanks for all this great details!
    When you access externally through dynDNS how can you password protect the page?

    Thanks a lot
    Apostolos

  9. Avatar for Charles
    Charles on

    This is great! I’ve been struggling for a while with a random bag of endless problems getting a streaming feed from a Pi. Followed loads of other ‘solutions’ elsewhere, none worked.

    Started with a fresh install, this works a treat. Thanks!

  10. Avatar for theosus
    theosus on

    trying this today, and using the command

    sudo apt-get install curl libssl-dev libcurl4-openssl-dev libjpeg-dev libx264-142 libavcodec56 libavformat56 libmysqlclient18 libswscale3 libpq5

    returns an error saying the package is missing or obsoleted. Any help?

  11. Avatar for Ben
    Ben on

    Hey,

    does anyone know how to stream this through an ardunio 4G sheild?

    I have a raspberry pi expansion kit which lets me plug in ardunio shield, however im not sure where to start with getting this working.

    I have seen it done before, however there was no open-source code provided for it!!

    Thanks in advance!!

  12. Avatar for Klaus
    Klaus on

    Hi Gus,
    many thanks for this really nice and clear post, that’s great!

    I tried it, and on my raspberry B+ it’s working at once-
    but with a few problems:

    I tried it with 3 different usb cameras, which are all working under different windows versions, from XP up to windows 10.

    Here I found different problems:
    – Logitech and Sansun webcam: I cannot set the image size. Independent from the given width and height values I always get only a very small video size. 176×144 with Logitech, 123×159 with Sansun.
    – Hama camera with autofocus: The video size is ok, but the autofocus cannot fix, it’s always searching the fix point, even if there is no move on the video.

    Have you any ideas, how I can fix this problems? Or at least one of them? That would be great 🙂

  13. Avatar for LaurieR
    LaurieR on

    If I set “ffmpeg_video_codec mp4” it works fine and I capture H.264 mp4 files ok.
    But if I change to “ffmpeg_video_codec hevc” , which the motion.conf comment says should create H.265-encoded files, nothing is captured.

    I wonder – does Step 3 removes the H.265 codec and Step 5 doesn’t reinstall it? If so, how do I install an H.265 encoder for ffmpeg?

  14. Avatar for Lorenzo
    Lorenzo on

    Hi when I go to the rpi ip address on 192.168.1.7:8081 it shows me a grey screen with the message “unable to open video device sice the date when i tried to connect”. I use a rpi0w with a picamera v2 and I’ve made the steps to activate the picamera. Can anyone helps me?
    Thankyou wery much, it’s a super guide!!

    1. Avatar for Pradeep
      Pradeep on

      I also got the same error with the Pi camera on Pi 3 but the issue in my case was that I typed bcm2835-v4l2 as bcm2835-v412 which is pure typing error. After correction, my camera is showing a small red light and video is accessible on browser. What I would advise is copy pasting the commands from start. Hope it helps!

  15. Avatar for JJ
    JJ on

    I get the forward as the internal listening port 8081 but where do wet change this. Also I am trying to adapt to show up to 8 cameras and I think motion eye would be the go-to for that; but what port does that listen on? I’ve watched a few tutorials but they were focused on watching and access internally. I want to get access to the camera screen from my phone for example.

  16. Avatar for Bill
    Bill on

    Is it possible to just get a NOOBs Pi image that is precompiled and flashed to a card for the Pi? It seems like that could help avoid the many possible mistakes that I make trying to fight through the settings, dependencies, etc.

  17. Avatar for Joe
    Joe on

    I’ve noticed the onboard RPI v2 camera, generates a LOT of heat within the RPI when its being used/accessed.

    I see 165’F on the PI temperature sensor.

    I may go with an external camera to keep this from happening.

  18. Avatar for Paul
    Paul on

    Please can you update the method.
    Step 4 no longer exists and makes this impossible to do.

    1. Avatar for Gus
      Gus on
      Editor

      It downloads for me just fine.

  19. Avatar for SG
    SG on

    The motion detection .conf file gives you the option to set a “username:password” for stream access.

    Is there a way to ban the ip (maybe through fail2ban?) that gives the wrong credentials?

    I thinking of 2 ways but don’t know how to go further:
    a. Is there any log file when someone accesses port 8081? or
    b. Can we stream motion detection video through our website instead of port 8081?

    Thanks!

  20. Avatar for Laurie R
    Laurie R on

    This works perfectly with the “EasyCap” USBTV007 composite-to-USB converter. I didn’t have to do anything other than follow the above instructions (then add permissions on the capture folder as others have mentioned). The latest Jessie / Pixel version of Raspbian includes the necessary USBTV007 drivers.

    This is perfect for a nestbox cam where you need a long cable run between the camera and the Pi.