
zoom-video-sdk-linux
โ Officialโ 4,081by openai ยท part of openai/plugins
Zoom Video SDK for Linux - C++ headless bots, raw audio/video capture/injection, Qt/GTK integration, Docker support
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Zoom Video SDK - Linux Development
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/ API Reference: https://marketplacefront.zoom.us/sdk/custom/linux/ Sample Repository: https://github.com/zoom/videosdk-linux-raw-recording-sample
Quick Links
New to Video SDK? Follow this path:
- SDK Architecture Pattern - Universal 3-step pattern for ANY feature
- Session Join Pattern - Complete working code to join a session
- Raw Data vs Canvas - CRITICAL: Linux has NO Canvas API - raw data ONLY
- Raw Video Capture - Capture and process YUV420 frames
Reference:
- Singleton Hierarchy - 5-level SDK navigation map
- API Reference - Complete API documentation
- Qt/GTK Integration - UI framework patterns
- Troubleshooting - Quick diagnostics
- SKILL.md - Complete documentation navigation
Having issues?
- PulseAudio setup โ PulseAudio Guide
- Qt dependencies โ Qt Dependencies
- Build errors โ Build Errors Guide
Key Differences from Windows/macOS
| 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 |
SDK Overview
The Zoom Video SDK for Linux is a C++ library optimized for:
- Headless Bots: Docker/WSL support, no display required
- Raw Data Access: Capture YUV420 video, PCM audio
- Raw Data Injection: Virtual camera/mic for custom media
- Screen Sharing: Capture or inject share data
- Cloud Recording: Record sessions to Zoom cloud
- Live Streaming: Stream to RTMP endpoints
- Live Transcription: Real-time speech-to-text
- Qt/GTK Integration: Full UI framework support
Key Features
| Feature | Linux Support | Guide |
|---|---|---|
| Session Management | โ Full | Session Join |
| Raw Video (YUV420) | โ ONLY rendering option | Raw Video |
| Raw Audio (PCM) | โ Full | Raw Audio |
| Virtual Camera/Mic | โ Full | Virtual Devices |
| Cloud Recording | โ Full | Recording |
| Live Streaming | โ Full | Live Stream |
| Live Transcription | โ Full | Transcription |
| Command Channel | โ Full | Commands |
| Chat | โ Full | Chat |
| Qt Integration | โ Recommended | Qt/GTK |
| GTK Integration | โ Supported | Qt/GTK |
| Docker/Headless | โ Excellent | Virtual Devices |
Critical Gotchas
โ ๏ธ CRITICAL #1: No Canvas API on Linux
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
โ ๏ธ CRITICAL #2: PulseAudio Required for Audio
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
โ ๏ธ CRITICAL #3: Qt5 Dependencies
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
โ ๏ธ CRITICAL #4: Heap Memory Mode
Always use heap mode for raw data:
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;โ ๏ธ CRITICAL #5: Virtual Audio for Headless
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
Sample Repositories
Official Samples
| Repository | Description |
|---|---|
| raw-recording-sample | Raw audio/video capture |
| qt-quickstart | Qt6 UI integration |
| gtk-quickstart | GTK3 UI integration |
Sample Architecture
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
## 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](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/sdk-architecture-pattern.md) - Understand the pattern
2. [Session Join Pattern](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/examples/session-join-pattern.md) - Join sessions
3. [PulseAudio Setup](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/pulseaudio-setup.md) - Configure audio
4. [Raw Data vs Canvas](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/raw-data-vs-canvas.md) - Understand Linux differences
### I'm getting build errors
1. [Build Errors Guide](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/build-errors.md) - SDK build issues
2. [Qt Dependencies](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/qt-dependencies.md) - Qt5 setup
3. [Common Issues](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/common-issues.md) - Quick diagnostics
### I'm getting runtime errors
1. [PulseAudio Setup](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/pulseaudio-setup.md) - Audio not working
2. [Qt Dependencies](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/qt-dependencies.md) - Library not found
3. [Common Issues](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/common-issues.md) - Error code tables
### I want to use command channel
1. [Command Channel](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/examples/command-channel.md) - Send/receive commands
2. [Common Issues](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/common-issues.md) - Threading requirements
### I want to implement a specific feature
1. [SDK Architecture Pattern](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/sdk-architecture-pattern.md) - **START HERE!**
2. [Singleton Hierarchy](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/singleton-hierarchy.md) - Navigate to the feature
3. [API Reference](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/references/linux-reference.md) - Method signatures
---
## Most Critical Documents
### 1. SDK Architecture Pattern (MASTER DOCUMENT)
**[concepts/sdk-architecture-pattern.md](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/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](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/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](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/pulseaudio-setup.md)**
Audio requires PulseAudio configuration.
### 4. Qt Dependencies
**[troubleshooting/qt-dependencies.md](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/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](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/raw-data-vs-canvas.md)
2. **PulseAudio is MANDATORY**
- SDK requires PulseAudio for raw audio
- Must configure ~/.config/zoomus.conf
- See: [PulseAudio Setup](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/troubleshooting/pulseaudio-setup.md)
3. **Use Bundled Qt5, NOT System Qt5**
- SDK includes specific Qt5 versions
- Copy from samples/qt_libs/
- See: [Qt Dependencies](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/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](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/concepts/singleton-hierarchy.md)
5. **Virtual Devices for Headless**
- Docker/headless needs virtual audio speaker/mic
- Set before joining session
- See: [Session Join Pattern](https://github.com/openai/plugins/blob/main/plugins/zoom/skills/video-sdk/linux/examples/session-join-pattern.md)
6. **Always Use Heap Memory Mode**
```cpp
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;-
GLib Main Loop Required
- while/sleep loops don't dispatch SDK events
- Must use g_main_loop_run()
- See: Common Issues
-
All SDK Calls Must Be on Main Thread
- Background thread SDK calls return error 2 (Internal_Error)
- Use g_idle_add() to schedule on GLib main thread
- See: Command Channel
-
Command Channel is Session-Scoped
- Does NOT span across different sessions
- Both sender and receiver must be in the same session
- See: Command Channel
Sample Repositories
- raw-recording-sample - Official raw data sample
- qt-quickstart - Qt6 UI integration
- gtk-quickstart - GTK3 UI integration
Quick Reference
"My code won't compile"
"Audio not working"
โ PulseAudio Setup
"Library not found"
โ Qt Dependencies
"How do I implement [feature]?"
"What error code means what?"
โ Common Issues
Document Version
Based on Zoom Video SDK for Linux v2.x
Happy coding!
Remember: The SDK Architecture Pattern is your key to unlocking the entire SDK. Read it first!
Operations
- RUNBOOK.md - 5-minute preflight and debugging checklist.
npx skills add openai/plugins --skill "zoom-video-sdk-linux" --full-depthRun this in your project โ your agent picks the skill up automatically.
Prerequisites
System Requirements
- OS: Ubuntu 20.04+, Debian 11+, or compatible
- Architecture: x64 (recommended), ARM64
- Compiler: GCC 9+, Clang 10+
- CMake: 3.14 or later
- Qt5: Bundled with SDK (do NOT install system Qt5)
Dependencies
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/logsQuick Start
#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 for complete code.
Quick Start Path
If you're new to the SDK, follow this order:
-
Read the architecture pattern โ concepts/sdk-architecture-pattern.md
- Universal formula: Singleton โ Delegate โ Subscribe
- Once you understand this, you can implement any feature
-
Understand Linux specifics โ concepts/raw-data-vs-canvas.md
- CRITICAL: Linux has NO Canvas API - raw data ONLY
-
Implement session join โ examples/session-join-pattern.md
- Complete working JWT + session join code
-
Setup environment โ troubleshooting/pulseaudio-setup.md
- PulseAudio configuration (required for audio)
- troubleshooting/qt-dependencies.md
- Qt5 library setup (bundled with SDK)
-
Implement features โ Choose from examples below
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.