Skip to content

RobotWebTools/web_video_server

Repository files navigation

web_video_server - HTTP Streaming of ROS Image Topics in Multiple Formats

This node provides HTTP streaming of ROS image topics in various formats, making it easy to view robot camera feeds and other image 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 topics
  • Adjustable quality, size, and other streaming parameters
  • Web interface to browse available image topics
  • Single image snapshot capability
  • 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

Parameter Type Default Possible Values Description
port int 8080 Any valid port number HTTP server port
address string "0.0.0.0" Any valid IP address HTTP server address (0.0.0.0 allows external connections)
server_threads int 1 1+ Number of server threads for handling HTTP requests
ros_threads int 2 1+ Number of threads for ROS message handling
verbose bool false true, false Enable verbose logging
default_stream_type string "mjpeg" "mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed" Default format for video streams
publish_rate double -1.0 -1.0 or positive value Rate 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 ROS image topics currently being published
  • 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:

Parameter Type Default Possible Values Description
topic string (required) Any valid ROS image topic The ROS image topic to stream
type string "mjpeg" "mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed" Stream format
width int 0 0+ Width of output stream (0 = original width)
height int 0 0+ Height of output stream (0 = original height)
quality int 95 1-100 Quality for MJPEG and PNG streams
bitrate int 100000 Positive integer Bitrate for H264/VP8/VP9 streams in bits/second
invert flag not present present/not present Invert image when parameter is present
default_transport string "raw" "raw", "compressed", "theora" Image transport to use
qos_profile string "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

Parameter Type Default Possible Values Description
topic string (required) Any valid ROS image topic The ROS image topic to stream
width int 0 0+ Width of output picture (0 = original width)
height int 0 0+ Height of output picture (0 = original height)
quality int 95 1-100 Quality for JPEG snapshots
invert flag not present present/not present Invert image when parameter is present
default_transport string "raw" "raw", "compressed", "theora" Image transport to use
qos_profile string "default" "default", "system_default", "sensor_data", "services_default" QoS profile for ROS 2 subscribers

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.