A native Qt6 application for controlling OBSBOT cameras on Linux. Provides full camera control with an intuitive GUI while allowing simultaneous use with streaming/conferencing software.
Primary testing: OBSBOT Meet 2 Also works with: OBSBOT Tiny 4K (partial feature support - see Compatibility)
Left: Main control interface with PTZ controls, auto-framing, and advanced settings. Right: Live preview showing face tracking in action.
- Pan/Tilt/Zoom (PTZ) - Precise camera positioning with center reset
- Auto-Framing - AI-powered face tracking with single/upper body modes
- Image Settings - Brightness, contrast, saturation with auto/manual modes
- Field of View - Wide (86°), Medium (78°), Narrow (65°)
- HDR - High Dynamic Range for better exposure
- Face AE/Focus - Face-based auto exposure and auto focus
- White Balance - Multiple presets (auto, daylight, fluorescent, etc.)
- Camera Preview - Real-time video preview with automatic aspect ratio detection
- Usage Detection - Warns when camera is in use by other applications (Chrome, OBS, Zoom)
- Resource Management - Automatically releases camera when not needed
- Intelligent Layout - Window expands only when preview successfully opens
- GPU Filters - Apply GLSL-driven color filters with adjustable intensity for both preview and virtual camera output
- System Tray - Minimize to tray, click to restore
- Start Minimized - Optional startup directly to system tray
- Auto-Reconnect - Reconnects to camera when window is restored
- State Preservation - Remembers preview state across hide/show cycles
- Persistent Settings - All camera settings saved to XDG-compliant config file
- Startup Restore - Camera returns to saved state on connection
- Manual Control - Config file is human-readable and editable
- Validation - Helpful error messages for invalid configuration
OBSBOT cameras have excellent Linux UVC support, but lack native control software. This application:
- Simultaneous Use - Control camera settings while OBS/Chrome streams video
- Resource Friendly - Releases camera when minimized/hidden
- Native Performance - Qt6 application, not Electron
- Standard Compliance - Uses XDG config directories, system tray
This application was developed and tested primarily with the OBSBOT Meet 2, but has been reported to work with other OBSBOT models with varying feature support.
- Fully tested - All features supported
- PTZ controls, Auto-Framing, HDR, Face AE/Focus, all image controls
What works:
- ✅ PTZ controls (Pan, Tilt, Zoom)
- ✅ HDR
- ✅ Manual image controls (Brightness, Contrast, Saturation)
- ✅ White Balance
What doesn't work:
- ❌ Auto-Framing (can be enabled via camera gestures, but not from app)
- ❌ Face-based Auto Exposure
- ❌ Face-based Auto Focus (works via Cameractrl though)
- ❌ Auto image controls
Tested and reported by: samdark
Other OBSBOT cameras may work with varying degrees of functionality. The SDK supports multiple product types (Tiny, Tiny 2, Tail Air, Me, etc.), but testing is needed.
Have another model? Please open an issue to report compatibility!
- Linux (tested on Arch Linux with KDE Plasma)
- OBSBOT camera (USB connection - see Compatibility)
- System tray support (KDE, GNOME, etc.)
- Qt6 (Core, Widgets, Multimedia)
- CMake 3.16+
- C++17 compiler (GCC/Clang)
- OBSBOT SDK (included in
sdk/directory)
- Qt6 libraries
- V4L2 (Video4Linux2) support
lsoffor camera usage detection (optional but recommended)
For the adventurous, a single command that clones the repo to ~/src/obsbot-camera-control and builds/installs:
curl -fsSL https://raw.githubusercontent.com/aaronsb/obsbot-camera-control/main/install.sh | bash- Clones repository to
~/src/obsbot-camera-control - Checks dependencies (shows what to install if missing)
- Builds and installs the application
- Adds desktop launcher to your app menu
If you prefer to review the code first (recommended):
# Clone and build
git clone https://github.com/aaronsb/obsbot-camera-control.git
cd obsbot-camera-control
./build.sh install --confirmThe build script automatically:
- ✅ Checks dependencies (shows install commands for your distro)
- ✅ Builds the application
- ✅ Installs to
~/.local/bin - ✅ Adds desktop launcher to your app menu
- ✅ Offers to update your PATH if needed
Common Commands:
./build.sh build --confirm # Build only
./build.sh install --confirm # Build and install
./build.sh help # Show all options
./uninstall.sh --confirm # Remove installation📖 Detailed Build Instructions → - Dependencies, manual build, troubleshooting
- Connect your OBSBOT camera via USB
- Launch application
- Camera connects automatically
- Adjust settings as desired
- Settings auto-save to
~/.config/obsbot-control/settings.conf
- Click "Show Camera Preview" to enable live preview
- If another app is using the camera, you'll see a warning with the process name
- Close the blocking application and try again
- Preview automatically disabled when window is hidden/minimized
- Use the Filter controls above the preview to apply GPU shaders (None, Grayscale, Sepia, Invert, Warm, Cool) and tune their intensity. Changes appear instantly in the preview and in the virtual camera stream.
- Packages ship the systemd unit and modprobe configuration needed for a virtual camera, but they are not enabled automatically.
- When you want the feature, either enable the service or load the module manually:
sudo systemctl enable --now obsbot-virtual-camera.service # or sudo modprobe v4l2loopback video_nr=42 card_label="OBSBOT Virtual Camera" exclusive_caps=1
- The app shows whether the virtual camera device exists and gives setup guidance directly in the UI.
- Once the module is active, toggle Virtual Camera → Enable virtual camera output inside the app to feed OBS/Zoom/Meet.
- OBSBOT Tiny 2 family cameras expose additional controls (voice command toggles, LED brightness, microphone pickup distance) through the SDK.
- The desktop app keeps these switches hidden so other models don’t surface unusable options. Advanced users can experiment via the CLI/SDK if needed.
- Click X button to minimize to tray (doesn't quit)
- Click tray icon to show/hide window
- Right-click tray icon for menu
- Enable "Start minimized to tray" checkbox for startup behavior
Perfect for streaming/conferencing:
- Start app (optionally minimized to tray)
- Open OBS and select your OBSBOT camera as video source
- Click tray icon to show control window
- Adjust zoom, framing, brightness during stream
- Hide window to tray when not needed
- Camera remains available to OBS the entire time
Settings are stored in: ~/.config/obsbot-control/settings.conf
# Camera Settings
face_tracking=enabled
hdr=disabled
fov=wide
face_ae=enabled
face_focus=enabled
zoom=1.0
pan=0.0
tilt=0.0
# Image Controls
brightness_auto=enabled
brightness=128
contrast_auto=enabled
contrast=128
saturation_auto=enabled
saturation=128
white_balance=auto
# Application Settings
start_minimized=disabled- Boolean values:
enabled/disabled,true/false,yes/no,1/0 - FOV values:
wide/medium/narrowor0/1/2 - Zoom:
1.0to2.0 - Pan/Tilt:
-1.0to1.0(0 is center) - Brightness/Contrast/Saturation:
0to255
-
Control Interface (SDK) - USB control endpoint for camera settings
- Can be used simultaneously by multiple applications
- Always available when camera is connected
-
Video Stream (V4L2) -
/dev/video*device for preview- Exclusive access (one app at a time)
- Preview optional - controls work without it
- Automatically finds OBSBOT camera in video device list
- Uses
lsofto detect which process has video device open - Filters out own process (control and preview can coexist)
When window is hidden/minimized:
- Preview state is saved
- Preview is disabled if enabled
- Camera SDK handle is released
- Other applications can now access camera
When window is shown/restored:
- Reconnects to camera control interface
- Waits 1 second for stability
- Attempts to restore preview if it was enabled
- Shows warning if preview fails (camera in use)
- Check USB connection:
lsof /dev/video0(adjust device number) - Verify udev permissions: User should be in
videogroup - Check kernel messages:
dmesg | grep -i video
- Application auto-detects OBSBOT by name
- If multiple cameras, OBSBOT is selected by description match
- Fallback uses Qt6 Multimedia default camera
- Orange warning shows which process is using camera
- Close blocking application (Chrome, OBS, Zoom, etc.)
- Click "Show Camera Preview" again
- Note: Controls work without preview!
- Check config directory exists:
~/.config/obsbot-control/ - Verify write permissions
- Look for validation errors in config dialog
- Verify system tray support (KDE, GNOME extension, etc.)
- Check Qt6 platform plugin:
export QT_QPA_PLATFORMTHEME=qt6ct - Some minimal window managers lack system tray
A CLI tool is also included for automation/scripting:
./obsbot-cliSee CLI help for available commands.
obsbot-camera-control/
├── src/
│ ├── gui/ # Qt6 GUI application
│ ├── cli/ # Command-line interface
│ └── common/ # Shared configuration code
├── sdk/ # OBSBOT SDK (proprietary)
├── resources/ # Icons and resources
└── CMakeLists.txt # Build configuration
This is a personal project but contributions are welcome:
- Bug reports and feature requests: Open an issue
- Pull requests: Please discuss major changes first
- Code style: Follow existing Qt/C++ conventions
- OBSBOT for creating excellent Linux-compatible cameras and providing the SDK
- Qt Project for the excellent framework
- Linux community for V4L2 support
This project is licensed under the MIT License - see the LICENSE file for details.
Important: The application code (src/) is MIT licensed, but it links against the OBSBOT SDK (sdk/), which is proprietary software owned by OBSBOT. The SDK appears to have been released without an explicit license and is likely intended for reference use.
Users of this software must comply with any applicable OBSBOT licensing terms.
This is an unofficial third-party application. Not affiliated with or endorsed by OBSBOT.
The OBSBOT SDK was likely released as a minimal reference implementation for Linux support. This project extends that foundation into a full-featured graphical application, but makes no warranty about compatibility or support from OBSBOT.
Made with ❤️ for the Linux community
Because Linux users deserve native camera control too.

