Zoom Video SDK Linux
OpenAIOfficialCreated by ZoomDistributed by OpenAI
- Skill
- Tool integration
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Zoom Video SDK for Linux provides a C++ library for building custom video applications, including headless bots and UI-integrated clients. Unlike other platforms, the Linux SDK does not provide a Canvas API, requiring developers to use a raw data pipe for all audio and video processing. This skill covers the architectural patterns, environment setup, and critical implementation requirements for Linux-based Zoom integrations.
What it does
- Provides guidance for building headless bots and custom UI applications using Qt or GTK.
- Explains the mandatory raw data pipe architecture for video and audio handling.
- Details the integration of virtual audio and video devices for headless environments.
- Outlines the singleton-based SDK architecture and event delegate patterns.
- Offers troubleshooting steps for PulseAudio, Qt dependencies, and build configurations.
- Supports advanced features like cloud recording, live streaming, and transcription.
When to use it
- When building custom video conferencing applications on Linux.
- When developing headless bots for automated session participation.
- When integrating Zoom video capabilities into existing C++ applications.
- When implementing custom media processing or injection pipelines.
Advantages
- Enables full control over raw audio and video streams.
- Supports headless operation via Docker and virtual device injection.
- Provides a consistent singleton-based API for session management.
- Includes comprehensive documentation for Linux-specific environment setup.
Usage examples
- “How do I join a session using the Zoom Video SDK on Linux?”
- The agent provides the session join pattern, including initializing the SDK, setting up delegates, and configuring the session context with necessary credentials and virtual device parameters.
- “Why is my video not rendering in my Linux Zoom application?”
- The agent explains that Linux lacks a Canvas API and guides the user to implement a raw data pipe to process and render YUV420 frames manually.
- “How do I configure audio for a headless bot on Linux?”
- The agent provides instructions for installing PulseAudio, configuring the zoomus.conf file, and initializing virtual audio speakers and microphones in the session context.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/openai/zoom-video-sdk-linux/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip zoom-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 AutoGineer882 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.2 KiB
- SKILL.md15.3 KiB
- agents/openai.yaml246 B
- concepts/raw-data-vs-canvas.md16.4 KiB
- concepts/sdk-architecture-pattern.md14.7 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.2 KiB
- examples/transcription.md255 B
- examples/virtual-audio-video.md279 B
- linux.md25.7 KiB
- references/linux-reference.md26.7 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: OpenAI Codex
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.
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
- OpenAI (Official)
- Distributed by
- OpenAI
- Source
- openai/plugins · plugins/zoom/skills/video-sdk/linux · commit d420d13
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from plugins/zoom/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Zoom or OpenAI.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download zoom-video-sdk-linux.zip