WRecorder provides multi-camera streaming between machines using OpenCV + ZeroMQ.
- Multi-stream scripts: camera_streamer.py, camera_receiver.py
- Startup scripts: launch1.sh, launch2.sh
- Required runtime defaults: argument_defaults.json
- Legacy documentation: OLD.md
Both scripts require argument_defaults.json at runtime.
- Sections:
both,streamer-only,receiver-only - Behavior: missing/invalid file causes fail-fast startup error.
- Behavior: unknown keys or missing required keys also cause fail-fast startup error.
- Precedence: CLI flags override values from argument_defaults.json.
- Python 3.7+
- Streamer packages:
python3 -m pip install opencv-python-headless pyzmq- Receiver packages:
python3 -m pip install opencv-python pyzmqStart streamer:
python3 camera_streamer.pyStart receiver:
python3 camera_receiver.pyUse discovery by default (announce_discovery=on, auto_config=on in defaults file) or override per run with CLI flags.
Current CLI flags for camera_streamer.py:
--base-port: Starting port for first camera stream; additional streams usebase-port + index. Current default from argument_defaults.json:5555.--camera-ids: Space-separated camera IDs (example:--camera-ids 0 2 4). Current default from argument_defaults.json:[0].--auto-find-cameras:on|off; auto-detect cameras and override--camera-ids. Current default from argument_defaults.json:on.--jpg-quality: JPEG quality in range1-100. Current default from argument_defaults.json:20.--target-fps: Target stream FPS, must be>= 1. Current default from argument_defaults.json:30.--simulate-cameras: SimulateNcameras instead of real devices (must be>= 1). Current default from argument_defaults.json:null(disabled).--streamer-name: Discovery identity name for receiver filtering. Current default from argument_defaults.json:wrecorder-streamer.--announce-discovery:on|off; broadcast discovery metadata. Current default from argument_defaults.json:on.--discovery-port: UDP discovery port, valid range1-65535. Current default from argument_defaults.json:5550.--discovery-interval: Seconds between discovery packets. Current default from argument_defaults.json:1.0.
Current CLI flags for camera_receiver.py:
--broadcast-ip: Publisher IP address. Current default from argument_defaults.json:0.0.0.0.--base-port: Starting port for first subscribed stream; additional streams usebase-port + index. Current default from argument_defaults.json:5555.--count: Number of sequential ports to subscribe to, starting atbase-port. Current default from argument_defaults.json:1.--show-stats:on|off; show per-stream stats overlay. Current default from argument_defaults.json:off.--timeout: Total setup timeout in seconds (discovery + initial connection). Current default from argument_defaults.json:10.0.--auto-config:on|off; auto-configure from discovery announcements. Current default from argument_defaults.json:on.--streamer-name-filter: Accept only matching streamer name from discovery. Current default from argument_defaults.json:null(no filter).--discovery-port: UDP discovery port. Current default from argument_defaults.json:5550.--discovery-timeout: Discovery phase timeout override in seconds. Current default from argument_defaults.json:null(auto budget).
nmcli dev wifi
nmtuiManual streamer setup:
python3 camera_streamer.py --base-port 5555 --camera-ids 0 2 4 --jpg-quality 30 --target-fps 30Discovery receiver with filter:
python3 camera_receiver.py --auto-config on --streamer-name-filter cam-pi-1 --show-stats onSimulated cameras:
python3 camera_streamer.py --simulate-cameras 4- No camera detected: verify device nodes and permissions, then run
v4l2-ctl --list-devices. - Receiver cannot connect: verify stream host/ports and firewall rules.
- Discovery not finding streamer: verify same subnet and matching discovery port.
- Stream stats overlay is available with
--show-stats on. - If a camera is physically disconnected, a streamer restart may still be required depending on device/driver behavior.