Camera Hardware
Everything about the camera end of the system โ what works, how to wire it up, and where to point it. Most installs use an off-the-shelf RTSP camera (TP-Link Tapo is the most popular). The server edition also supports a wired Raspberry Pi Camera Module on the CSI ribbon cable.
RTSP cameras
RTSP (Real-Time Streaming Protocol) is a standard way for cameras to send live video over a network. BirdWatchAI connects to your camera with an RTSP address that looks like this:
rtsp://username:password@camera_ip:port/stream_path
For example: rtsp://birduser:secret123@192.168.1.105/stream1. The
pieces are:
- username:password โ the camera's RTSP / "camera account" credentials.
- camera_ip โ the camera's address on your network
(e.g.
192.168.1.105). - port โ almost always
554(can be omitted when it's 554). - stream_path โ brand-specific (e.g.
/stream1for Tapo).
Common stream paths by brand:
| Brand | Stream path | Notes |
|---|---|---|
| TP-Link Tapo | /stream1 (HD) ยท
/stream2 (SD) | See Tapo section below for which to use on which model |
| Wyze (RTSP firmware) | /live | Requires custom RTSP firmware flashed |
| Amcrest / Dahua | /cam/realmonitor?channel=1&subtype=0 | |
| Reolink | /h264Preview_01_main | |
| Hikvision | /Streaming/Channels/101 |
TP-Link Tapo step-by-step
Tapo cameras (C100/C110/C113/C120/C200/C210/C310/C320WS/C500/C510W/C520WS, etc.) are popular, affordable, and well supported. The most important thing to understand is the Camera Account.
Create the Camera Account (for RTSP)
- Open the Tapo app and tap your camera to open Live View.
- Tap the โ gear (top right) โ Advanced Settings โ Camera Account.
- Tap Understand and Agree to Use.
- Set a username (6โ32 characters) and password (6โ32 characters), then Save. Use these in BirdWatchAI's RTSP fields.
Find the camera's IP address
Tapo app โ โ gear โ Device Info โ IP Address
(e.g. 192.168.1.105). Alternatively, check your router's
connected-devices list for a name like TAPO_C120_XXXX.
Streams & quality โ which stream path to use
Tapo cameras expose two RTSP streams:
/stream1โ the main stream. Up to 2K on higher-end models./stream2โ the sub-stream. Lower resolution, lighter on Wi-Fi.
Which one to use depends on the model:
| Model | Recommended | Why |
|---|---|---|
| C113 (and similar mid-range) | /stream2 |
720p; reliable, easy on Wi-Fi, plenty of detail for identification. |
| C120 and most lower-cost models | /stream1 at 1080p |
Their /stream2 caps at 640ร360, which loses too much detail
for the AI to identify reliably. |
| Any Tapo at 2K main stream | Avoid | 2K saturates the camera's Wi-Fi uplink and causes H.264 corruption and instability. Drop to 1080p in the Tapo app first. |
For the C120 and friends, set Tapo app โ Camera Settings โ Video
Quality โ 1080p, then use /stream1.
Quick reference
| Setting | Value |
|---|---|
| RTSP Port | 554 |
| ONVIF Port (motion events) | 2020 |
| Camera account username / password | 6โ32 characters each |
Optional: remote camera reboot (desktop only)
The desktop app can power-cycle a frozen Tapo camera automatically (or on demand via the tray menu's ๐ Restart Camera). This feature needs your TP-Link cloud account email and password, entered in Settings โ Camera (RTSP) โ TAPO Camera Reboot. These are your cloud-login credentials, distinct from the RTSP camera account.
Reserving the camera's IP in your router
Every router brand has a slightly different menu, but the concept is identical everywhere:
- Open your router's admin page in a web browser (commonly
192.168.1.1or192.168.0.1โ check the label on your router) and sign in. - Find the DHCP settings. Depending on the brand this lives under a menu such as LAN, Network, DHCP Server, Address Reservation, or Connected Devices / Client List.
- Locate your camera in the list of connected devices (look for a name like
TAPO_C120_XXXX, or match it by its MAC address โ a unique hardware ID printed on the camera and shown in the camera app under Device Info). - Choose Reserve / Bind / Add Static Lease for that device, and either keep its current IP or assign one you'll remember.
- Save / apply. Then reboot the camera (or wait for its lease to renew) so it picks up the reserved address.
- Use that same reserved IP in BirdWatchAI's Camera IP Address field.
Other camera brands
Any RTSP camera works. General tips:
- Enable RTSP in the camera's app or web interface if it's off by default.
- Wyze cameras need custom RTSP firmware (e.g. Dafang Hacks /
wz_mini_hacks); the stream path is then
/live. - Use port
554unless your camera documents otherwise. - Find the IP via the camera app, your router, or a network scanner such as Fing or Advanced IP Scanner.
- Use the correct stream path for your brand (table in RTSP cameras above).
Raspberry Pi camera (CSI ribbon, server only)
The server edition supports a wired Arducam / Raspberry Pi Camera Module attached over the CSI ribbon cable, as an alternative to RTSP. Capture goes through libcamera (the modern Pi camera stack), not legacy v4l2 โ so the container needs broader access to the Pi's hardware than a USB webcam would.
One-time setup
- Plug the ribbon cable in with the Pi powered off. Lift the CSI port's clip, slide the ribbon in (contacts toward the HDMI port on Pi 4 / 5), press the clip back down.
- Enable the camera interface on the Pi. On Pi OS Bookworm,
sudo raspi-configโ Interface Options โ Camera โ Yes โ Finish โ reboot. (No-op on most fresh installs: libcamera + v4l2 compat are enabled by default.) - Verify the OS sees it. SSH in and run
libcamera-hello --list-camerasโ you should see at least one camera listed (e.g.imx519for an Arducam motorized-lens module,imx708for the Camera Module 3,ov5647for the original v1 module). If "No cameras available!", go back to the ribbon-cable seat โ that's the most common cause. - Edit
~/birdwatch/docker-compose.ymlto grant camera access. The file ships with a single commented-out line under the "Pi camera support" block:# privileged: true. Uncomment it (delete the leading#, keep the indentation matching the lines above it likerestart:andports:). That's the entire compose change. - Recreate the container so the new mode takes effect:
cd ~/birdwatch docker compose up -d --force-recreate birdwatch - Switch the camera type in the dashboard. Open
http://<your-host>:8080โ Settings โ Camera โ set Camera type to Pi camera โ leave the device path at0(libcamera's camera index; the field also accepts/dev/video0for compatibility) โ click Test camera. A frame should come back within a few seconds. Save.
/proc/device-tree/model to
confirm "this is a Raspberry Pi" before it'll initialize the camera stack. Docker
mounts its own procfs over /proc after applying bind mounts, so a
- /proc/device-tree:/proc/device-tree:ro mount gets shadowed and the
platform check fails ("No cameras available!" inside the container even though
all the video / media nodes are wired through). Granular device passthrough was
the original approach and works on Bullseye but not Bookworm. Privileged mode
grants the container the host's full device + sysfs view in one line โ the
standard pattern for libcamera in Docker.
If Test camera errors out
The most useful diagnostic is, from the host shell:
docker exec birdwatch rpicam-hello --list-cameras
Run inside the container โ if it lists your sensor, the access path works and the
issue is on the app side. If it says "No cameras available!" inside the container
but works on the host, you likely missed step 4 (the privileged: true
uncomment). Confirm with:
docker inspect birdwatch --format '{{.HostConfig.Privileged}}'
It should print true.
The existing motion + identify pipeline runs on the Pi camera feed the same as on RTSP โ frame-diff motion detection is the default trigger (Settings โ Detection โ Motion detection threshold). ONVIF doesn't apply to wired cameras.
Placement & lighting
The single biggest accuracy improvement you can make isn't a setting โ it's a better view of the bird.
- Aim the camera at the feeder from 3โ10 feet for a clear, bird-filling frame โ distant birds are harder to identify.
- Avoid pointing into direct sun; backlighting silhouettes the birds.
- Minimize swaying branches and busy backgrounds in the frame to reduce false motion.
- Strong Wi-Fi at the camera = fewer dropouts and choppy video.
- Position so the bird is well-lit and roughly centered where it lands or feeds.
- Keep the camera glass / lens clean โ dust and water spots both blur the photo and confuse the motion detector.
/stream2 just works.