An ESP32 camera running ESPHome has so far streamed through the native API to Home Assistant, or through the esp32_camera_web_server component. The new rtsp_server component adds the protocol that video players and recorders already understand. Christian (max246) opened the pull request on 31 July 2026, building on an earlier one (#1905), and bdraco merged it into the development branch on 17 October at 17:18 UTC. The documentation (esphome.io #7082) went in a minute earlier, so the component is set for ESPHome 2026.11.
How it streams
The server sends Motion JPEG, the format the camera hardware already produces, as RTP packets carried inside the RTSP TCP connection. A client that asks for UDP gets a "461 Unsupported Transport" reply and falls back to TCP, which VLC, ffplay and the common recorders do on their own. The stream sits at rtsp://<device-ip>:554/. The camera only streams while at least one client is playing.
The configuration is short:
rtsp_server:
port: 554
max_connections: 2
max_connections accepts 1 to 4, and each slot reserves about 900 bytes of memory and a socket for the whole run. The esp32_camera has to deliver JPEG, either natively or converted with jpeg_quality. GRAYSCALE is rejected, and so is any resolution above 2040 pixels per side. A client that makes no progress for half a second drops its current frame, so one slow viewer cannot hold up the camera for everyone else.
Frame rate depends on the network buffers
A 640x480 frame weighs 6 to 19 KB, far more than the 5.7 KB lwIP queues per TCP connection by default. With that buffer a Wi-Fi client got about 1 frame per second. The component therefore switches on ESPHome's high-performance networking settings, which lifted the same Wi-Fi client to about 5 fps and an Ethernet client to the camera's full 10 fps. The measurements come from a Waveshare ESP32-S3-ETH with an OV5640 sensor at 640x480. The larger buffers cost memory, and boards that cannot spare it can set network: enable_high_performance: false.
No password, and not for Home Assistant
The documentation is blunt about security. The connection is plain TCP with no encryption and no authentication. The allowed_ips option limits which IPv4 addresses or networks may connect, but it filters by address and does not prove who is on the other end. Leave it out and any host that can reach the port can watch the camera, so this belongs on a trusted network only.
Home Assistant users do not need the component. The camera entity already streams over the native API, and pointing Home Assistant's Generic Camera at the RTSP address will not work, because its stream pipeline only plays H.264 and HEVC. The server is meant for other software: Frigate, go2rtc, ZoneMinder, Blue Iris or a plain video player.