Video SDK Linux
AnthropicOfficialCreated by ZoomDistributed by Anthropic
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides comprehensive documentation and architectural patterns for developing with the Zoom Video SDK on Linux. It covers the specific requirements for Linux environments, such as the mandatory use of raw data pipes instead of a Canvas API, PulseAudio configuration for audio, and integration with UI frameworks like Qt and GTK. The documentation includes setup guides, API references, and best practices for building headless bots, virtual devices, and custom media processing pipelines.
What it does
- Provides architectural patterns for Zoom Video SDK integration on Linux.
- Explains how to implement raw video and audio capture/injection.
- Offers guidance on building headless bots for Docker environments.
- Details integration steps for Qt and GTK UI frameworks.
- Includes troubleshooting guides for common Linux-specific build and runtime issues.
- Provides API references for session management, raw data pipes, and virtual devices.
When to use it
- When developing C++ applications using the Zoom Video SDK on Linux.
- When building headless Zoom bots that require virtual audio/video devices.
- When implementing custom video rendering or audio processing pipelines.
- When integrating Zoom video capabilities into Qt or GTK-based desktop applications.
- When troubleshooting audio or build issues specific to the Linux SDK implementation.
Advantages
- Enables headless operation for server-side automation.
- Provides low-level access to raw media streams (YUV420/PCM).
- Supports custom UI integration via Qt/GTK.
- Includes clear guidance on Linux-specific architectural constraints.
- Provides ready-to-use patterns for session management and media handling.
Usage examples
- “How do I join a session using the Linux SDK?”
- The agent provides the session join pattern, including the necessary JWT token, session context configuration, and the required virtual audio speaker setup for headless environments.
- “Why is my video not rendering on Linux?”
- The agent explains that the Linux SDK lacks a Canvas API and directs the user to implement a raw data pipe for video rendering.
- “How do I configure audio for a headless bot?”
- The agent provides the PulseAudio setup steps and the code required to initialize virtual audio speakers and microphones.
- “What are the dependencies for building the SDK on Ubuntu?”
- The agent lists the required system packages, including build-essential, CMake, and specific libxcb libraries, while noting the need to use bundled Qt5 libraries.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/anthropics/video-sdk-linux/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip video-sdk-linux.zip -d .agents/skills
Documentation by Zoom
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
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.
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
## 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
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"
"Library not found"
"How do I implement [feature]?"
"What error code means what?"
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.
Files
- ATTRIBUTION.mdAdded by AutoGineer986 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.2 KiB
- SKILL.md15.4 KiB
- concepts/raw-data-vs-canvas.md16.8 KiB
- concepts/sdk-architecture-pattern.md14.9 KiB
- concepts/singleton-hierarchy.md15.0 KiB
- examples/chat.md215 B
- examples/cloud-recording.md395 B
- examples/command-channel.md9.7 KiB
- examples/live-streaming.md234 B
- examples/qt-gtk-integration.md261 B
- examples/raw-audio-capture.md215 B
- examples/raw-video-capture.md251 B
- examples/session-join-pattern.md21.4 KiB
- examples/transcription.md255 B
- examples/virtual-audio-video.md279 B
- linux.md25.8 KiB
- references/linux-reference.md26.8 KiB
- troubleshooting/build-errors.md2.0 KiB
- troubleshooting/common-issues.md5.3 KiB
- troubleshooting/pulseaudio-setup.md1.7 KiB
- troubleshooting/qt-dependencies.md1.9 KiB
references/linux-reference.md
Zoom Video SDK Linux - API Reference
Source: https://marketplacefront.zoom.us/sdk/custom/linux/
Complete Class List
Core SDK
| Class | Description |
|---|---|
IZoomVideoSDK | Main singleton object - session creation, callbacks, features |
IZoomVideoSDKSession | Session information interface |
IZoomVideoSDKDelegate | Event callbacks for session events |
IZoomVideoSDKUser | User object interface |
IZoomVideoSDKUserHelper | User management helper |
Raw Data Interfaces
| Class | Description |
|---|---|
AudioRawData | Audio raw data handler (PCM) |
YUVRawDataI420 | YUV raw data handler (I420 format) |
YUVProcessDataI420 | YUV processing data |
IZoomVideoSDKRawDataPipe | Video/share raw data pipe |
IZoomVideoSDKRawDataPipeDelegate | Video/share raw data sink |
IYUVRawDataI420Converter | I420 YUV converter |
Virtual Devices
| Class | Description |
|---|---|
IZoomVideoSDKVirtualAudioMic | Virtual audio microphone for injection |
IZoomVideoSDKVirtualAudioSpeaker | Virtual audio speaker for headless |
IZoomVideoSDKVideoSource | Video source for injection |
IZoomVideoSDKVideoSourcePreProcessor | Video preprocessing |
IZoomVideoSDKShareSource | Share source for injection |
IZoomVideoSDKSharePreprocessor | Share preprocessing |
Senders
| Class | Description |
|---|---|
IZoomVideoSDKAudioSender | Audio raw data sender |
IZoomVideoSDKVideoSender | Video raw data sender |
IZoomVideoSDKShareSender | Share raw data sender |
IZoomVideoSDKShareAudioSender | Share audio sender |
IZoomVideoSDKShareAudioSource | Share audio source |
Helpers
| Class | Description |
|---|---|
IZoomVideoSDKAudioHelper | Audio controls |
IZoomVideoSDKVideoHelper | Video/camera controls |
IZoomVideoSDKShareHelper | Screen sharing |
IZoomVideoSDKChatHelper | Chat messaging |
IZoomVideoSDKRecordingHelper | Cloud recording |
IZoomVideoSDKLiveStreamHelper | RTMP live streaming |
IZoomVideoSDKLiveTranscriptionHelper | Live transcription |
IZoomVideoSDKPhoneHelper | Phone dial-out |
IZoomVideoSDKCmdChannel | Command channel |
IZoomVideoSDKCRCHelper | CRC helper |
IZoomVideoSDKWhiteboardHelper | Whiteboard |
IZoomVideoSDKAnnotationHelper | Annotations |
IZoomVideoSDKNetworkConnectionHelper | Network connection |
IZoomVideoSDKSubSessionHelper | Subsession helper |
IZoomVideoSDKSubSessionManager | Subsession manager |
Settings Helpers
| Class | Description |
|---|---|
IZoomVideoSDKAudioSettingHelper | Audio settings |
IZoomVideoSDKVideoSettingHelper | Video settings |
IZoomVideoSDKShareSettingHelper | Share settings |
IZoomVideoSDKTestAudioDeviceHelper | Audio device testing |
Devices
| Class | Description |
|---|---|
IZoomVideoSDKCameraDevice | Camera device |
IZoomVideoSDKMicDevice | Microphone device |
IZoomVideoSDKSpeakerDevice | Speaker device |
IVirtualBackgroundItem | Virtual background item |
Streaming
| Class | Description |
|---|---|
IZoomVideoSDKIncomingLiveStreamHelper | Incoming live stream |
IZoomVideoSDKBroadcastStreamingController | Broadcast controller |
IZoomVideoSDKBroadcastStreamingViewer | Broadcast viewer |
IZoomVideoSDKBroadcastStreamingAudioCallback | Broadcast audio callback |
IZoomVideoSDKBroadcastStreamingVideoCallback | Broadcast video callback |
Session & Messages
| Class | Description |
|---|---|
IZoomVideoSDKChatMessage | Chat message |
ILiveTranscriptionLanguage | Transcription language |
ILiveTranscriptionMessageInfo | Transcription message |
IZoomVideoSDKSessionDialInNumberInfo | Dial-in info |
IZoomVideoSDKPhoneSupportCountryInfo | Phone country info |
Subsessions
| Class | Description |
|---|---|
ISubSessionKit | Subsession kit |
ISubSessionUser | Subsession user |
ISubSessionUserHelpRequestHandler | Help request handler |
IZoomVideoSDKSubSessionParticipant | Subsession participant |
File Transfer
| Class | Description |
|---|---|
IZoomVideoSDKFileTransferBaseInfo | File transfer base info |
IZoomVideoSDKSendFile | Send file interface |
IZoomVideoSDKReceiveFile | Receive file interface |
Handlers
| Class | Description |
|---|---|
IZoomVideoSDKPasswordHandler | Password handler |
IZoomVideoSDKRecordingConsentHandler | Recording consent |
IZoomVideoSDKCameraControlRequestHandler | Camera control requests |
IZoomVideoSDKRemoteCameraControlHelper | Remote camera control |
IZoomVideoSDKProxySettingHandler | Proxy settings |
IZoomVideoSDKSSLCertificateInfo | SSL certificate info |
Canvas & Actions
| Class | Description |
|---|---|
IZoomVideoSDKCanvas | Video/share canvas |
IZoomVideoSDKShareAction | Share action |
IMonitorListBuilder | Monitor list builder |
Utilities
| Class | Description |
|---|---|
IVideoSDKVector | SDK vector collection |
Structures
Initialization
struct ZoomVideoSDKInitParams {
const zchar_t* domain; // Required: "https://zoom.us"
bool enableLog; // Enable logging
const zchar_t* logFilePrefix; // Log file prefix
ZoomVideoSDKRawDataMemoryMode videoRawDataMemoryMode;
ZoomVideoSDKRawDataMemoryMode shareRawDataMemoryMode;
ZoomVideoSDKRawDataMemoryMode audioRawDataMemoryMode;
bool enableIndirectRawdata; // Indirect raw data access
ZoomVideoSDKExtendParams* extendParams; // Extended parameters
};
struct ZoomVideoSDKExtendParams {
const zchar_t* speakerTestFilePath;
// Additional extended parameters
};Session Context
struct ZoomVideoSDKSessionContext {
const zchar_t* sessionName; // Required
const zchar_t* sessionPassword; // Optional
const zchar_t* userName; // Required
const zchar_t* token; // Required: JWT token
unsigned int sessionIdleTimeoutMins; // 0 = never timeout, default 40
bool autoLoadMutliStream; // Auto-load multiple streams
ZoomVideoSDKVideoOption videoOption;
ZoomVideoSDKAudioOption audioOption;
IZoomVideoSDKVideoSource* externalVideoSource;
IZoomVideoSDKVirtualAudioMic* virtualAudioMic;
IZoomVideoSDKVirtualAudioSpeaker* virtualAudioSpeaker;
IZoomVideoSDKVideoSourcePreProcessor* preProcessor;
};
struct ZoomVideoSDKVideoOption {
bool localVideoOn; // Start with video on
};
struct ZoomVideoSDKAudioOption {
bool connect; // Connect to audio
bool mute; // Start muted
};Statistics
struct ZoomVideoSDKSessionAudioStatisticInfo {
int frequency;
int latency;
int Jitter;
float packetLossAvg;
float packetLossMax;
};
struct ZoomVideoSDKSessionASVStatisticInfo {
int frame_width;
int frame_height;
int fps;
int latency;
int Jitter;
float packetLossAvg;
float packetLossMax;
};
// Alias
typedef ZoomVideoSDKSessionASVStatisticInfo _SessionASVStatisticInfo;
typedef ZoomVideoSDKSessionAudioStatisticInfo _SessionAudioStatisticInfo;
struct ZoomVideoSDKVideoStatisticInfo {
int width;
int height;
int fps;
int bps;
};
struct ZoomVideoSDKShareStatisticInfo {
int width;
int height;
int fps;
int bps;
};Video/Audio Status
struct ZoomVideoSDKVideoStatus {
bool isOn;
bool hasSource;
};
struct ZoomVideoSDKAudioStatus {
bool isMuted;
bool isAudioConnected;
ZoomVideoSDKAudioType audioType;
};
struct VideoSourceCapability {
unsigned int width;
unsigned int height;
unsigned int frame; // FPS
};Live Streaming
struct ZoomVideoSDKLiveStreamParams {
const zchar_t* streamUrl; // RTMP URL
const zchar_t* streamKey; // Stream key
const zchar_t* broadcastUrl; // Broadcast URL
};
struct ZoomVideoSDKLiveStreamSetting {
// Live stream settings
};
struct IncomingLiveStreamStatus {
// Incoming stream status
};Share
struct ZoomVideoSDKShareOption {
bool isWithDeviceAudio;
bool isOptimizeForSharedVideo;
};
struct ZoomVideoSDKShareCursorData {
int x;
int y;
// Cursor information
};
struct ZoomVideoSDKSharePreprocessParam {
// Preprocessing parameters
};File Transfer
struct FileTransferProgress {
unsigned long long transferredSize;
unsigned long long totalSize;
float percentage;
};
struct ZoomVideoSDKFileStatus {
// File transfer status
};Misc
struct ZoomVideoSDKViewSize {
int width;
int height;
};
struct tagVideoPreferenceSetting {
// Video preference settings
};
struct tagProxySettings {
// Proxy configuration
};
struct InvitePhoneUserInfo {
const zchar_t* countryCode;
const zchar_t* phoneNumber;
const zchar_t* displayName;
};
struct ZoomVideoSDKSteamingJoinContext {
// Streaming join context
};IZoomVideoSDK (Main Interface)
class IZoomVideoSDK {
public:
// Lifecycle
virtual ZoomVideoSDKErrors initialize(ZoomVideoSDKInitParams& params) = 0;
virtual ZoomVideoSDKErrors cleanup() = 0;
// Session management
virtual IZoomVideoSDKSession* joinSession(ZoomVideoSDKSessionContext& params) = 0;
virtual ZoomVideoSDKErrors leaveSession(bool end) = 0;
virtual IZoomVideoSDKSession* getSessionInfo() = 0;
virtual bool isInSession() = 0;
// Listeners
virtual void addListener(IZoomVideoSDKDelegate* listener) = 0;
virtual void removeListener(IZoomVideoSDKDelegate* listener) = 0;
// Helpers
virtual IZoomVideoSDKAudioHelper* getAudioHelper() = 0;
virtual IZoomVideoSDKVideoHelper* getVideoHelper() = 0;
virtual IZoomVideoSDKUserHelper* getUserHelper() = 0;
virtual IZoomVideoSDKShareHelper* getShareHelper() = 0;
virtual IZoomVideoSDKRecordingHelper* getRecordingHelper() = 0;
virtual IZoomVideoSDKLiveStreamHelper* getLiveStreamHelper() = 0;
virtual IZoomVideoSDKChatHelper* getChatHelper() = 0;
virtual IZoomVideoSDKCmdChannel* getCmdChannel() = 0;
virtual IZoomVideoSDKPhoneHelper* getPhoneHelper() = 0;
virtual IZoomVideoSDKLiveTranscriptionHelper* getLiveTranscriptionHelper() = 0;
virtual IZoomVideoSDKCRCHelper* getCRCHelper() = 0;
virtual IZoomVideoSDKWhiteboardHelper* getWhiteboardHelper() = 0;
virtual IZoomVideoSDKSubSessionHelper* getSubSessionHelper() = 0;
virtual IZoomVideoSDKIncomingLiveStreamHelper* getIncomingLiveStreamHelper() = 0;
// Settings
virtual IZoomVideoSDKAudioSettingHelper* getAudioSettingHelper() = 0;
virtual IZoomVideoSDKVideoSettingHelper* getVideoSettingHelper() = 0;
virtual IZoomVideoSDKShareSettingHelper* getShareSettingHelper() = 0;
virtual IZoomVideoSDKTestAudioDeviceHelper* GetAudioDeviceTestHelper() = 0;
virtual IZoomVideoSDKNetworkConnectionHelper* getNetworkConnectionHelper() = 0;
// Utilities
virtual const zchar_t* getSDKVersion() = 0;
virtual const zchar_t* exportLog() = 0;
virtual ZoomVideoSDKErrors cleanAllExportedLogs() = 0;
};IZoomVideoSDKDelegate (Callbacks)
class IZoomVideoSDKDelegate {
public:
// Session
virtual void onSessionJoin() = 0;
virtual void onSessionLeave() = 0;
virtual void onError(ZoomVideoSDKErrors errorCode, int detailErrorCode) = 0;
virtual void onSessionNeedPassword(IZoomVideoSDKPasswordHandler* handler) = 0;
virtual void onSessionPasswordWrong(IZoomVideoSDKPasswordHandler* handler) = 0;
// Users
virtual void onUserJoin(IZoomVideoSDKUserHelper* pUserHelper,
IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
virtual void onUserLeave(IZoomVideoSDKUserHelper* pUserHelper,
IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
virtual void onUserHostChanged(IZoomVideoSDKUserHelper* pUserHelper,
IZoomVideoSDKUser* pUser) = 0;
virtual void onUserManagerChanged(IZoomVideoSDKUser* pUser) = 0;
virtual void onUserNameChanged(IZoomVideoSDKUser* pUser) = 0;
// Video
virtual void onUserVideoStatusChanged(IZoomVideoSDKVideoHelper* pVideoHelper,
IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
// Audio
virtual void onUserAudioStatusChanged(IZoomVideoSDKAudioHelper* pAudioHelper,
IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
virtual void onUserActiveAudioChanged(IZoomVideoSDKAudioHelper* pAudioHelper,
IVideoSDKVector<IZoomVideoSDKUser*>* list) = 0;
// Raw Audio
virtual void onMixedAudioRawDataReceived(AudioRawData* data_) = 0;
virtual void onOneWayAudioRawDataReceived(AudioRawData* data_,
IZoomVideoSDKUser* pUser) = 0;
virtual void onSharedAudioRawDataReceived(AudioRawData* data_) = 0;
// Virtual Speaker
virtual void onVirtualSpeakerMixedAudioReceived(AudioRawData* data_) = 0;
virtual void onVirtualSpeakerOneWayAudioReceived(AudioRawData* data_,
IZoomVideoSDKUser* pUser) = 0;
virtual void onVirtualSpeakerSharedAudioReceived(AudioRawData* data_) = 0;
// Share
virtual void onUserShareStatusChanged(IZoomVideoSDKShareHelper* pShareHelper,
IZoomVideoSDKUser* pUser,
IZoomVideoSDKShareAction* pShareAction) = 0;
// Chat
virtual void onChatNewMessageNotify(IZoomVideoSDKChatHelper* pChatHelper,
IZoomVideoSDKChatMessage* messageItem) = 0;
virtual void onChatMsgDeleteNotification(IZoomVideoSDKChatHelper* pChatHelper,
const zchar_t* msgID,
ZoomVideoSDKChatMessageDeleteType deleteBy) = 0;
virtual void onChatPrivilegeChanged(IZoomVideoSDKChatHelper* pChatHelper,
ZoomVideoSDKChatPrivilegeType privilege) = 0;
// Commands
virtual void onCommandReceived(IZoomVideoSDKUser* sender, const zchar_t* strCmd) = 0;
virtual void onCommandChannelConnectResult(bool isSuccess) = 0;
// Recording
virtual void onCloudRecordingStatus(RecordingStatus status,
IZoomVideoSDKRecordingConsentHandler* pHandler) = 0;
virtual void onUserRecordingConsent(IZoomVideoSDKUser* pUser) = 0;
virtual void onHostAskUnmute() = 0;
// Live Stream
virtual void onLiveStreamStatusChanged(IZoomVideoSDKLiveStreamHelper* pLiveStreamHelper,
ZoomVideoSDKLiveStreamStatus status) = 0;
// Live Transcription
virtual void onLiveTranscriptionStatus(ZoomVideoSDKLiveTranscriptionStatus status) = 0;
virtual void onLiveTranscriptionMsgReceived(const zchar_t* ltMsg,
IZoomVideoSDKUser* pUser,
ZoomVideoSDKLiveTranscriptionOperationType type) = 0;
virtual void onLiveTranscriptionMsgInfoReceived(ILiveTranscriptionMessageInfo* messageInfo) = 0;
virtual void onLiveTranscriptionMsgError(ILiveTranscriptionLanguage* spokenLanguage,
ILiveTranscriptionLanguage* transcriptLanguage) = 0;
virtual void onOriginalLanguageMsgReceived(ILiveTranscriptionMessageInfo* messageInfo) = 0;
// Phone
virtual void onInviteByPhoneStatus(PhoneStatus status, PhoneFailedReason reason) = 0;
virtual void onCalloutJoinSuccess(IZoomVideoSDKUser* pUser, const zchar_t* phoneNumber) = 0;
// Camera Control
virtual void onCameraControlRequestResult(IZoomVideoSDKUser* pUser, bool isApproved) = 0;
virtual void onCameraControlRequestReceived(IZoomVideoSDKUser* pUser,
ZoomVideoSDKCameraControlRequestType requestType,
IZoomVideoSDKCameraControlRequestHandler* handler) = 0;
// Multi-Camera
virtual void onMultiCameraStreamStatusChanged(ZoomVideoSDKMultiCameraStreamStatus status,
IZoomVideoSDKUser* pUser,
IZoomVideoSDKRawDataPipe* pVideoPipe) = 0;
// Devices
virtual void onMicSpeakerVolumeChanged(unsigned int micVolume,
unsigned int speakerVolume) = 0;
virtual void onAudioDeviceStatusChanged(ZoomVideoSDKAudioDeviceType type,
ZoomVideoSDKAudioDeviceStatus status) = 0;
virtual void onTestMicStatusChanged(ZoomVideoSDK_TESTMIC_STATUS status) = 0;
virtual void onSelectedAudioDeviceChanged() = 0;
virtual void onCameraListChanged() = 0;
// Network
virtual void onUserVideoNetworkStatusChanged(ZoomVideoSDKNetworkStatus status,
IZoomVideoSDKUser* pUser) = 0;
virtual void onProxyDetectComplete() = 0;
virtual void onProxySettingNotification(IZoomVideoSDKProxySettingHandler* handler) = 0;
virtual void onSSLCertVerifiedFailNotification(IZoomVideoSDKSSLCertificateInfo* info) = 0;
// CRC
virtual void onCallCRCDeviceStatusChanged(ZoomVideoSDKCRCCallStatus status) = 0;
// Canvas
virtual void onVideoCanvasSubscribeFail(ZoomVideoSDKSubscribeFailReason fail_reason,
IZoomVideoSDKUser* pUser, void* handle) = 0;
virtual void onShareCanvasSubscribeFail(ZoomVideoSDKSubscribeFailReason fail_reason,
IZoomVideoSDKUser* pUser, void* handle) = 0;
// Annotations
virtual void onAnnotationHelperCleanUp(IZoomVideoSDKAnnotationHelper* helper) = 0;
virtual void onAnnotationPrivilegeChange(IZoomVideoSDKUser* pUser, bool enable) = 0;
virtual void onAnnotationHelperActived(void* handle) = 0;
// Video Alpha Channel
virtual void onVideoAlphaChannelStatusChanged(bool isAlphaModeOn) = 0;
// File Transfer
virtual void onSendFileStatus(IZoomVideoSDKSendFile* file,
const FileTransferStatus& status) = 0;
virtual void onReceiveFileStatus(IZoomVideoSDKReceiveFile* file,
const FileTransferStatus& status) = 0;
};Raw Data Interfaces
AudioRawData
class AudioRawData {
public:
virtual char* GetBuffer() = 0; // PCM 16-bit buffer
virtual unsigned int GetBufferLen() = 0; // Buffer length in bytes
virtual unsigned int GetSampleRate() = 0;// Sample rate (Hz)
virtual unsigned int GetChannelNum() = 0;// Channels (1=mono, 2=stereo)
virtual unsigned long long GetTimeStamp() = 0;
};YUVRawDataI420
class YUVRawDataI420 {
public:
virtual char* GetYBuffer() = 0;
virtual char* GetUBuffer() = 0;
virtual char* GetVBuffer() = 0;
virtual char* GetAlphaBuffer() = 0; // Optional alpha channel
virtual char* GetBuffer() = 0; // Full YUV buffer
virtual unsigned int GetBufferLen() = 0;
virtual unsigned int GetStreamWidth() = 0;
virtual unsigned int GetStreamHeight() = 0;
virtual unsigned int GetRotation() = 0; // 0, 90, 180, 270
virtual unsigned long long GetSourceID() = 0;
virtual unsigned long long GetTimeStamp() = 0;
virtual bool IsLimitedI420() = 0;
// Reference counting
virtual bool CanAddRef() = 0;
virtual bool AddRef() = 0;
virtual int Release() = 0;
};IZoomVideoSDKRawDataPipeDelegate
class IZoomVideoSDKRawDataPipeDelegate {
public:
virtual void onRawDataFrameReceived(YUVRawDataI420* data) = 0;
virtual void onRawDataStatusChanged(RawDataStatus status) = 0;
};
enum RawDataStatus {
RawData_On,
RawData_Off
};Virtual Device Interfaces
IZoomVideoSDKVirtualAudioMic
class IZoomVideoSDKVirtualAudioMic {
public:
virtual void onMicInitialize(IZoomVideoSDKAudioSender* sender) = 0;
virtual void onMicStartSend() = 0;
virtual void onMicStopSend() = 0;
virtual void onMicUninitialized() = 0;
};
class IZoomVideoSDKAudioSender {
public:
virtual ZoomVideoSDKErrors Send(char* data,
unsigned int dataLength,
int sampleRate) = 0;
};IZoomVideoSDKVirtualAudioSpeaker
class IZoomVideoSDKVirtualAudioSpeaker {
public:
virtual void onVirtualSpeakerMixedAudioReceived(AudioRawData* data_) = 0;
virtual void onVirtualSpeakerOneWayAudioReceived(AudioRawData* data_,
IZoomVideoSDKUser* pUser) = 0;
virtual void onVirtualSpeakerSharedAudioReceived(AudioRawData* data_) = 0;
};IZoomVideoSDKVideoSource
class IZoomVideoSDKVideoSource {
public:
virtual void onInitialize(IZoomVideoSDKVideoSender* sender,
IVideoSDKVector<VideoSourceCapability>* supportCapList,
VideoSourceCapability& suggestCap) = 0;
virtual void onPropertyChange(IVideoSDKVector<VideoSourceCapability>* supportCapList,
VideoSourceCapability suggestCap) = 0;
virtual void onStartSend() = 0;
virtual void onStopSend() = 0;
virtual void onUninitialized() = 0;
};
class IZoomVideoSDKVideoSender {
public:
virtual ZoomVideoSDKErrors sendVideoFrame(char* frameBuffer,
int width, int height,
int frameLength,
int rotation) = 0;
// Alternative with Y, U, V planes
virtual ZoomVideoSDKErrors sendVideoFrame(char* yBuffer, char* uBuffer, char* vBuffer,
int width, int height,
int frameLength,
int rotation) = 0;
};IZoomVideoSDKShareSource
class IZoomVideoSDKShareSource {
public:
virtual void onShareSendStarted(IZoomVideoSDKShareSender* pSender) = 0;
virtual void onShareSendStopped() = 0;
};
class IZoomVideoSDKShareSender {
public:
virtual ZoomVideoSDKErrors sendShareFrame(char* frameBuffer,
int width, int height,
int frameLength) = 0;
virtual ZoomVideoSDKErrors sendShareFrame(char* yBuffer, char* uBuffer, char* vBuffer,
int width, int height,
int frameLength,
int rotation) = 0;
};Enumerations
ZoomVideoSDKErrors
enum ZoomVideoSDKErrors {
ZoomVideoSDKErrors_Success = 0,
ZoomVideoSDKErrors_Wrong_Usage = 1,
ZoomVideoSDKErrors_Internal_Error = 2,
ZoomVideoSDKErrors_Uninitialize = 3,
ZoomVideoSDKErrors_Memory_Error = 4,
ZoomVideoSDKErrors_Load_Module_Error = 5,
ZoomVideoSDKErrors_UnLoad_Module_Error = 6,
ZoomVideoSDKErrors_Invalid_Parameter = 7,
ZoomVideoSDKErrors_Call_Too_Frequently = 8,
ZoomVideoSDKErrors_No_Impl = 9,
ZoomVideoSDKErrors_Dont_Support_Feature = 10,
ZoomVideoSDKErrors_Unknown = 100,
// Auth errors (1000+)
ZoomVideoSDKErrors_Auth_Error = 1001,
ZoomVideoSDKErrors_Auth_Empty_Key_or_Secret = 1002,
ZoomVideoSDKErrors_Auth_Wrong_Key_or_Secret = 1003,
ZoomVideoSDKErrors_Auth_DoesNot_Support_SDK = 1004,
ZoomVideoSDKErrors_Auth_Disable_SDK = 1005,
// Session errors (3000+)
ZoomVideoSDKErrors_Session_Join_Failed = 3001,
ZoomVideoSDKErrors_Session_No_Rights = 3002,
ZoomVideoSDKErrors_Session_Already_In_Progress = 3003,
ZoomVideoSDKErrors_Session_Dont_Support_SessionType = 3004,
ZoomVideoSDKErrors_Session_Reconnecting = 3005,
ZoomVideoSDKErrors_Session_Disconnecting = 3006,
ZoomVideoSDKErrors_Session_Not_Started = 3007,
ZoomVideoSDKErrors_Session_Need_Password = 3008,
ZoomVideoSDKErrors_Session_Password_Wrong = 3009,
ZoomVideoSDKErrors_Session_Remote_DB_Error = 3010,
ZoomVideoSDKErrors_Session_Invalid_Param = 3011,
// Audio/Video errors
ZoomVideoSDKErrors_Session_Audio_Error = 4001,
ZoomVideoSDKErrors_Session_Audio_No_Microphone = 4002,
ZoomVideoSDKErrors_Session_Video_Error = 5001,
ZoomVideoSDKErrors_Session_Video_Device_Error = 5002,
// Share errors
ZoomVideoSDKErrors_Session_Share_Error = 6001,
ZoomVideoSDKErrors_Session_Share_Module_Not_Ready = 6002,
ZoomVideoSDKErrors_Session_Share_You_Are_Not_Sharing = 6003,
ZoomVideoSDKErrors_Session_Share_Type_Is_Not_Support = 6004,
ZoomVideoSDKErrors_Session_Share_Internal_Error = 6005,
ZoomVideoSDKErrors_Dont_Support_Multi_Stream_Video_User = 7001,
};Resolution Options
enum ZoomVideoSDKResolution {
ZoomVideoSDKResolution_90P,
ZoomVideoSDKResolution_180P,
ZoomVideoSDKResolution_360P,
ZoomVideoSDKResolution_720P,
ZoomVideoSDKResolution_1080P
};Recording Status
enum RecordingStatus {
Recording_Start,
Recording_Stop,
Recording_Pause,
Recording_Connecting,
Recording_DiskFull
};Memory Mode
enum ZoomVideoSDKRawDataMemoryMode {
ZoomVideoSDKRawDataMemoryModeStack,
ZoomVideoSDKRawDataMemoryModeHeap
};Essential Headers
#include "zoom_video_sdk_api.h" // CreateZoomVideoSDKObj, DestroyZoomVideoSDKObj
#include "zoom_video_sdk_interface.h" // IZoomVideoSDK
#include "zoom_video_sdk_delegate_interface.h" // IZoomVideoSDKDelegate
#include "zoom_video_sdk_def.h" // Structures, enums
#include "zoom_video_sdk_platform.h" // Platform definitions
#include "zoom_sdk_raw_data_def.h" // Raw data types
// Helpers
#include "helpers/zoom_video_sdk_user_helper_interface.h"
#include "helpers/zoom_video_sdk_audio_helper_interface.h"
#include "helpers/zoom_video_sdk_video_helper_interface.h"
#include "helpers/zoom_video_sdk_share_helper_interface.h"
#include "helpers/zoom_video_sdk_chat_helper_interface.h"
#include "helpers/zoom_video_sdk_recording_helper_interface.h"
#include "helpers/zoom_video_sdk_livestream_helper_interface.h"
#include "helpers/zoom_video_sdk_livetranscription_helper_interface.h"
#include "helpers/zoom_video_sdk_cmd_channel_interface.h"
#include "helpers/zoom_video_sdk_phone_helper_interface.h"
#include "helpers/zoom_video_sdk_audio_send_rawdata_interface.h"
#include "helpers/zoom_video_sdk_video_source_helper_interface.h"Additional Resources
Official Docs: https://developers.zoom.us/docs/video-sdk/linux/
API Reference: https://marketplacefront.zoom.us/sdk/custom/linux/
Sample Code: https://github.com/zoom/videosdk-linux-raw-recording-sample
Dev Forum: https://devforum.zoom.us
Requirements and compatibility
Written for: Claude Code, Claude apps
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Claude Code frontmatter
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Zoom
- Publisher
- Anthropic (Official)
- Distributed by
- Anthropic
- Source
- anthropics/knowledge-work-plugins · partner-built/zoom-plugin/skills/video-sdk/linux · commit e050c2e
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from partner-built/zoom-plugin/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Zoom or Anthropic.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download video-sdk-linux.zip