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

    Dear All

    I installed motion with on my 16Gb memory card on a raspberry pi2. I followed the instructions exactly.
    I got an error while loading shared libs

    pi@raspberrypi ~/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

    What could be the problem?

    Best regards,
    Ruud
    The Netherlands

  2. Avatar for Adriana
    Adriana on

    Hi,
    I’m trying to stream the video of my raspberry pi B/raspberry pi camera (Rev. 1.3) with motion-mmal.
    I did according the instructions, but most of the time there is a grey field with “unable to open video device”… Is there anything I can do to get the videostream?
    The camera itself works fine (when runnint raspivid or raspistill)
    Thanks

  3. Avatar for samppa
    samppa on

    Hello!
    I have an issue. When there is too much motion in the video, my stream goes off and I have to restart it ( sudo service motion stop & sudo service motion start)

  4. Avatar for Sanjay
    Sanjay on

    Hi Gus,thanks for this post, very useful. One question however, to download the video stream, do you reckon ffmpeg? Or is there anything available out of the box? Thanks

  5. Avatar for Mason neal
    Mason neal on

    When I sudo nano the motion.conf it is empty any ideas?

  6. Avatar for abhijeet ramgir
    abhijeet ramgir on

    How can you start the USB Webcam automatically at Boot?

    Thanks

  7. Avatar for Paul
    Paul on

    HI I used your guide for mmal.

    I used a another guide for control/monitor my Garage door and added your guide for video.

    Problem is the get the mmal video I use the ip:8081 as a source in html. When attempt to get my web page that has port forwarding done, only my control/monitor stuff work and video is missing. Is there a way to pipe the mmal video to the port 80 webpage without getting the video from 8081 mini-server.

    Take a look at this web page to see what I did. http://www.instructables.com/id/Raspberry-Pi-Garage-Door-Opener-with-streaming-vid/

  8. Avatar for Jon
    Jon on

    Hi Gus! Like two others in this comment section I also get a grey box and the text “Unable to open video device”.Any idea what’s going on? I tried to do your tutorial twice, but with the same result. My cam blinks like its on just cannot get a video to show…
    My camera is Pi NoIR Camera Board 5mp 1080P W/filter Night Vision Module X000QGCF5R
    Running on a Pi2 B
    Please Help!

    1. Avatar for Gus
      Gus on
      Editor

      Hey Jon,

      There is an issue with the package I used in the Raspberry pi camera part of the tutorial. It only affects the Raspberry Pi 2.

      If you check out this tutorial you shouldn’t get the issue: http://pimylifeup.com/raspberry-pi-security-camera

    2. Avatar for Robster
      Robster on

      Hi Gus,

      I need to use a general cam with USB and cable as I need to (re)position my cam from time to time to monitor a basin with my pet turtles. Any ideas or suggestions for me? Do I need a different cam or driver?

      Thanks.

    3. Avatar for Marco
      Marco on

      this did work for my RPi2…
      http://pimylifeup.com/raspberry-pi-security-camera

      There is a 3 second lag before the monitor updates motion, but that doesn’t appear to be a problem. I don’t see motion exclusion areas in MotionPie like in Zoneminder. but, I will keep learning this system and Linux. A big tip of the hat to all your help. Thanks.

    4. Avatar for Robster
      Robster on

      Hey guy, found out that apparently not all the cams work (properly) on the Pi. I had a cheap cam which didn’t show the feed properly. When I attached a Microsoft HD-5000 LifeCam it worked, but as Marco mentions with a few seconds delay. I still have to figure out how to get sound though. Anyone any suggestions?

  9. Avatar for Cy80rg
    Cy80rg on

    Hi Gus,

    Am looking into using my Rpi2 as a server for 4x WiFi IP cameras.

    Motion looks the way to go (vs zoneminder etc), do you know how to set motion up with IP cams, on the same network?

  10. Avatar for Tass Abd
    Tass Abd on

    Can you tell me how to port forward to BT-HomeHub-5

  11. Avatar for John Tallon
    John Tallon on

    How do I add a username and password for the video feed?

    -Thanks

  12. Avatar for John Tallon
    John Tallon on

    Is there a way to get audio with the video?

    Thanks

  13. Avatar for Paul
    Paul on

    I get everything to work but cannot the website to come up.

    I also have another webserver running for my garage door.

    1. Avatar for Gus
      Gus on
      Editor

      Hey Paul,

      Is the websever running on the same Pi as the webcam server ?

      If so it probably be beneficial to change the port numbers.

      Just change the references to the ports to something else such as 9090 and 9091. (Previously 8080 and 8081)

      You can find these values in the config files.

      sudo nano /etc/default/motion

      for the webcam and

      sudo nano motion-mmalcam.conf

      for the raspberry pi camera.

  14. Avatar for Franklin
    Franklin on

    Can this show the video on an iPad ? I can’t see on chrome

    1. Avatar for Gus
      Gus on
      Editor

      Hi Franklin,

      Chrome no longer supports mjpeg streams (Annoying).

      To fix the issue you can create a html file with a image tag linking to the stream:
      For example

      <.img src="http://:8081">
      (remove the full dot at the start of the tag)
      Once done just simply open the HTML file in chrome it should work.

      Let me know how you go!

    2. Avatar for Franklin
      Franklin on

      Thank you

    3. Avatar for Franklin
      Franklin on

      hi Gus, it flashes and disappear . But it’s getting there.
      Thanks again
      Franklin

  15. Avatar for G
    G on

    Hey. Great tutorial! Everything works smooth and sweet! Thanks!
    Got a question though: how about some security? I’ve got a static address, opened the 8081 port for Raspberry Pi, so I am accessing my home webcam (with my kitties) from Internet (at work). Is it possible to enable a login/password request in Motion or in any way set up a security to prevent unauthorized connect?

    1. Avatar for Gus
      Gus on
      Editor

      That’s a good question, are you using a webcam or the pi camera? They use different packages. (Depending on which I’ll look into)

    2. Avatar for G
      G on

      Thanks for answer.
      I’m using a usual webcam, all settings are as described in this tutorial. I connect to the webcam thru Internet using dyndns, if that matters. Latest version of Raspbian, ethernet-connected to the home router.

  16. Avatar for Steve M
    Steve M on

    I’m trying to get this going with a USB webcam with a pi 2 and have two observations:

    1. sudo motion service stop does not stop my service, and even after running that line and a reboot, the service starts up automatically.

    2. On a desktop browser, I see nothing at the pi’s IP address. If I go to it on my iPad with safari I get the same result, but if I scroll with my finger I get flashes of the video feed. I suspect that the pi is sending the video feed just fine and there’s something wrong with my router settings, but I could be wrong.

    1. Avatar for bishoy hanna
      bishoy hanna on

      I have more than ipad, one of them did so, so i installed VLC from appstore which was more specialized in receiving video streams.

  17. Avatar for Jeff D
    Jeff D on

    Well presented project … was exactly what I was looking for; so I gave it a go.
    After carefully following the directions, I had my Pi (B+) up and running double quick with the USB webcam. Problem came after 10 minutes when the cam shut down.
    Worked again after re-boot but then shut down again.
    Doesn’t seem to want to stay working for more than 5 to ten minutes at a time. 🙁
    Have I missed something elemental here ????

  18. Avatar for Jimmy Alenius
    Jimmy Alenius on

    Hi Gus! Like two other in this comment section I also get a grey box and the text “Unable to open video device”.Any idea what’s going on? I tried to do your tutorial twice, but with the same result.

    Regards / Jimmy

    1. Avatar for Gus
      Gus on
      Editor

      Hey Jimmy,

      This sounds like there is an issue between the software and the camera. Most likely an issue with the webcam driver you’re using. Can you please let me know what kind of webcam you’re using ?

    2. Avatar for TJ
      TJ on

      Hi, I am also having same problem.
      When I typed http://IP:8081
      gray screen comes out and shows ‘unable to open video device’

      I am using Raspberry camera.

      Thank you

    3. Avatar for Robster
      Robster on

      I also have the unable to open video device. Occasionally there is a short moment I see feed, but it goes back to grey again. How can we check/update the driver? Or which cam would work best?

    4. Avatar for MH
      MH on

      I installed the motion program, then connected a Logitech webcam and got the “Unable to open video device” message. Then I connected an old Creative VF0040 cam and all was OK.

    5. Avatar for Esbee
      Esbee on

      Hi there,

      I was wondering if you had to do anything extra to get your VF0040 working with your Pi. I’m getting a similar error(“Unable to open video device”) when using VF0040 with MotionEye on a RPi0 W.

      thanks.

    6. Avatar for MH
      MH on

      No, it worked right out of the (junk) box.

    7. Avatar for C7cristian
      C7cristian on

      first type “sudo service motion stop”, then type “./motion -n -c motion-mmalcam.conf”

  19. Avatar for Toni
    Toni on

    Hi

    I have Raspberry Pi 2 model B and Pi NoIR camera. When i put in mmal the ./startmotion command the red led in camera starts blinking, then i put my browser the ip-address and port8081 and i see only black screen? Where is the picture?

  20. Avatar for Nick
    Nick on

    Hi gus,

    Stellar tutorial! Getting an issue on my b+.

    Its the same segmentation fault that others have mentioned above. Any thoughts on a fix?