A Go application for monitoring and tracking the availability of Real-time Transport Protocol (RTP) streams in your network. The application discovers and displays stream information by subscribing to the actual stream data.
- Tiling Terminal UI: zellij-style panes, each bound to one stream, that you can add, move, resize, zoom and close
- Headless Mode: Command-line monitoring without UI for automation and logging
- Stream Discovery: Discover streams via mDNS, SAP, or static SDP files
- Live VU Meters: Real-time audio level visualization
- RTCP log: Detailed per-stream RTCP packet analysis
- Real-time Updates: Periodic refresh of stream status and statistics
- WAV Recording: Record any number of streams at the same time, each in its own pane
- PTP Monitor: If started with sufficient privileges, PTP time transmitters will be monitored and their equivalent RTP timestamp will be displayed in the stream details view.
- FPGA RX streaming: Support for Ravenna FPGA stream receiver (only available on Linux with special hardware)
- Go 1.26 or later
git clone https://github.com/holoplot/rtp-monitor.git
cd rtp-monitor
go mod download
go build -o rtp-monitorThe project includes a Makefile for easy development:
make build # Build the application
make run # Build and run the application
make clean # Clean build artifacts
make test # Run tests
make version # Show version information
make release # Build for multiple platformsThe application uses git describe to automatically determine version information:
- On a git tag:
v1.0.0 - After a tag:
v1.0.0-5-gabcdef0(5 commits after v1.0.0) - With changes:
v1.0.0-5-gabcdef0-dirty - No tags:
abcdef0(commit hash only)
# Check embedded version info
./rtp-monitor version
# Output: v0.8-12-ga55f82b-dirty (commit: a55f82b, built: 2025-12-03 09:42:30 UTC, go: go1.25.4 X:nodwarf5)
# Build with custom version (optional)
make build VERSION=v2.0.0-custom
# View build variables
make versionLaunch the interactive terminal interface:
./rtp-monitorYou can also load SDP files for manual stream configuration:
./rtp-monitor --sdp stream1.sdp --sdp stream2.sdpRun in headless mode for automated monitoring without UI:
# Basic headless mode - logs discovered/disappeared streams
./rtp-monitor --headless
# Monitor specific streams by ID hash with periodic reports
./rtp-monitor --headless --hash 71cb8481ed --hash 850fab871aNote: --hash can only be used with --headless. When monitoring specific streams, the application will:
- Create RTP receivers for each monitored stream
- Report packet rates and sequence errors periodically
- Log when monitored streams appear or disappear
Usage:
rtp-monitor [flags]
Flags:
--headless Run in headless mode (no UI)
-h, --help help for rtp-monitor
--interface stringArray Network interface to use (can be used multiple times)
--no-mdns Disable mDNS discovery
--no-sap Disable SAP discovery
--report-interval duration Report interval for stream monitoring in headless mode (default 1s)
--hash stringArray Stream ID hash to monitor in headless mode (can be used multiple times)
--sdp stringArray SDP file to parse (can be used multiple times)
-v, --version version for rtp-monitor
--wav string Folder to save WAV filesThe UI is a tiling layout of panes, similar to zellij. Each pane is bound to one stream, so you can for example watch the meters of one stream while recording two others. New panes are opened from the stream picker, a floating list of all discovered streams. Discovery runs all the time, whether the picker is shown or not.
Panes survive their stream disappearing: the pane is greyed out, the title says
offline, and the pane reattaches when the stream is announced again. A
record pane keeps writing while packets arrive and starts new files if the
stream's format changes. WAV files cannot exceed 4 GiB, so long recordings are
split before they reach that size and continue in files with a .1, .2, …
suffix.
Keys are grouped into modes, like in zellij. The status bar at the bottom
shows the current mode and its keys. Esc or Enter returns to Normal mode.
| Mode | Enter with | Keys |
|---|---|---|
| Normal | keys go to the focused pane · n stream picker · Tab / Shift+Tab cycle focus · c copy · q or Ctrl+c quit |
|
| Pane | Ctrl+w |
←↓↑→ / hjkl move focus · x close · f zoom · t flip split direction · c copy · r Resize mode · m Move mode |
| Resize | r in Pane mode |
←↓↑→ / hjkl grow toward a side · HJKL shrink · + or = / - grow / shrink |
| Move | m in Pane mode |
←↓↑→ / hjkl swap with a neighbour · Tab swap with the next pane |
Ctrl+w also leaves any mode. The key scheme avoids zellij's and tmux's
default bindings, so rtp-monitor runs inside either without conflicts.
n opens the picker over the panes. It opens by itself at startup and when the
last pane is closed, and stays open while no pane is open.
↑/k,↓/j,Page Up,Page Down,Home,End: select a streamm: meters ·R: record WAV files ·d: details ·s: SDP ·r: RTCP log ·f: FPGA RX (Linux with the Ravenna FPGA device only)c: copy the selected stream's SDP to the clipboardEscorn: close the pickerq: quit
New panes are placed automatically by splitting the largest pane. The picker stays open, so you can open several panes in a row.
↑/k,↓/j,Page Up,Page Down,Home,End: scrollc: copy the pane's content to the clipboardEnter: retry after an error
- Click a pane to focus it; click a row in the stream picker to select it, or outside the picker to close it
- Drag the border between two panes to resize them
- Drag a pane by its title bar onto another pane to swap them
- Use the mouse wheel to scroll the pane under the pointer
- Hold
Shiftwhile dragging to select text (in most terminals)
When recordings are running, quitting asks for confirmation. All WAV files are finalized on exit.
- Cobra: CLI framework
- Bubble Tea v2: Terminal UI framework
- Lip Gloss v2: Terminal styling and layout
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.