Video SDK
Skill 144 of 200
Zoom Video SDK for Linux - C++ headless bots, raw audio/video capture/injection, Qt/GTK integration, Docker support
3 minutes · 696 words · 18 sections
Install
npx skills add anthropics/knowledge-work-plugins --skill video-sdk/linuxnpx skills add anthropics/knowledge-work-plugins/plugin marketplace add anthropics/knowledge-work-pluginsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Expert guidance for developing with the Zoom Video SDK on Linux. Build headless bots, raw media capture/injection applications, and custom UI integrations with Qt/GTK.
Official Documentation: https://developers.zoom.us/docs/video-sdk/linux/ (opens in a new tab) API Reference: https://marketplacefront.zoom.us/sdk/custom/linux/ (opens in a new tab) Sample Repository: https://github.com/zoom/videosdk-linux-raw-recording-sample (opens in a new tab)
New to Video SDK? Follow this path:
Reference:
Having issues?
| Feature | Linux | Windows/Mac |
|---|---|---|
| Canvas API | ❌ Not available | ✅ Available |
| Raw Data Pipe | ✅ ONLY option | ✅ Available |
| UI Integration | Qt, GTK, SDL2, OpenGL | Win32/WinForms/WPF, Cocoa |
| Headless Support | ✅ Excellent (Docker) | Limited |
| Audio | PulseAudio required | Native |
| Virtual Devices | ✅ Required for headless | Optional |
The Zoom Video SDK for Linux is a C++ library optimized for:
sudo apt update
sudo apt install -y build-essential gcc cmake libglib2.0-dev liblzma-dev \
libxcb-image0 libxcb-keysyms1 libxcb-xfixes0 libxcb-xkb1 libxcb-shape0 \
libxcb-shm0 libxcb-randr0 libxcb-xtest0 libgbm1 libxtst6 libgl1 libnss3 \
libasound2 libpulse0
# For headless Linux
sudo apt install -y pulseaudio
# PulseAudio configuration (CRITICAL for audio)
mkdir -p ~/.config
echo "[General]" > ~/.config/zoomus.conf
echo "system.audio.type=default" >> ~/.config/zoomus.conf
# Log directory
mkdir -p ~/.zoom/logs#include "zoom_video_sdk_api.h"
#include "zoom_video_sdk_interface.h"
#include "zoom_video_sdk_delegate_interface.h"
USING_ZOOM_VIDEO_SDK_NAMESPACE
// 1. Create SDK
IZoomVideoSDK* sdk = CreateZoomVideoSDKObj();
// 2. Initialize
ZoomVideoSDKInitParams init_params;
init_params.domain = "https://zoom.us";
init_params.enableLog = true;
init_params.logFilePrefix = "bot";
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
sdk->initialize(init_params);
// 3. Add delegate
sdk->addListener(myDelegate);
// 4. Join session
ZoomVideoSDKSessionContext ctx;
ctx.sessionName = "my-session";
ctx.userName = "Linux Bot";
ctx.token = "jwt-token";
ctx.audioOption.connect = true;
ctx.audioOption.mute = false;
ctx.videoOption.localVideoOn = false;
// For headless: Virtual audio speaker
ctx.virtualAudioSpeaker = new VirtualSpeaker();
IZoomVideoSDKSession* session = sdk->joinSession(ctx);See Session Join Pattern (opens in a new tab) for complete code.
| Feature | Linux Support | Guide |
|---|---|---|
| Session Management | ✅ Full | Session Join (opens in a new tab) |
| Raw Video (YUV420) | ✅ ONLY rendering option | Raw Video (opens in a new tab) |
| Raw Audio (PCM) | ✅ Full | Raw Audio (opens in a new tab) |
| Virtual Camera/Mic | ✅ Full | Virtual Devices (opens in a new tab) |
| Cloud Recording | ✅ Full | Recording (opens in a new tab) |
| Live Streaming | ✅ Full | Live Stream (opens in a new tab) |
| Live Transcription | ✅ Full | Transcription (opens in a new tab) |
| Command Channel | ✅ Full | Commands (opens in a new tab) |
| Chat | ✅ Full | Chat (opens in a new tab) |
| Qt Integration | ✅ Recommended | Qt/GTK (opens in a new tab) |
| GTK Integration | ✅ Supported | Qt/GTK (opens in a new tab) |
| Docker/Headless | ✅ Excellent | Virtual Devices (opens in a new tab) |
Problem: Linux SDK does NOT have Canvas API like Windows/Mac.
Solution: You MUST use Raw Data Pipe and implement your own rendering.
See: Raw Data vs Canvas (opens in a new tab)
Problem: SDK requires PulseAudio for raw audio functions.
Solution:
sudo apt install -y pulseaudio
mkdir -p ~/.config
echo "[General]" > ~/.config/zoomus.conf
echo "system.audio.type=default" >> ~/.config/zoomus.confSee: PulseAudio Setup (opens in a new tab)
Problem: SDK requires Qt5 libraries (bundled, NOT system Qt5).
Solution:
# Copy from SDK package
cp -r samples/qt_libs/Qt/lib/* lib/zoom_video_sdk/
# Create symlinks
cd lib/zoom_video_sdk
for lib in libQt5*.so.5; do ln -sf $lib ${lib%.5}; doneSee: Qt Dependencies (opens in a new tab)
Always use heap mode for raw data:
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;Problem: Docker/headless environments have no audio devices.
Solution: Use virtual audio speaker and mic.
session_context.virtualAudioSpeaker = new VirtualSpeaker();
session_context.virtualAudioMic = new VirtualMic();See: Virtual Audio/Video (opens in a new tab)
| Repository | Description |
|---|---|
| raw-recording-sample (opens in a new tab) | Raw audio/video capture |
| qt-quickstart (opens in a new tab) | Qt6 UI integration |
| gtk-quickstart (opens in a new tab) | GTK3 UI integration |
Headless Bot (Docker):
┌──────────────────────────────────┐
│ Virtual Audio Speaker/Mic │
├──────────────────────────────────┤
│ Raw Data Processing │
│ - YUV420 → File/Stream
## Merged from video-sdk/linux/SKILL.md
# Zoom Video SDK Linux - Complete Documentation Index
## Quick Start Path
**If you're new to the SDK, follow this order:**
1. **Read the architecture pattern** → [concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)
- Universal formula: Singleton → Delegate → Subscribe
- Once you understand this, you can implement any feature
2. **Understand Linux specifics** → [concepts/raw-data-vs-canvas.md](concepts/raw-data-vs-canvas.md)
- **CRITICAL**: Linux has NO Canvas API - raw data ONLY
3. **Implement session join** → [examples/session-join-pattern.md](examples/session-join-pattern.md)
- Complete working JWT + session join code
4. **Setup environment** → [troubleshooting/pulseaudio-setup.md](troubleshooting/pulseaudio-setup.md)
- PulseAudio configuration (required for audio)
- [troubleshooting/qt-dependencies.md](troubleshooting/qt-dependencies.md)
- Qt5 library setup (bundled with SDK)
5. **Implement features** → Choose from examples below
---
## Documentation Structure
video-sdk/linux/ ├── SKILL.md # Main skill overview ├── SKILL.md # This file - navigation guide ├── linux.md # Platform summary │ ├── concepts/ # Core architectural patterns │ ├── sdk-architecture-pattern.md # Universal formula for ANY feature │ ├── singleton-hierarchy.md # 5-level navigation guide │ └── raw-data-vs-canvas.md # Linux-specific: raw data ONLY │ ├── examples/ # Complete working code │ ├── session-join-pattern.md # JWT auth + session join │ └── command-channel.md # Command channel with threading │ ├── troubleshooting/ # Problem solving guides │ ├── pulseaudio-setup.md # Audio configuration │ ├── qt-dependencies.md # Qt5 library setup │ ├── build-errors.md # Common build issues │ └── common-issues.md # Quick diagnostic workflow │ └── references/ # Reference documentation └── linux-reference.md # API hierarchy, methods, error codes
---
## By Use Case
### I want to build a headless bot
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Understand the pattern
2. [Session Join Pattern](examples/session-join-pattern.md) - Join sessions
3. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Configure audio
4. [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md) - Understand Linux differences
### I'm getting build errors
1. [Build Errors Guide](troubleshooting/build-errors.md) - SDK build issues
2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Qt5 setup
3. [Common Issues](troubleshooting/common-issues.md) - Quick diagnostics
### I'm getting runtime errors
1. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Audio not working
2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Library not found
3. [Common Issues](troubleshooting/common-issues.md) - Error code tables
### I want to use command channel
1. [Command Channel](examples/command-channel.md) - Send/receive commands
2. [Common Issues](troubleshooting/common-issues.md) - Threading requirements
### I want to implement a specific feature
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - **START HERE!**
2. [Singleton Hierarchy](concepts/singleton-hierarchy.md) - Navigate to the feature
3. [API Reference](references/linux-reference.md) - Method signatures
---
## Most Critical Documents
### 1. SDK Architecture Pattern (MASTER DOCUMENT)
**[concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)**
The universal 3-step pattern:
1. Get singleton (SDK, helpers, session, users)
2. Implement delegate (event callbacks)
3. Subscribe and use
### 2. Raw Data vs Canvas (LINUX-SPECIFIC)
**[concepts/raw-data-vs-canvas.md](concepts/raw-data-vs-canvas.md)**
**CRITICAL**: Unlike Windows/Mac, Linux SDK has NO Canvas API. You MUST use raw data pipe.
### 3. PulseAudio Setup (MOST COMMON ISSUE)
**[troubleshooting/pulseaudio-setup.md](troubleshooting/pulseaudio-setup.md)**
Audio requires PulseAudio configuration.
### 4. Qt Dependencies
**[troubleshooting/qt-dependencies.md](troubleshooting/qt-dependencies.md)**
SDK requires bundled Qt5 libraries, NOT system Qt5.
---
## Key Learnings
### Critical Discoveries:
1. **Linux has NO Canvas API**
- Windows/Mac have Canvas API for SDK-rendered video
- Linux MUST use Raw Data Pipe
- See: [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md)
2. **PulseAudio is MANDATORY**
- SDK requires PulseAudio for raw audio
- Must configure ~/.config/zoomus.conf
- See: [PulseAudio Setup](troubleshooting/pulseaudio-setup.md)
3. **Use Bundled Qt5, NOT System Qt5**
- SDK includes specific Qt5 versions
- Copy from samples/qt_libs/
- See: [Qt Dependencies](troubleshooting/qt-dependencies.md)
4. **Helpers Control YOUR Streams Only**
- `videoHelper->startVideo()` starts YOUR camera
- To see others, subscribe to their VideoPipe
- See: [Singleton Hierarchy](concepts/singleton-hierarchy.md)
5. **Virtual Devices for Headless**
- Docker/headless needs virtual audio speaker/mic
- Set before joining session
- See: [Session Join Pattern](examples/session-join-pattern.md)
6. **Always Use Heap Memory Mode**
```cpp
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;GLib Main Loop Required
All SDK Calls Must Be on Main Thread
Command Channel is Session-Scoped
→ Build Errors Guide (opens in a new tab)
→ PulseAudio Setup (opens in a new tab)
→ Qt Dependencies (opens in a new tab)
→ SDK Architecture Pattern (opens in a new tab)
→ Common Issues (opens in a new tab)
Based on Zoom Video SDK for Linux v2.x
Happy coding!
Remember: The SDK Architecture Pattern (opens in a new tab) is your key to unlocking the entire SDK. Read it first!
main, last pushed 23 September 2026.SKILL.md, not by matching a directory convention. 27 distinct layouts observed: bio-research/skills/*/SKILL.md, cowork-plugin-management/skills/*/SKILL.md, customer-support/skills/*/SKILL.md, data/skills/*/SKILL.md, design/skills/*/SKILL.md, engineering/skills/*/SKILL.md, enterprise-search/skills/*/SKILL.md, finance/skills/*/SKILL.md, human-resources/skills/*/SKILL.md, legal/skills/*/SKILL.md, marketing/skills/*/SKILL.md, operations/skills/*/SKILL.md, partner-built/apollo/skills/*/SKILL.md, partner-built/brand-voice/skills/*/SKILL.md, partner-built/common-room/skills/*/SKILL.md, partner-built/slack/skills/*/SKILL.md, partner-built/zoom-plugin/skills/*/SKILL.md, partner-built/zoom-plugin/skills/contact-center/*/SKILL.md, partner-built/zoom-plugin/skills/meeting-sdk/*/SKILL.md, partner-built/zoom-plugin/skills/meeting-sdk/web/*/SKILL.md, partner-built/zoom-plugin/skills/video-sdk/*/SKILL.md, partner-built/zoom-plugin/skills/virtual-agent/*/SKILL.md, partner-built/zoom-plugin/skills/zoom-mcp/*/SKILL.md, pdf-viewer/skills/*/SKILL.md, product-management/skills/*/SKILL.md, productivity/skills/*/SKILL.md, sales/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Anthropic, declaring 120 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./anthropics/knowledge-work-plugins.md, and each skill at its own .md URL.20 files · 146 KB
Everything this skill ships beside its prose. All of it is set here, as subchapters of skill 144.
Documentation the agent loads on demand, rather than up front.
Everything else published alongside the skill.
concepts/3 files · 47 KB
examples/10 files · 33 KBtroubleshooting/4 files · 11 KB