Skill v1.0.1
currentTrusted Publisher100/100fix(engineering): correct GitHub MCP server URL (#172)
version: "1.0.1" name: video-sdk/linux description: "Zoom Video SDK for Linux - C++ headless bots, raw audio/video capture/injection, Qt/GTK integration, Docker support" user-invocable: false triggers:
- linux video sdk
- zoom linux
- raw data linux
- qt zoom
- gtk zoom
- virtual audio linux
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](concepts/sdk-architecture-pattern.md) - Universal 3-step pattern for ANY feature
- [Session Join Pattern](examples/session-join-pattern.md) - Complete working code to join a session
- [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md) - CRITICAL: Linux has NO Canvas API - raw data ONLY
- [Raw Video Capture](examples/raw-video-capture.md) - Capture and process YUV420 frames
Reference:
- [Singleton Hierarchy](concepts/singleton-hierarchy.md) - 5-level SDK navigation map
- [API Reference](references/linux-reference.md) - Complete API documentation
- [Qt/GTK Integration](examples/qt-gtk-integration.md) - UI framework patterns
- [Troubleshooting](troubleshooting/common-issues.md) - Quick diagnostics
- [SKILL.md](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
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 updatesudo 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 Linuxsudo apt install -y pulseaudio# PulseAudio configuration (CRITICAL for audio)mkdir -p ~/.configecho "[General]" > ~/.config/zoomus.confecho "system.audio.type=default" >> ~/.config/zoomus.conf# Log directorymkdir -p ~/.zoom/logs
Quick 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 SDKIZoomVideoSDK* sdk = CreateZoomVideoSDKObj();// 2. InitializeZoomVideoSDKInitParams 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 delegatesdk->addListener(myDelegate);// 4. Join sessionZoomVideoSDKSessionContext 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 speakerctx.virtualAudioSpeaker = new VirtualSpeaker();IZoomVideoSDKSession* session = sdk->joinSession(ctx);
See [Session Join Pattern](examples/session-join-pattern.md) for complete code.
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](concepts/raw-data-vs-canvas.md)
⚠️ CRITICAL #2: PulseAudio Required for Audio
Problem: SDK requires PulseAudio for raw audio functions.
Solution:
sudo apt install -y pulseaudiomkdir -p ~/.configecho "[General]" > ~/.config/zoomus.confecho "system.audio.type=default" >> ~/.config/zoomus.conf
See: [PulseAudio Setup](troubleshooting/pulseaudio-setup.md)
⚠️ CRITICAL #3: Qt5 Dependencies
Problem: SDK requires Qt5 libraries (bundled, NOT system Qt5).
Solution:
# Copy from SDK packagecp -r samples/qt_libs/Qt/lib/* lib/zoom_video_sdk/# Create symlinkscd lib/zoom_video_sdkfor lib in libQt5*.so.5; do ln -sf $lib ${lib%.5}; done
See: [Qt Dependencies](troubleshooting/qt-dependencies.md)
⚠️ 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](examples/virtual-audio-video.md)
Sample Repositories
Official Samples
| Repository | Description | |
|---|---|---|
| [raw-recording-sample](https://github.com/zoom/videosdk-linux-raw-recording-sample) | Raw audio/video capture | |
| [qt-quickstart](https://github.com/tanchunsiong/videosdk-linux-qt-quickstart) | Qt6 UI integration | |
| [gtk-quickstart](https://github.com/tanchunsiong/videosdk-linux-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## 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 feature2. **Understand Linux specifics** → [concepts/raw-data-vs-canvas.md](concepts/raw-data-vs-canvas.md)- **CRITICAL**: Linux has NO Canvas API - raw data ONLY3. **Implement session join** → [examples/session-join-pattern.md](examples/session-join-pattern.md)- Complete working JWT + session join code4. **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 bot1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Understand the pattern2. [Session Join Pattern](examples/session-join-pattern.md) - Join sessions3. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Configure audio4. [Raw Data vs Canvas](concepts/raw-data-vs-canvas.md) - Understand Linux differences### I'm getting build errors1. [Build Errors Guide](troubleshooting/build-errors.md) - SDK build issues2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Qt5 setup3. [Common Issues](troubleshooting/common-issues.md) - Quick diagnostics### I'm getting runtime errors1. [PulseAudio Setup](troubleshooting/pulseaudio-setup.md) - Audio not working2. [Qt Dependencies](troubleshooting/qt-dependencies.md) - Library not found3. [Common Issues](troubleshooting/common-issues.md) - Error code tables### I want to use command channel1. [Command Channel](examples/command-channel.md) - Send/receive commands2. [Common Issues](troubleshooting/common-issues.md) - Threading requirements### I want to implement a specific feature1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - **START HERE!**2. [Singleton Hierarchy](concepts/singleton-hierarchy.md) - Navigate to the feature3. [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**```cppinit_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;```7. **GLib Main Loop Required**- while/sleep loops don't dispatch SDK events- Must use g_main_loop_run()- See: [Common Issues](troubleshooting/common-issues.md)8. **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](examples/command-channel.md)9. **Command Channel is Session-Scoped**- Does NOT span across different sessions- Both sender and receiver must be in the same session- See: [Command Channel](examples/command-channel.md)---## Sample Repositories- **[raw-recording-sample](https://github.com/zoom/videosdk-linux-raw-recording-sample)** - Official raw data sample- **[qt-quickstart](https://github.com/tanchunsiong/videosdk-linux-qt-quickstart)** - Qt6 UI integration- **[gtk-quickstart](https://github.com/tanchunsiong/videosdk-linux-gtk-quickstart)** - GTK3 UI integration---## Quick Reference### "My code won't compile"→ [Build Errors Guide](troubleshooting/build-errors.md)### "Audio not working"→ [PulseAudio Setup](troubleshooting/pulseaudio-setup.md)### "Library not found"→ [Qt Dependencies](troubleshooting/qt-dependencies.md)### "How do I implement [feature]?"→ [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)### "What error code means what?"→ [Common Issues](troubleshooting/common-issues.md)---## Document VersionBased on **Zoom Video SDK for Linux v2.x**---**Happy coding!**Remember: The [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) is your key to unlocking the entire SDK. Read it first!## Operations- [RUNBOOK.md](RUNBOOK.md) - 5-minute preflight and debugging checklist.