webvideoserver - HTTP Streaming of ROS Topics in Multiple Formats

February 19, 2026 · View on GitHub

This node provides HTTP streaming of ROS topics in various formats, making it easy to view robot camera feeds and other topics in a web browser without requiring special plugins or extensions.

Features

  • Stream ROS image topics over HTTP in multiple formats:
    • MJPEG (Motion JPEG)
    • VP8 (WebM)
    • VP9 (WebM)
    • H264 (MP4)
    • PNG streams
    • ROS compressed image streams
  • Query snapshots of image topics in multiple formats:
    • JPEG
    • PNG
    • ROS compressed image
  • Plugin-based architecture for easy addition of new streaming formats
  • Adjustable quality, size, and other streaming parameters
  • Web interface to browse available image topics
  • Support for different QoS profiles in ROS 2

Installation

Dependencies

  • ROS (Noetic) or ROS 2 (Humble+)
  • OpenCV
  • FFmpeg/libav
  • Boost
  • async_web_server_cpp

Installing packages

For newer ROS2 distributions (humble, jazzy, rolling) it is possible to install web_video_server as a package:

sudo apt install ros-${ROS_DISTRO}-web-video-server

Building from Source

Create a ROS workspace if you don't have one:

mkdir -p ~/ros_ws/src
cd ~/ros_ws/src

Clone this repository:

# ROS 2
git clone https://github.com/RobotWebTools/web_video_server.git
# ROS 1
git clone https://github.com/RobotWebTools/web_video_server.git -b ros1

Install dependencies with rosdep:

cd ~/ros_ws
rosdep update
rosdep install --from-paths src -i

Build the package and source your workspace:

colcon build --packages-select web_video_server
source install/setup.bash

Usage

Starting the Server

# ROS 1
rosrun web_video_server web_video_server

# ROS 2
ros2 run web_video_server web_video_server

Configuration

Server Configuration Parameters

ParameterTypeDefaultPossible ValuesDescription
portint8080Any valid port numberHTTP server port
addressstring"0.0.0.0"Any valid IP addressHTTP server address (0.0.0.0 allows external connections)
server_threadsint11+Number of server threads for handling HTTP requests
ros_threadsint21+Number of threads for ROS message handling
verboseboolfalsetrue, falseEnable verbose logging
default_stream_typestring"mjpeg""mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed"Default format for video streams
publish_ratedouble-1.0-1.0 or positive valueRate for republishing images (-1.0 means no republishing)

Running with Custom Parameters

You can configure the server by passing parameters via the command line:

# ROS 1
rosrun web_video_server web_video_server _port:=8081 _address:=localhost _server_threads:=4

# ROS 2
ros2 run web_video_server web_video_server --ros-args -p port:=8081 -p address:=localhost -p server_threads:=4

View Available Streams

http://localhost:8080/

The interface allows quick navigation between different topics and formats without having to manually construct URLs.

This page displays:

  • All available streamable ROS topics
  • Direct links to view each topic in different formats:
    • Web page with streaming image
    • Direct stream
    • Single image snapshot

Stream an Image Topic

There are two ways to stream the Image, as a HTML page via

http://localhost:8080/stream_viewer?topic=/camera/image_raw

or as a HTTP multipart stream on

http://localhost:8080/stream?topic=/camera/image_raw

URL Parameters for Streaming

The following parameters can be added to the stream URL:

ParameterTypeDefaultPossible ValuesDescription
topicstring(required)Any valid ROS image topicThe ROS image topic to stream
typestring"mjpeg""mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed"Stream format
widthint00+Width of output stream (0 = original width)
heightint00+Height of output stream (0 = original height)
qualityint951-100Quality for MJPEG and PNG streams
bitrateint100000Positive integerBitrate for H264/VP8/VP9 streams in bits/second
invertflagnot presentpresent/not presentInvert image when parameter is present
default_transportstring"raw""raw", "compressed", "theora"Image transport to use
qos_profilestring"default""default", "system_default", "sensor_data", "services_default"QoS profile for ROS 2 subscribers

Examples:

# Stream an MJPEG at 640x480 with 90% quality
http://localhost:8080/stream?topic=/camera/image_raw&type=mjpeg&width=640&height=480&quality=90

# Stream H264 with higher bitrate
http://localhost:8080/stream?topic=/camera/image_raw&type=h264&bitrate=500000

# Stream with inverted image (rotated 180°)
http://localhost:8080/stream?topic=/camera/image_raw&invert

Get a Snapshot

It is also possible to get a single image snapshot

http://localhost:8080/snapshot?topic=/camera/image_raw

URL Parameters for Snapshot

ParameterTypeDefaultPossible ValuesDescription
topicstring(required)Any valid ROS image topicThe ROS image topic to stream
typestring"jpeg""jpeg", "png", "ros_compressed"Snapshot image format
widthint00+Width of output picture (0 = original width)
heightint00+Height of output picture (0 = original height)
qualityint951-100Quality for JPEG snapshots
invertflagnot presentpresent/not presentInvert image when parameter is present
default_transportstring"raw""raw", "compressed", "theora"Image transport to use
qos_profilestring"default""default", "system_default", "sensor_data", "services_default"QoS profile for ROS 2 subscribers

Stop an Active Stream

To stop one or more active streams from the server side (e.g. when a UI component unmounts), use the /shutdown endpoint:

http://localhost:8080/shutdown?topic=/camera/image_raw

This closes all active streams for the given topic. An optional client_id parameter scopes the shutdown to a single named connection:

http://localhost:8080/shutdown?topic=/camera/image_raw&client_id=my-ui

To associate a stream with a client_id, pass it when opening the stream:

http://localhost:8080/stream?topic=/camera/image_raw&client_id=my-ui

The response is plain text in the form stopped=<count>, where <count> is the number of streams that were stopped. Returns 400 Bad Request if topic is omitted.

URL Parameters for Shutdown

ParameterTypeDefaultDescription
topicstring(required)The ROS topic whose streams should be stopped
client_idstring(none)If provided, only the stream with this client_id is stopped

Creating custom streamer plugins

See the custom streamer plugin tutorial for information on how to write your own streamer plugins.

About

This project is released as part of the Robot Web Tools effort.

License

web_video_server is released with a BSD license. For full terms and conditions, see the LICENSE file.

Authors

See the AUTHORS file for a full list of contributors.