VISCA over IP PTZ Camera
VISCA is Sony's pan/tilt/zoom camera control protocol, originally a daisy-chain RS-232 standard and now widely implemented over UDP/IP as VISCA over IP on UDP port 52381. One VISCA-IP driver covers most commercial PTZ cameras used in conference rooms, classrooms, courtrooms, lecture halls, churches and broadcast B-roll rigs:
- Sony BRC / SRG / FR-series
- PTZOptics Move / Studio / SE / G2 / G3
- Vaddio RoboSHOT / ConferenceSHOT / OneLINK
- Lumens VC-A / VC-B / VC-TR series
- Marshall CV / CVM PTZ cameras
- BirdDog (VISCA control path)
- Aver CAM5xx / PTC series
- Most other "VISCA-compatible" commercial PTZs
The driver does not handle video — pair it with an RTSP/NDI/HDMI feed from the same camera through the appropriate AV path. It handles power, pan/tilt with speed, zoom, focus, presets, and read-back of zoom and PTZ position.
Prerequisites
- The camera supports VISCA over IP in UDP mode. Most PTZOptics, Vaddio, Lumens, Marshall and Sony commercial PTZs do — check the camera menu for the setting (usually under Network or Camera Settings).
- The camera's IP is reachable from the GEM controller on UDP port 52381 (no firewall block).
- IR-remote control is not exclusive: VISCA-IP control works alongside the IR remote on most models, but a few firmwares disable IP control if the IR receiver is on — check the camera menu if commands silently fail.
Setup steps
- In the camera network menu, assign a static IP / DHCP reservation and enable VISCA over IP in UDP mode.
- In GEM, Admin → Devices → New, pick the VISCA over IP PTZ Camera driver.
- Enter the camera's IP. Leave the port on
52381unless the camera documents otherwise. - (Optional) Set
default_pan_speedanddefault_tilt_speedif the defaults (9) move the camera faster/slower than you want. - Save. The driver sends a VISCA-IP sequence-reset and immediately issues
a
CAM_PowerInqto confirm the camera is reachable. - To save framing: pan/tilt/zoom into position, then call
preset_savewith a preset number 0–15 (most cameras support more, but 0–15 is the safe universal range).
Attribute reference
Required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP or hostname of the camera. |
Optional
| Attribute | Type | Default | Description |
|---|---|---|---|
port | int | 52381 | VISCA-IP UDP port. |
default_pan_speed | int (1–24) | 9 | Pan speed when pan_left/pan_right is called without a speed arg. |
default_tilt_speed | int (1–23) | 9 | Tilt speed when tilt_up/tilt_down is called without a speed arg. |
status_interval | int (ms) | 60000 | How often the driver polls power and zoom. |
request_timeout | int (ms) | 1500 | Per-command timeout waiting for completion. |
Surfaced by the driver (read-only)
| Attribute | Source | Meaning |
|---|---|---|
power_state | CAM_PowerInq | on / off. |
zoom_position | CAM_ZoomPosInq | 12-bit zoom value (0 wide … ~16384 tele, camera-dependent scale). |
get_position returns {pan_position, tilt_position} as 16-bit signed
integers but those are returned per-call, not stored as device attributes.
Zones
VISCA-IP is device-level — no GEM zones. Power, motion, zoom, focus, and presets all target the camera as a whole.
Pan / tilt / zoom semantics
VISCA pan/tilt commands are open-ended: pan_left (or any direction)
starts the motor and it keeps moving until you send stop. This matches
how AV control surfaces and joystick consoles drive PTZ cameras and is
intentional. The driver does not auto-stop on a timeout — your macro,
joystick, or UI must send stop.
zoom_in / zoom_out are also open-ended; use zoom_stop to halt.
Pan speeds are 1–24, tilt speeds are 1–23 per the VISCA spec. Zoom variable speed is 0–7 (0 slowest, 7 fastest).
Presets
preset_save / preset_recall / preset_delete take a preset arg in
the range 0–127 per the VISCA spec, but real-world camera support is
narrower:
- All cameras: 0–9.
- Most commercial PTZs (PTZOptics, Vaddio, Sony): 0–127.
- A few older Lumens / Marshall: 0–15.
If preset_recall returns an error for a high number, drop to a lower
preset.
Known limitations / not yet supported
- Read-back of currently-selected preset (
CAM_MemoryInq) is not exposed. - Image-control inquiries (iris, gain, shutter, exposure) are not exposed. This is camera-specific anyway — many cameras override the standard VISCA exposure layout.
- VISCA-IP TCP mode is not supported. Configure the camera for UDP mode.
- VISCA daisy-chain addressing (cameras 2–7) is not supported — the driver always targets address 0x81. Most over-IP installs are one camera per IP.
- Class 2 VISCA extensions like
CAM_Color,CAM_ColorEnhancement, andCAM_AutoTrackingare not exposed.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Every command times out | Camera is set to TCP-mode VISCA-IP, not UDP. Switch the camera to UDP mode. |
| Commands succeed but the camera does not move | Camera is in IR-only or local-only mode. Re-check the camera menu; on some PTZs ir_off is required before IP commands take effect. |
preset_recall returns command not executable | Preset number exceeds what the camera supports. Drop to 0–9 and re-test. |
pan_left works but pan_right does not respond | An earlier command left the camera moving. Send stop first. |
| Status sometimes lags by a few seconds | UDP packet was lost. The next status poll catches up. To reduce drift, lower status_interval. |
| Zoom inquiry returns a value but the slider is wrong scale | Camera's zoom range is not exactly 0–16384. Use zoom_position as a relative indicator; absolute scale varies by model. |