Generated banner for Video SDK Windows
Generated logo for Video SDK Windows

Video SDK Windows

AnthropicOfficialCreated by ZoomDistributed by Anthropic

  • Skill
  • Tool integration
  • Software development
  • MIT
  • No issues found

From the author

Zoom Video SDK for Windows - C++ integration for video sessions, raw audio/video capture, screen sharing, recording, and real-time communication
— the description by Zoom

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides technical guidance for developers building custom video applications on Windows using the Zoom Video SDK. It covers session management, raw media capture and injection, screen sharing, and real-time communication features. The documentation includes architectural patterns, C++ integration steps, and critical implementation requirements such as the Windows message loop and delegate callback handling.

What it does

  • Provides C++ integration patterns for Zoom video sessions.
  • Explains raw audio and video data capture and injection.
  • Details screen sharing and collaborative whiteboard implementation.
  • Outlines requirements for cloud recording and live streaming.
  • Offers troubleshooting guides for common build and runtime issues.
  • Supports .NET application integration via C++/CLI wrappers.

When to use it

  • When developing custom video conferencing or streaming applications on Windows.
  • When needing to capture or inject raw audio and video frames.
  • When implementing custom UI layouts for video sessions.
  • When troubleshooting callback failures or session connection issues.

Advantages

  • Provides direct access to raw YUV420 and PCM data streams.
  • Includes official patterns for session lifecycle and event handling.
  • Offers multiple rendering approaches via Canvas API or raw data pipes.
  • Provides comprehensive sample applications for specific use cases.

Usage examples

“How do I join a Zoom Video SDK session in C++?”
The agent provides the initialization code, session context setup, and the critical Windows message loop required to process SDK callbacks.
“Why are my SDK callbacks not firing?”
The agent explains the necessity of a Windows message pump and provides the code snippet to integrate PeekMessage and DispatchMessage into the main application loop.
“How do I render remote user video?”
The agent compares the Canvas API and Raw Data Pipe approaches, providing code examples for subscribing to video streams using the Canvas API.
“How do I implement the delegate interface?”
The agent provides a template for the IZoomVideoSDKDelegate class and emphasizes the requirement to implement all 80+ virtual methods.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/anthropics/video-sdk-windows/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip video-sdk-windows.zip -d .agents/skills

Documentation by Zoom

Zoom Video SDK - Windows Development

Expert guidance for developing with the Zoom Video SDK on Windows. This SDK enables custom video applications, raw media capture/injection, cloud recording, live streaming, and real-time transcription on Windows platforms.

Official Documentation: https://developers.zoom.us/docs/video-sdk/windows/ API Reference: https://marketplacefront.zoom.us/sdk/custom/windows/ Sample Repository: https://github.com/zoom/videosdk-windows-rawdata-sample

New to Video SDK? Follow this path:

  1. SDK Architecture Pattern - Universal 3-step pattern for ANY feature

  2. Session Join Pattern - Complete working code to join a session

  3. Windows Message Loop - CRITICAL: Fix callbacks not firing

  4. Video Rendering - Display video with Canvas API

Reference:

Having issues?

Building a Custom UI?

SDK Overview

The Zoom Video SDK for Windows is a C++ library that provides:

  • Session Management: Join/leave video SDK sessions

  • Raw Data Access: Capture raw audio/video frames (YUV420, PCM)

  • Raw Data Injection: Send custom audio/video into sessions

  • Screen Sharing: Share screens or inject custom share sources

  • Cloud Recording: Record sessions to Zoom cloud

  • Live Streaming: Stream to RTMP endpoints (YouTube, etc.)

  • Chat & Commands: In-session messaging and command channels

  • Live Transcription: Real-time speech-to-text

  • Subsessions: Breakout room support

  • Whiteboard: Collaborative whiteboard features

  • Annotations: Screen share annotations

  • C# Integration: C++/CLI wrapper for .NET applications

Prerequisites

System Requirements
  • OS: Windows 10 (1903 or later) or Windows 11

  • Architecture: x64 (recommended), x86, or ARM64

  • Visual Studio: 2019 or 2022 (Community, Professional, or Enterprise)

  • Windows SDK: 10.0.19041.0 or later

  • .NET Framework: 4.8 or later (for C# applications)

Visual Studio Workloads

Install these workloads via Visual Studio Installer:

  1. Desktop development with C++

    • MSVC v142 or v143 compiler

    • Windows 10/11 SDK

    • C++ CMake tools (optional)

  2. .NET desktop development (for C# applications)

    • .NET Framework 4.8 targeting pack

    • C++/CLI support

Quick Start

C++ Application
#include <windows.h>
#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 object
IZoomVideoSDK* video_sdk_obj = CreateZoomVideoSDKObj();

// 2. Initialize
ZoomVideoSDKInitParams init_params;
init_params.domain = L"https://zoom.us";
init_params.enableLog = true;
init_params.logFilePrefix = L"zoom_win_video";
init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

ZoomVideoSDKErrors err = video_sdk_obj->initialize(init_params);

// 3. Add event listener
video_sdk_obj->addListener(myDelegate);

// 4. Join session (IMPORTANT: set audioOption.connect = false)
ZoomVideoSDKSessionContext session_context;
session_context.sessionName = L"my-session";
session_context.userName = L"Windows User";
session_context.token = L"your-jwt-token";
session_context.videoOption.localVideoOn = false;
session_context.audioOption.connect = false;  // Connect audio after join
session_context.audioOption.mute = true;

IZoomVideoSDKSession* session = video_sdk_obj->joinSession(session_context);

// 5. CRITICAL: Add Windows message pump for callbacks to work
bool running = true;
while (running) {
    // Process Windows messages (required for SDK callbacks)
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    // Your application logic here
    Sleep(10);
}
C# Application
using ZoomVideoSDK;

var sdkManager = new ZoomSDKManager();
sdkManager.Initialize();
sdkManager.JoinSession("my-session", "jwt-token", "User Name", "");

Key Features

FeatureDescription
Session ManagementJoin, leave, and manage video sessions
Raw Video (YUV I420)Capture and inject raw video frames
Raw Audio (PCM)Capture and inject raw audio data
Screen SharingShare screens or custom content
Cloud RecordingRecord sessions to Zoom cloud
Live StreamingStream to RTMP endpoints
ChatSend/receive chat messages
Command ChannelCustom command messaging
Live TranscriptionReal-time speech-to-text
C# SupportFull .NET Framework integration

Sample Applications

Official Repository: https://github.com/zoom/videosdk-windows-rawdata-sample

SampleDescription
VSDK_SkeletonDemoMinimal session join - start here
VSDK_getRawVideoCapture YUV420 video frames
VSDK_getRawAudioCapture PCM audio
VSDK_sendRawVideoInject custom video (virtual camera)
VSDK_sendRawAudioInject custom audio (virtual mic)
VSDK_CloudRecordingCloud recording control
VSDK_CommandChannelCustom command messaging
VSDK_TranscriptionAndTranslationLive captions

See complete guide: Sample Applications Reference

Critical Gotchas and Best Practices

⚠️ CRITICAL: Windows Message Pump Required

The #1 issue that causes session joins to hang with no callbacks:

All Windows applications using the Zoom SDK MUST process Windows messages. The SDK uses Windows messages to deliver callbacks like onSessionJoin(), onError(), etc.

Problem: Without a message pump, joinSession() appears to succeed but callbacks never fire.

Solution: Add this to your main loop:

while (running) {
    // REQUIRED: Process Windows messages
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    // Your application logic
    Sleep(10);
}

Applies to:

  • Console applications (no automatic message pump)

  • Custom main loops

  • Applications that don't use standard WinMain/WndProc

GUI applications using WinMain with standard message loop already have this.

Audio Connection Strategy

Best Practice: Set audioOption.connect = false when joining, then connect audio in the onSessionJoin() callback.

// During join
session_context.audioOption.connect = false;  // Don't connect yet
session_context.audioOption.mute = true;

// In onSessionJoin() callback
void onSessionJoin() override {
    IZoomVideoSDKAudioHelper* audioHelper = video_sdk_obj->getAudioHelper();
    if (audioHelper) {
        audioHelper->startAudio();  // Connect now
    }
}

Why: This pattern is used in all official Zoom samples. It separates session join from audio initialization for better reliability and error handling.

All Delegate Callbacks Must Be Implemented

The IZoomVideoSDKDelegate interface has 70+ pure virtual methods. ALL must be implemented, even if empty:

// Required even if you don't use them
void onProxyDetectComplete() override {}
void onUserWhiteboardShareStatusChanged(IZoomVideoSDKUser*, IZoomVideoSDKWhiteboardHelper*) override {}
// ... etc

Tip: Check the SDK version's zoom_video_sdk_delegate_interface.h for the complete list. The interface changes between SDK versions.

Memory Mode for Raw Data

Always use heap mode for raw data memory:

init_params.videoRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.shareRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;
init_params.audioRawDataMemoryMode = ZoomVideoSDKRawDataMemoryModeHeap;

Stack mode can cause issues with large video frames.

Thread Safety

SDK callbacks execute on SDK threads, not your main thread:

  • Don't perform heavy operations in callbacks

  • Don't call cleanup() from within callbacks

  • Use thread-safe queues for passing data to UI thread

  • Use mutexes when accessing shared state

Consult Official Samples First

When SDK behavior is unexpected, always check the official samples before troubleshooting:

Local samples:

  • C:\tempsdk\Zoom_VideoSDK_Windows_RawDataDemos\VSDK_SkeletonDemo\ (simplest)

  • C:\tempsdk\sdksamples\zoom-video-sdk-windows-2.4.12\Sample-Libs\x64\demo\

Official samples show correct patterns for:

  • Message pump implementation ✓

  • Audio connection strategy ✓

  • Error handling ✓

  • Memory management ✓

Video Rendering - Two Approaches

The Zoom SDK provides two different ways to render video. Choose based on your needs.

Best for: Standard applications, clean video quality, ease of implementation

The SDK renders video directly to your HWND. No YUV conversion needed.

// Subscribe to a user's video with Canvas API
IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
if (canvas) {
    ZoomVideoSDKErrors ret = canvas->subscribeWithView(
        hwnd,                                    // Your window handle
        ZoomVideoSDKVideoAspect_PanAndScan,     // Fit to window, may crop
        ZoomVideoSDKResolution_Auto              // Let SDK choose best resolution
    );
    
    if (ret == ZoomVideoSDKErrors_Success) {
        // SDK is now rendering directly to your window!
    }
}

// Unsubscribe when done
canvas->unSubscribeWithView(hwnd);

Advantages:

  • ✅ Best quality - SDK uses optimized, hardware-accelerated rendering

  • ✅ No artifacts - Professional video quality

  • ✅ Simple code - 3 lines to subscribe

  • ✅ Better performance - No CPU-intensive YUV conversion

  • ✅ Automatic scaling - SDK handles window resizing

  • ✅ Aspect ratio - Built-in aspect ratio handling

Example from official .NET sample:

// Self video preview
IZoomVideoSDKCanvas* canvas = myself->GetVideoCanvas();
canvas->subscribeWithView(selfVideoHwnd, aspect, resolution);

// Remote user video
IZoomVideoSDKCanvas* remoteCanvas = remoteUser->GetVideoCanvas();
remoteCanvas->subscribeWithView(remoteVideoHwnd, aspect, resolution);

Video Aspect Options:

  • ZoomVideoSDKVideoAspect_Original - Letterbox/pillarbox, no cropping

  • ZoomVideoSDKVideoAspect_FullFilled - Fill window, may crop edges

  • ZoomVideoSDKVideoAspect_PanAndScan - Smart crop to fill window

  • ZoomVideoSDKVideoAspect_LetterBox - Show full video with black bars

Resolution Options:

  • ZoomVideoSDKResolution_90P

  • ZoomVideoSDKResolution_180P

  • ZoomVideoSDKResolution_360P - Good balance

  • ZoomVideoSDKResolution_720P - HD quality

  • ZoomVideoSDKResolution_1080P

  • ZoomVideoSDKResolution_Auto - Let SDK decide (recommended)

🔧 Raw Data Pipe (Advanced Use Cases)

Best for: Custom video processing, effects, recording, computer vision

You receive raw YUV420 frames and handle rendering yourself.

// 1. Create a delegate to receive frames
class VideoRenderer : public IZoomVideoSDKRawDataPipeDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();
        
        char* yBuffer = data->GetYBuffer();
        char* uBuffer = data->GetUBuffer();
        char* vBuffer = data->GetVBuffer();
        
        // Convert YUV420 to RGB and render
        ConvertYUVToRGB(yBuffer, uBuffer, vBuffer, width, height);
        RenderToWindow(rgbBuffer, width, height);
    }
    
    void onRawDataStatusChanged(RawDataStatus status) override {
        // Handle video on/off
    }
};

// 2. Subscribe to raw data
IZoomVideoSDKRawDataPipe* pipe = user->GetVideoPipe();
VideoRenderer* renderer = new VideoRenderer();
pipe->subscribe(ZoomVideoSDKResolution_720P, renderer);

YUV420 to RGB Conversion (ITU-R BT.601):

void ConvertYUV420ToRGB(char* yBuffer, char* uBuffer, char* vBuffer, 
                        int width, int height) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int yIndex = y * width + x;
            int uvIndex = (y / 2) * (width / 2) + (x / 2);
            
            int Y = (unsigned char)yBuffer[yIndex];
            int U = (unsigned char)uBuffer[uvIndex];
            int V = (unsigned char)vBuffer[uvIndex];
            
            // YUV to RGB conversion
            int C = Y - 16;
            int D = U - 128;
            int E = V - 128;
            
            int R = (298 * C + 409 * E + 128) >> 8;
            int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
            int B = (298 * C + 516 * D + 128) >> 8;
            
            // Clamp to [0, 255]
            R = (R < 0) ? 0 : (R > 255) ? 255 : R;
            G = (G < 0) ? 0 : (G > 255) ? 255 : G;
            B = (B < 0) ? 0 : (B > 255) ? 255 : B;
            
            // Store RGB (BGR format for Windows)
            rgbBuffer[yIndex * 3 + 0] = (unsigned char)B;
            rgbBuffer[yIndex * 3 + 1] = (unsigned char)G;
            rgbBuffer[yIndex * 3 + 2] = (unsigned char)R;
        }
    }
}

Render with GDI:

void RenderToWindow(unsigned char* rgbBuffer, int width, int height) {
    HDC hdc = GetDC(hwnd);
    
    BITMAPINFO bmi = {};
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = width;
    bmi.bmiHeader.biHeight = -height;  // Negative for top-down
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 24;     // 24-bit RGB
    bmi.bmiHeader.biCompression = BI_RGB;
    
    RECT rect;
    GetClientRect(hwnd, &rect);
    
    StretchDIBits(hdc,
        0, 0, rect.right, rect.bottom,  // Destination
        0, 0, width, height,              // Source
        rgbBuffer, &bmi,
        DIB_RGB_COLORS, SRCCOPY);
    
    ReleaseDC(hwnd, hdc);
}

Disadvantages:

  • ⚠️ CPU intensive - YUV conversion can cause frame drops

  • ⚠️ Artifacts - Manual rendering may show tearing/artifacts

  • ⚠️ Complex - More code to maintain

  • ⚠️ Performance - Slower than Canvas API

Use Raw Data When:

  • Adding video filters/effects

  • Recording to custom formats

  • Computer vision processing

  • Custom compositing

  • Streaming to non-standard outputs

Self Video vs Remote Users

Self Video (your own camera):

Option A: Canvas API

IZoomVideoSDKSession* session = sdk->getSessionInfo();
IZoomVideoSDKUser* myself = session->getMyself();
IZoomVideoSDKCanvas* canvas = myself->GetVideoCanvas();
canvas->subscribeWithView(selfVideoHwnd, aspect, resolution);

Option B: Video Preview (for self only)

IZoomVideoSDKVideoHelper* videoHelper = sdk->getVideoHelper();
videoHelper->startVideo();  // Start transmission

// For preview rendering
videoHelper->startVideoCanvasPreview(selfVideoHwnd, aspect, resolution);

Remote Users (other participants):

Canvas API (recommended):

// In onUserJoin callback
void onUserJoin(IZoomVideoSDKUserHelper*, IVideoSDKVector<IZoomVideoSDKUser*>* userList) {
    for (int i = 0; i < userList->GetCount(); i++) {
        IZoomVideoSDKUser* user = userList->GetItem(i);
        IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
        canvas->subscribeWithView(userVideoHwnd, aspect, resolution);
    }
}
Event-Driven Subscription Pattern

⚠️ CRITICAL: Video subscription must be event-driven and manual.

Key Events:

  1. onSessionJoin - Subscribe to self video

  2. onUserJoin - Subscribe to new remote users

  3. onUserVideoStatusChanged - Re-subscribe when video turns on/off

  4. onUserLeave - Unsubscribe and cleanup

Complete Pattern:

class MainFrame : public IZoomVideoSDKDelegate {
private:
    std::map<IZoomVideoSDKUser*, IZoomVideoSDKCanvas*> subscribedUsers_;
    HWND videoWindow_;
    
public:
    void onSessionJoin() override {
        // Start your own video
        IZoomVideoSDKVideoHelper* videoHelper = sdk->getVideoHelper();
        videoHelper->startVideo();
        
        // Subscribe to self video
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        SubscribeToUser(myself);
    }
    
    void onUserJoin(IZoomVideoSDKUserHelper*, 
                    IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        // Get current user to exclude self
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            
            // IMPORTANT: Only subscribe to REMOTE users!
            if (user != myself) {
                SubscribeToUser(user);
            }
        }
    }
    
    void onUserVideoStatusChanged(IZoomVideoSDKVideoHelper*, 
                                  IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
        
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            if (user != myself) {
                // Re-subscribe when video status changes
                SubscribeToUser(user);
            }
        }
    }
    
    void onUserLeave(IZoomVideoSDKUserHelper*, 
                    IVideoSDKVector<IZoomVideoSDKUser*>* userList) override {
        for (int i = 0; i < userList->GetCount(); i++) {
            IZoomVideoSDKUser* user = userList->GetItem(i);
            UnsubscribeFromUser(user);
        }
    }
    
    void onSessionLeave() override {
        // Cleanup all subscriptions
        for (auto& pair : subscribedUsers_) {
            IZoomVideoSDKCanvas* canvas = pair.second;
            if (canvas) {
                canvas->unSubscribeWithView(videoWindow_);
            }
        }
        subscribedUsers_.clear();
    }
    
private:
    void SubscribeToUser(IZoomVideoSDKUser* user) {
        if (!user || subscribedUsers_.find(user) != subscribedUsers_.end())
            return;
            
        IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
        if (canvas) {
            ZoomVideoSDKErrors ret = canvas->subscribeWithView(
                videoWindow_,
                ZoomVideoSDKVideoAspect_PanAndScan,
                ZoomVideoSDKResolution_Auto
            );
            
            if (ret == ZoomVideoSDKErrors_Success) {
                subscribedUsers_[user] = canvas;
            }
        }
    }
    
    void UnsubscribeFromUser(IZoomVideoSDKUser* user) {
        auto it = subscribedUsers_.find(user);
        if (it != subscribedUsers_.end()) {
            IZoomVideoSDKCanvas* canvas = it->second;
            if (canvas) {
                canvas->unSubscribeWithView(videoWindow_);
            }
            subscribedUsers_.erase(it);
        }
    }
};

Key Points:

  • ✅ Subscribe in response to events (onUserJoin, onUserVideoStatusChanged)

  • ✅ Always exclude current user from remote subscriptions

  • ✅ Unsubscribe on onUserLeave

  • ✅ Clean up all subscriptions on onSessionLeave

  • ✅ Track subscriptions in a map for lifecycle management

⚠️ Screen Share Subscription (DIFFERENT from Video!)

CRITICAL: Screen share subscription uses IZoomVideoSDKShareAction from the callback, NOT user->GetShareCanvas()!

// WRONG - This won't work for remote screen shares!
user->GetShareCanvas()->subscribeWithView(hwnd, ...);

// CORRECT - Use IZoomVideoSDKShareAction from onUserShareStatusChanged callback
void onUserShareStatusChanged(IZoomVideoSDKShareHelper* pShareHelper,
                               IZoomVideoSDKUser* pUser,
                               IZoomVideoSDKShareAction* pShareAction) {
    if (!pShareAction) return;
    
    ZoomVideoSDKShareStatus status = pShareAction->getShareStatus();
    
    if (status == ZoomVideoSDKShareStatus_Start || 
        status == ZoomVideoSDKShareStatus_Resume) {
        // Subscribe to the share using Canvas API
        IZoomVideoSDKCanvas* shareCanvas = pShareAction->getShareCanvas();
        if (shareCanvas) {
            shareCanvas->subscribeWithView(shareWindow_, 
                ZoomVideoSDKVideoAspect_Original);
        }
    }
    else if (status == ZoomVideoSDKShareStatus_Stop) {
        // Unsubscribe when share stops
        IZoomVideoSDKCanvas* shareCanvas = pShareAction->getShareCanvas();
        if (shareCanvas) {
            shareCanvas->unSubscribeWithView(shareWindow_);
        }
    }
}

Why is share different from video?

  • Video: Each user has one video stream → use user->GetVideoCanvas()

  • Share: A user can have multiple share actions (multi-share) → use IZoomVideoSDKShareAction* from callback

  • The IZoomVideoSDKShareAction object represents a specific share stream and contains the share status, type, and rendering interfaces

See also: Screen Share Subscription Example

Multi-User Video Layout

For multiple participants, you need one HWND per user:

// Create separate windows/panels for each user
HWND selfVideoWindow = CreateWindow(...);   // Your video
HWND user1Window = CreateWindow(...);       // User 1's video
HWND user2Window = CreateWindow(...);       // User 2's video

// Subscribe each user to their own window
myself->GetVideoCanvas()->subscribeWithView(selfVideoWindow, ...);
user1->GetVideoCanvas()->subscribeWithView(user1Window, ...);
user2->GetVideoCanvas()->subscribeWithView(user2Window, ...);

Layout Strategies:

  • Grid layout (2x2, 3x3)

  • Gallery view (scrollable)

  • Active speaker (large) + thumbnails

  • Picture-in-picture

Common Video Issues
IssueCauseSolution
Video not showingNot calling startVideo()Call videoHelper->startVideo() in onSessionJoin
Artifacts/tearingUsing Raw Data PipeSwitch to Canvas API
Poor performanceYUV conversion on UI threadUse Canvas API or move conversion to worker thread
Video freezesNot processing Windows messagesAdd message pump to main loop
Can't see selfSubscribing to wrong userUse session->getMyself() for self video
Seeing self in remote listNot excluding selfCheck if (user != myself) before subscribing

Complete Documentation Library

This skill includes comprehensive guides organized by category:

Core Concepts (Start Here!)
Complete Examples
UI Framework Integration
C++/CLI Wrapper Patterns (Wrapping ANY Native Library)
Troubleshooting
References
Most Critical Issues (From Real Debugging)
  1. Callbacks not firing → Missing Windows message loop (99% of issues)

  2. Video subscribe returns error 2 → Subscribing too early

  3. Abstract class errors → Missing virtual method implementations

Key Insight

Once you learn the 3-step pattern, you can implement ANY feature:

  1. Get singleton → 2. Implement delegate → 3. Subscribe & use

See: SDK Architecture Pattern

Resources


Need help? Start with SKILL.md for complete navigation.

Merged from video-sdk/windows/SKILL.md

Zoom Video SDK Windows - Complete Documentation Index

Quick Start Path

If you're new to the SDK, follow this order:

  1. Overview → windows.md

  2. Read the architecture pattern → concepts/sdk-architecture-pattern.md

    • Universal formula: Singleton → Delegate → Subscribe

    • Once you understand this, you can implement any feature

  3. Fix build errors → troubleshooting/build-errors.md

    • SDK header dependencies

    • Required include order

  4. Implement session join → examples/session-join-pattern.md

    • Complete working JWT + session join code

  5. Fix callback issues → troubleshooting/windows-message-loop.md

    • CRITICAL: Why callbacks don't fire without Windows message loop

  6. Implement video → examples/video-rendering.md

    • Canvas API (SDK-rendered) vs Raw Data Pipe

  7. Troubleshoot any issues → troubleshooting/common-issues.md

    • Quick diagnostic checklist

    • Error code tables


Documentation Structure

video-sdk/windows/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
├── windows.md                          # Secondary overview doc (pointer-style)
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # Universal formula for ANY feature
│   ├── singleton-hierarchy.md        # 5-level navigation guide
│   └── canvas-vs-raw-data.md         # SDK-rendered vs self-rendered choice
│
├── examples/                          # Complete working code
│   ├── session-join-pattern.md       # JWT auth + session join
│   ├── video-rendering.md            # Canvas API video display
│   ├── screen-share-subscription.md  # View remote screen shares
│   ├── raw-video-capture.md          # YUV420 raw frame capture
│   ├── raw-audio-capture.md          # PCM audio capture
│   ├── send-raw-video.md             # Virtual camera (inject video)
│   ├── send-raw-audio.md             # Virtual mic (inject audio)
│   ├── cloud-recording.md            # Cloud recording control
│   ├── command-channel.md            # Custom command messaging
│   ├── transcription.md              # Live transcription/captions
│   └── dotnet-winforms/              # UI Framework integration
│       └── README.md                 # Win32, WinForms, WPF patterns
│                                     # C++/CLI wrapper patterns
│                                     # Production quality guidelines
│
├── troubleshooting/                   # Problem solving guides
│   ├── windows-message-loop.md       # CRITICAL - Why callbacks fail
│   ├── build-errors.md               # Header dependency fixes
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── windows-reference.md           # API hierarchy, methods, error codes
    ├── delegate-methods.md            # All 80+ callback methods
    └── samples.md                     # Official samples guide

By Use Case

I want to build a video app
  1. SDK Architecture Pattern - Understand the pattern

  2. Session Join Pattern - Join sessions

  3. Video Rendering - Display video

  4. Windows Message Loop - Fix callback issues

I'm getting build errors
  1. Build Errors Guide - SDK header dependencies

  2. Delegate Methods - Abstract class errors

  3. Common Issues - Linker errors

I'm getting runtime errors
  1. Windows Message Loop - Callbacks not firing

  2. Common Issues - Error code tables

I want to view screen shares
  1. Screen Share Subscription - DIFFERENT from video!

  2. SDK Architecture Pattern - Event-driven pattern

  3. Video Rendering - Compare with video subscription

I want to capture raw video/audio
  1. Canvas vs Raw Data - Choose your approach

  2. Raw Video Capture - YUV420 frame capture

  3. Raw Audio Capture - PCM audio capture

  4. SDK Architecture Pattern - Subscription pattern

I want to send custom video/audio (virtual camera/mic)
  1. Send Raw Video - Inject custom video frames

  2. Send Raw Audio - Inject custom audio

  3. SDK Architecture Pattern - External source pattern

I want to record sessions
  1. Cloud Recording - Start/stop cloud recording

  2. API Reference - Recording helper methods

I want to use live transcription
  1. Transcription - Enable live captions

  2. Delegate Methods - Transcription callbacks

I want custom messaging between participants
  1. Command Channel - Send custom commands

  2. API Reference - Command channel methods

I want to build a Win32 native app
  1. Win32 Integration - Direct SDK + Canvas API

  2. Video Rendering - Canvas API patterns

  3. Production Guidelines - Best practices

I want to build a WinForms (.NET) app
  1. WinForms Integration - C++/CLI wrapper + Raw Data

  2. C++/CLI Patterns - gcroot, Finalizer, LockBits

  3. Production Guidelines - IDisposable, thread safety

I want to build a WPF (.NET) app
  1. WPF Integration - C++/CLI + BitmapSource

  2. Bitmap Conversion - Freeze(), Dispatcher

  3. Production Guidelines - Performance optimization

I want to use C# / .NET Framework (general)
  1. .NET Integration Overview - Complete C++/CLI wrapper guide

  2. Raw Video Capture - YUV→RGB conversion patterns

  3. Session Join Pattern - SDK initialization flow

I want to wrap ANY native C++ library for .NET
  1. C++/CLI Wrapper Patterns - Complete 8-pattern guide

  2. Pattern 1: Basic Structure - Project setup + class layout

  3. Pattern 3: gcroot Callbacks - Native→Managed events

  4. Pattern 4: IDisposable - Cleanup pattern

  5. Common Errors - Troubleshooting

I want to implement a specific feature
  1. SDK Architecture Pattern - START HERE!

  2. Singleton Hierarchy - Navigate to the feature

  3. API Reference - Method signatures


Most Critical Documents

1. SDK Architecture Pattern (MASTER DOCUMENT)

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. Windows Message Loop (MOST COMMON ISSUE)

troubleshooting/windows-message-loop.md

99% of "callbacks not firing" issues are caused by missing Windows message loop.

3. Singleton Hierarchy (NAVIGATION MAP)

concepts/singleton-hierarchy.md

5-level deep navigation showing how to reach every feature.


Key Learnings

Critical Discoveries:
  1. Windows Message Loop is MANDATORY

  2. Subscribe in onUserVideoStatusChanged, NOT onUserJoin

    • Video may not be ready when user joins

    • Wait for video status change callback

    • See: Video Rendering

  3. Two Rendering Paths

    • Canvas API: SDK renders to your HWND (recommended)

    • Raw Data Pipe: You receive YUV frames (advanced)

    • See: Canvas vs Raw Data

  4. Helpers Control YOUR Streams Only

    • videoHelper->startVideo() starts YOUR camera

    • To see others, subscribe to their Canvas/Pipe

    • See: Singleton Hierarchy

  5. UI Framework Integration Differs by Platform

    • Win32: Direct SDK, Canvas API (SDK renders to HWND) - best performance

    • WinForms: C++/CLI wrapper, Raw Data Pipe, YUV→Bitmap, InvokeRequired

    • WPF: Same wrapper + Bitmap→BitmapSource, Dispatcher, Freeze()

    • See: UI Framework Integration

  6. C++/CLI Wrapper Patterns (for ANY native library → .NET)

    • void* pointers - hide native types from managed headers

    • gcroot<T^> - prevent GC from collecting managed references in native code

    • Finalizer + Destructor - ~Class() and !Class() for IDisposable cleanup

    • pin_ptr + Marshal::Copy - array/buffer conversion

    • LockBits - 100x faster than SetPixel for image manipulation

    • Thread marshaling - InvokeRequired (WinForms) / Dispatcher (WPF)

    • See: C++/CLI Wrapper Guide

  7. Audio Connection Timing

    • Set audioOption.connect = false during join

    • Call startAudio() in onSessionJoin callback

    • See: Production Guidelines


Quick Reference

"My code won't compile"

→ Build Errors Guide

"Callbacks never fire"

→ Windows Message Loop

"Video subscription returns error 2"

→ Video Rendering - Subscribe in onUserVideoStatusChanged

"Abstract class error"

→ Delegate Methods

"How do I implement [feature]?"

→ SDK Architecture Pattern

"How do I navigate to [controller]?"

→ Singleton Hierarchy

"What error code means what?"

→ Common Issues


Document Version

Based on Zoom Video SDK for Windows 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

references/windows-reference.md

Zoom Video SDK Windows - API Reference

Source: https://marketplacefront.zoom.us/sdk/custom/windows/


API Hierarchy (5 Levels Deep)

Understanding the SDK requires navigating from the singleton entry point through 5 levels of objects. Start from IZoomVideoSDK and follow return types.

Level 1: Entry Point (Singleton)
CreateZoomVideoSDKObj() → IZoomVideoSDK*
MethodReturnsPurpose
initialize(params)ZoomVideoSDKErrorsInitialize SDK (call once)
joinSession(context)IZoomVideoSDKSession*Join and get session object
leaveSession(end)ZoomVideoSDKErrorsLeave or end session
addListener(delegate)voidRegister event callbacks
getSessionInfo()IZoomVideoSDKSession*Get current session
getVideoHelper()IZoomVideoSDKVideoHelper*Camera/video control
getAudioHelper()IZoomVideoSDKAudioHelper*Mic/speaker control
getShareHelper()IZoomVideoSDKShareHelper*Screen sharing
getChatHelper()IZoomVideoSDKChatHelper*Chat messaging
getUserHelper()IZoomVideoSDKUserHelper*User management
getRecordingHelper()IZoomVideoSDKRecordingHelper*Cloud recording
getCmdChannel()IZoomVideoSDKCmdChannel*Custom signaling
Level 2: Core Helpers & Session
IZoomVideoSDKSession
IZoomVideoSDKSession* session = sdk->getSessionInfo();
MethodReturnsPurpose
getMyself()IZoomVideoSDKUser*Current user object
getRemoteUsers()IVideoSDKVector<IZoomVideoSDKUser*>*All remote users
getSessionName()const zchar_t*Session name
getSessionID()const zchar_t*Unique session ID
getSessionPassword()const zchar_t*Session password
getSessionHost()IZoomVideoSDKUser*Host user
IZoomVideoSDKVideoHelper

Controls YOUR camera. Does NOT control remote users' video.

MethodReturnsPurpose
startVideo()ZoomVideoSDKErrorsTurn on your camera
stopVideo()ZoomVideoSDKErrorsTurn off your camera
rotateMyVideo(rotation)boolRotate camera output
switchCamera(deviceId)boolChange camera device
getCameraList()IVideoSDKVector<IZoomVideoSDKCameraDevice*>*Available cameras
getNumberOfCameras()uint32_tCamera count
startVideoCanvasPreview(hwnd, aspect, resolution)ZoomVideoSDKErrorsPreview your video
stopVideoCanvasPreview(hwnd)ZoomVideoSDKErrorsStop preview
IZoomVideoSDKAudioHelper
MethodReturnsPurpose
startAudio()ZoomVideoSDKErrorsConnect to audio
stopAudio()ZoomVideoSDKErrorsDisconnect audio
muteAudio(user)ZoomVideoSDKErrorsMute a user
unmuteAudio(user)ZoomVideoSDKErrorsUnmute a user
getMicList()IVideoSDKVector<IZoomVideoSDKMicDevice*>*Available mics
getSpeakerList()IVideoSDKVector<IZoomVideoSDKSpeakerDevice*>*Available speakers
selectMic(deviceId, name)ZoomVideoSDKErrorsSelect mic
selectSpeaker(deviceId, name)ZoomVideoSDKErrorsSelect speaker
IZoomVideoSDKShareHelper
MethodReturnsPurpose
startShareScreen(monitorId)ZoomVideoSDKErrorsShare a monitor
startShareWindow(hwnd)ZoomVideoSDKErrorsShare a window
stopShare()ZoomVideoSDKErrorsStop sharing
isShareLocked()boolCheck if locked
lockShare(lock)ZoomVideoSDKErrorsLock sharing
isOtherSharing()boolSomeone else sharing?
Level 3: User & Rendering Objects
IZoomVideoSDKUser

Represents a participant. Get from session->getMyself() or callbacks.

MethodReturnsPurpose
getUserID()const zchar_t*Unique user ID
getUserName()const zchar_t*Display name
isHost()boolIs session host?
isManager()boolIs manager?
GetVideoCanvas()IZoomVideoSDKCanvas*SDK-rendered video
GetVideoPipe()IZoomVideoSDKRawDataPipe*Raw YUV frames
GetShareCanvas()IZoomVideoSDKCanvas*SDK-rendered share
GetSharePipe()IZoomVideoSDKRawDataPipe*Raw share frames
getVideoStatus()ZoomVideoSDKVideoStatusVideo on/off state
getAudioStatus()ZoomVideoSDKAudioStatusAudio mute state
IZoomVideoSDKCanvas (SDK Rendering)

Let the SDK render video directly to your HWND. Recommended for most apps.

MethodReturnsPurpose
subscribeWithView(hwnd, aspect, resolution)ZoomVideoSDKErrorsStart rendering to HWND
unSubscribeWithView(hwnd)ZoomVideoSDKErrorsStop rendering
setAspectMode(aspect)ZoomVideoSDKErrorsChange aspect ratio
setResolution(resolution)ZoomVideoSDKErrorsChange resolution
IZoomVideoSDKRawDataPipe (Raw YUV Access)

Get raw YUV420 frames for custom processing.

MethodReturnsPurpose
subscribe(resolution, delegate)ZoomVideoSDKErrorsStart receiving frames
unSubscribe(delegate)ZoomVideoSDKErrorsStop receiving
getVideoStatus()ZoomVideoSDKVideoStatusCheck if video is on
IZoomVideoSDKShareAction

Received in onUserShareStatusChanged callback. Controls remote share subscription.

MethodReturnsPurpose
subscribe()ZoomVideoSDKErrorsSubscribe to share
unSubscribe()ZoomVideoSDKErrorsUnsubscribe
subscribeWithView(hwnd, aspect)ZoomVideoSDKErrorsRender share to HWND
unSubscribeWithView(hwnd)ZoomVideoSDKErrorsStop rendering
getShareCanvas()IZoomVideoSDKCanvas*Get share canvas
getSharePipe()IZoomVideoSDKRawDataPipe*Get raw share pipe
getShareType()ZoomVideoSDKShareTypeScreen/window/etc
Level 4: Devices, Chat & Callbacks
IZoomVideoSDKCameraDevice
MethodReturns
getDeviceId()const zchar_t*
getDeviceName()const zchar_t*
isSelectedDevice()bool
IZoomVideoSDKMicDevice / IZoomVideoSDKSpeakerDevice
MethodReturns
getDeviceId()const zchar_t*
getDeviceName()const zchar_t*
isSelectedDevice()bool
IZoomVideoSDKChatHelper
MethodReturnsPurpose
sendChatToAll(message)ZoomVideoSDKErrorsBroadcast message
sendChatToUser(user, message)ZoomVideoSDKErrorsPrivate message
canChatMessageBeDeleted(msgId)boolCheck delete permission
deleteChatMessage(msgId)ZoomVideoSDKErrorsDelete a message
IZoomVideoSDKChatMessage

Received in onChatNewMessageNotify callback.

MethodReturns
getMessageID()const zchar_t*
getSendUser()IZoomVideoSDKUser*
getReceiverUser()IZoomVideoSDKUser*
getContent()const zchar_t*
getTimeStamp()time_t
isChatToAll()bool
isSelfSend()bool
IZoomVideoSDKRawDataPipeDelegate

Implement this to receive raw YUV frames.

class MyVideoRenderer : public IZoomVideoSDKRawDataPipeDelegate {
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        // Process frame
    }
    void onRawDataStatusChanged(RawDataStatus status) override {
        // Handle on/off
    }
};
Level 5: Raw Data & Utilities
YUVRawDataI420

Video frame in YUV420 format (I420).

MethodReturnsPurpose
GetYBuffer()char*Y plane (luminance)
GetUBuffer()char*U plane (chrominance)
GetVBuffer()char*V plane (chrominance)
GetStreamWidth()unsigned intFrame width
GetStreamHeight()unsigned intFrame height
GetRotation()unsigned int0, 90, 180, 270
GetTimeStamp()unsigned long longFrame timestamp
CanAddRef() / AddRef() / Release()-Reference counting
AudioRawData

PCM audio samples (16-bit signed).

MethodReturnsPurpose
GetBuffer()char*PCM sample buffer
GetBufferLen()unsigned intBuffer size (bytes)
GetSampleRate()unsigned intSample rate (Hz)
GetChannelNum()unsigned int1=mono, 2=stereo
IZoomVideoSDKUserHelper

Admin actions on users.

MethodReturnsPurpose
removeUser(user)boolKick user from session
makeHost(user)boolTransfer host role
makeManager(user)boolPromote to manager
revokeManager(user)boolDemote manager
changeName(user, name)boolRename user
IZoomVideoSDKCmdChannel

Custom signaling (max 60 messages/second).

MethodReturnsPurpose
sendCommand(user, command)ZoomVideoSDKErrorsSend to one user
sendCommandToAll(command)ZoomVideoSDKErrorsBroadcast to all
IVirtualBackgroundItem
MethodReturns
getImageFilePath()const zchar_t*
getImageName()const zchar_t*
getType()ZoomVideoSDKVirtualBackgroundDataType
isSelected()bool

Critical Timing Rules

⚠️ CRITICAL: Subscribe in onUserVideoStatusChanged, NOT onUserJoin

WRONG (causes Error 2 - Internal_Error):

void onUserJoin(IZoomVideoSDKUserHelper* helper, IVideoSDKVector<IZoomVideoSDKUser*>* userList) {
    for (int i = 0; i < userList->GetCount(); i++) {
        IZoomVideoSDKUser* user = userList->GetItem(i);
        // ERROR: Video may not be ready yet!
        user->GetVideoCanvas()->subscribeWithView(hwnd, aspect, resolution);
    }
}

CORRECT:

void onUserVideoStatusChanged(IZoomVideoSDKVideoHelper* helper, 
                               IVideoSDKVector<IZoomVideoSDKUser*>* userList) {
    IZoomVideoSDKUser* myself = sdk->getSessionInfo()->getMyself();
    
    for (int i = 0; i < userList->GetCount(); i++) {
        IZoomVideoSDKUser* user = userList->GetItem(i);
        if (user == myself) continue;  // Skip self
        
        // Check if video is actually on
        IZoomVideoSDKRawDataPipe* pipe = user->GetVideoPipe();
        if (pipe) {
            ZoomVideoSDKVideoStatus status = pipe->getVideoStatus();
            if (status.isOn) {
                // NOW it's safe to subscribe
                IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
                canvas->subscribeWithView(hwnd, aspect, resolution);
            }
        }
    }
}
Video Status Structure
struct ZoomVideoSDKVideoStatus {
    bool isOn;      // true = video is transmitting
    bool hasSource; // true = camera is available
};
  • isOn == true → Safe to subscribe

  • isOn == false → Unsubscribe or skip

  • hasSource == false → User has no camera

Subscribe Fail Reasons (onVideoCanvasSubscribeFail)
enum ZoomVideoSDKSubscribeFailReason {
    ZoomVideoSDKSubscribeFailReason_None = 0,
    ZoomVideoSDKSubscribeFailReason_HasSubscribe1080POr720P = 1,
    ZoomVideoSDKSubscribeFailReason_HasSubscribeTwo720P = 2,
    ZoomVideoSDKSubscribeFailReason_HasSubscribeExceededLimit = 3,
    ZoomVideoSDKSubscribeFailReason_HasSubscribeTwoShare = 4,
    ZoomVideoSDKSubscribeFailReason_HasSubscribeVideo1080POr720PAndOneShare = 5,
    ZoomVideoSDKSubscribeFailReason_TooFrequentCall = 6
};

Handling TooFrequentCall: Add Sleep(200) between subscribe calls.

SDK Error Codes Quick Reference
CodeNameCommon Cause
0Success-
1Wrong_UsageCalling method in wrong state
2Internal_ErrorVideo not ready, subscribe too early
7Invalid_ParameterNULL pointer, bad HWND
8Call_Too_FrequentlyNeed Sleep() between calls

Two Rendering Approaches

ApproachInterfaceWhen to Use
Canvas APIIZoomVideoSDKCanvas::subscribeWithView(HWND)Standard apps, best quality
Raw Data PipeIZoomVideoSDKRawDataPipe::subscribe(delegate)Custom processing, effects, recording
// SDK renders directly to your window - no YUV conversion needed
IZoomVideoSDKCanvas* canvas = user->GetVideoCanvas();
canvas->subscribeWithView(hwnd, ZoomVideoSDKVideoAspect_PanAndScan, ZoomVideoSDKResolution_Auto);
Raw Data Pipe (Advanced)
// You receive YUV420 frames and must render them yourself
class MyRenderer : public IZoomVideoSDKRawDataPipeDelegate {
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        // Convert YUV to RGB, then render with GDI/DirectX/OpenGL
    }
};

IZoomVideoSDKRawDataPipe* pipe = user->GetVideoPipe();
pipe->subscribe(ZoomVideoSDKResolution_720P, myRenderer);

Complete Class List

Core SDK
ClassDescription
IZoomVideoSDKMain singleton object - session creation, callbacks, features
IZoomVideoSDKSessionSession information interface
IZoomVideoSDKDelegateEvent callbacks for session events
IZoomVideoSDKUserUser object interface
IZoomVideoSDKUserHelperUser management helper
Raw Data Interfaces
ClassDescription
AudioRawDataAudio raw data handler (PCM 16-bit)
YUVRawDataI420YUV raw data handler (I420 format)
YUVProcessDataI420YUV processing data
IZoomVideoSDKRawDataPipeVideo/share raw data pipe
IZoomVideoSDKRawDataPipeDelegateVideo/share raw data sink
IYUVRawDataI420ConverterI420 YUV converter
Virtual Devices
ClassDescription
IZoomVideoSDKVirtualAudioMicVirtual audio microphone for injection
IZoomVideoSDKVirtualAudioSpeakerVirtual audio speaker
IZoomVideoSDKVideoSourceVideo source for injection
IZoomVideoSDKVideoSourcePreProcessorVideo preprocessing
IZoomVideoSDKShareSourceShare source for injection
IZoomVideoSDKSharePreprocessorShare preprocessing
Senders
ClassDescription
IZoomVideoSDKAudioSenderAudio raw data sender
IZoomVideoSDKVideoSenderVideo raw data sender
IZoomVideoSDKShareSenderShare raw data sender
IZoomVideoSDKShareAudioSenderShare audio sender
IZoomVideoSDKShareAudioSourceShare audio source
Helpers
ClassDescription
IZoomVideoSDKAudioHelperAudio controls
IZoomVideoSDKVideoHelperVideo/camera controls
IZoomVideoSDKShareHelperScreen sharing
IZoomVideoSDKChatHelperChat messaging
IZoomVideoSDKRecordingHelperCloud recording
IZoomVideoSDKLiveStreamHelperRTMP live streaming
IZoomVideoSDKLiveTranscriptionHelperLive transcription
IZoomVideoSDKPhoneHelperPhone dial-out
IZoomVideoSDKCmdChannelCommand channel
IZoomVideoSDKCRCHelperCRC helper
IZoomVideoSDKWhiteboardHelperWhiteboard
IZoomVideoSDKAnnotationHelperAnnotations
IZoomVideoSDKNetworkConnectionHelperNetwork connection
IZoomVideoSDKSubSessionHelperSubsession helper
IZoomVideoSDKSubSessionManagerSubsession manager
IZoomVideoSDKRTMSHelperReal-time media streams
IZoomVideoSDKIncomingLiveStreamHelperIncoming live stream
Settings Helpers
ClassDescription
IZoomVideoSDKAudioSettingHelperAudio settings
IZoomVideoSDKVideoSettingHelperVideo settings
IZoomVideoSDKShareSettingHelperShare settings
IZoomVideoSDKTestAudioDeviceHelperAudio device testing
Devices
ClassDescription
IZoomVideoSDKCameraDeviceCamera device
IZoomVideoSDKMicDeviceMicrophone device
IZoomVideoSDKSpeakerDeviceSpeaker device
IVirtualBackgroundItemVirtual background item
Streaming
ClassDescription
IZoomVideoSDKBroadcastStreamingControllerBroadcast controller
IZoomVideoSDKBroadcastStreamingViewerBroadcast viewer
IZoomVideoSDKBroadcastStreamingAudioCallbackBroadcast audio callback
IZoomVideoSDKBroadcastStreamingVideoCallbackBroadcast video callback
Session & Messages
ClassDescription
IZoomVideoSDKChatMessageChat message
ILiveTranscriptionLanguageTranscription language
ILiveTranscriptionMessageInfoTranscription message
IZoomVideoSDKSessionDialInNumberInfoDial-in info
IZoomVideoSDKPhoneSupportCountryInfoPhone country info
Subsessions
ClassDescription
ISubSessionKitSubsession kit
ISubSessionUserSubsession user
ISubSessionUserHelpRequestHandlerHelp request handler
IZoomVideoSDKSubSessionParticipantSubsession participant
File Transfer
ClassDescription
IZoomVideoSDKFileTransferBaseInfoFile transfer base info
IZoomVideoSDKSendFileSend file interface
IZoomVideoSDKReceiveFileReceive file interface
Handlers
ClassDescription
IZoomVideoSDKPasswordHandlerPassword handler
IZoomVideoSDKRecordingConsentHandlerRecording consent
IZoomVideoSDKCameraControlRequestHandlerCamera control requests
IZoomVideoSDKRemoteCameraControlHelperRemote camera control
IZoomVideoSDKProxySettingHandlerProxy settings
IZoomVideoSDKSSLCertificateInfoSSL certificate info
Canvas & Actions
ClassDescription
IZoomVideoSDKCanvasVideo/share canvas
IZoomVideoSDKShareActionShare action
IMonitorListBuilderMonitor list builder
Utilities
ClassDescription
IVideoSDKVectorSDK vector collection

Structures

Initialization
struct ZoomVideoSDKInitParams {
    const zchar_t* domain;              // Required: L"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;
};

// Aliases
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 IZoomVideoSDKRTMSHelper* getRealTimeMediaStreamsHelper() = 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;
};
Factory Functions
// Create SDK object
IZoomVideoSDK* CreateZoomVideoSDKObj();

// Destroy SDK object
void DestroyZoomVideoSDKObj();

IZoomVideoSDKDelegate (Callbacks)

class IZoomVideoSDKDelegate {
public:
    // Session callbacks
    virtual void onSessionJoin() = 0;
    virtual void onSessionLeave() = 0;
    virtual void onSessionLeave(ZoomVideoSDKSessionLeaveReason eReason) = 0;
    virtual void onError(ZoomVideoSDKErrors errorCode, int detailErrorCode) = 0;
    virtual void onSessionNeedPassword(IZoomVideoSDKPasswordHandler* handler) = 0;
    virtual void onSessionPasswordWrong(IZoomVideoSDKPasswordHandler* handler) = 0;
    
    // User callbacks
    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 callbacks
    virtual void onUserVideoStatusChanged(IZoomVideoSDKVideoHelper* pVideoHelper,
                                         IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
    virtual void onSpotlightVideoChanged(IZoomVideoSDKVideoHelper* pVideoHelper,
                                        IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
    
    // Audio callbacks
    virtual void onUserAudioStatusChanged(IZoomVideoSDKAudioHelper* pAudioHelper,
                                         IVideoSDKVector<IZoomVideoSDKUser*>* userList) = 0;
    virtual void onUserActiveAudioChanged(IZoomVideoSDKAudioHelper* pAudioHelper,
                                         IVideoSDKVector<IZoomVideoSDKUser*>* list) = 0;
    
    // Raw audio callbacks
    virtual void onMixedAudioRawDataReceived(AudioRawData* data_) = 0;
    virtual void onOneWayAudioRawDataReceived(AudioRawData* data_,
                                             IZoomVideoSDKUser* pUser) = 0;
    virtual void onSharedAudioRawDataReceived(AudioRawData* data_) = 0;
    
    // Share callbacks
    virtual void onUserShareStatusChanged(IZoomVideoSDKShareHelper* pShareHelper,
                                         IZoomVideoSDKUser* pUser,
                                         IZoomVideoSDKShareAction* pShareAction) = 0;
    virtual void onShareContentChanged(IZoomVideoSDKShareHelper* pShareHelper,
                                      IZoomVideoSDKUser* pUser,
                                      IZoomVideoSDKShareAction* pShareAction) = 0;
    virtual void onFailedToStartShare(IZoomVideoSDKShareHelper* pShareHelper,
                                     IZoomVideoSDKUser* pUser) = 0;
    virtual void onShareContentSizeChanged(IZoomVideoSDKShareHelper* pShareHelper,
                                          IZoomVideoSDKUser* pUser,
                                          IZoomVideoSDKShareAction* pShareAction) = 0;
    
    // Chat callbacks
    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;
    
    // Command channel callbacks
    virtual void onCommandReceived(IZoomVideoSDKUser* sender, const zchar_t* strCmd) = 0;
    virtual void onCommandChannelConnectResult(bool isSuccess) = 0;
    
    // Recording callbacks
    virtual void onCloudRecordingStatus(RecordingStatus status,
                                       IZoomVideoSDKRecordingConsentHandler* pHandler) = 0;
    virtual void onUserRecordingConsent(IZoomVideoSDKUser* pUser) = 0;
    virtual void onHostAskUnmute() = 0;
    
    // Live stream callbacks
    virtual void onLiveStreamStatusChanged(IZoomVideoSDKLiveStreamHelper* pLiveStreamHelper,
                                          ZoomVideoSDKLiveStreamStatus status) = 0;
    
    // Live transcription callbacks
    virtual void onLiveTranscriptionStatus(ZoomVideoSDKLiveTranscriptionStatus status) = 0;
    virtual void onOriginalLanguageMsgReceived(ILiveTranscriptionMessageInfo* messageInfo) = 0;
    virtual void onLiveTranscriptionMsgInfoReceived(ILiveTranscriptionMessageInfo* messageInfo) = 0;
    virtual void onLiveTranscriptionMsgError(ILiveTranscriptionLanguage* spokenLanguage,
                                            ILiveTranscriptionLanguage* transcriptLanguage) = 0;
    
    // Phone callbacks
    virtual void onInviteByPhoneStatus(PhoneStatus status, PhoneFailedReason reason) = 0;
    virtual void onCalloutJoinSuccess(IZoomVideoSDKUser* pUser, const zchar_t* phoneNumber) = 0;
    
    // Camera control callbacks
    virtual void onCameraControlRequestResult(IZoomVideoSDKUser* pUser, bool isApproved) = 0;
    virtual void onCameraControlRequestReceived(IZoomVideoSDKUser* pUser,
                                               ZoomVideoSDKCameraControlRequestType requestType,
                                               IZoomVideoSDKCameraControlRequestHandler* handler) = 0;
    
    // Remote control callbacks
    virtual void onRemoteControlStatus(IZoomVideoSDKUser* pUser,
                                      IZoomVideoSDKShareAction* pShareAction,
                                      ZoomVideoSDKRemoteControlStatus status) = 0;
    virtual void onRemoteControlRequestReceived(IZoomVideoSDKUser* pUser,
                                               IZoomVideoSDKShareAction* pShareAction,
                                               IZoomVideoSDKRemoteControlRequestHandler* handler) = 0;
    virtual void onRemoteControlServiceInstallResult(bool bSuccess) = 0;
    
    // Multi-camera callbacks
    virtual void onMultiCameraStreamStatusChanged(ZoomVideoSDKMultiCameraStreamStatus status,
                                                 IZoomVideoSDKUser* pUser,
                                                 IZoomVideoSDKRawDataPipe* pVideoPipe) = 0;
    
    // Device callbacks
    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 callbacks
    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 callbacks
    virtual void onCallCRCDeviceStatusChanged(ZoomVideoSDKCRCCallStatus status) = 0;
    
    // Canvas callbacks
    virtual void onVideoCanvasSubscribeFail(ZoomVideoSDKSubscribeFailReason fail_reason,
                                           IZoomVideoSDKUser* pUser, void* handle) = 0;
    virtual void onShareCanvasSubscribeFail(IZoomVideoSDKUser* pUser, void* handle,
                                           IZoomVideoSDKShareAction* pShareAction) = 0;
    
    // Annotation callbacks
    virtual void onAnnotationHelperCleanUp(IZoomVideoSDKAnnotationHelper* helper) = 0;
    virtual void onAnnotationPrivilegeChange(IZoomVideoSDKUser* pUser,
                                            IZoomVideoSDKShareAction* pShareAction) = 0;
    virtual void onAnnotationHelperActived(void* handle) = 0;
    
    // File transfer callbacks
    virtual void onSendFileStatus(IZoomVideoSDKSendFile* file,
                                 const FileTransferStatus& status) = 0;
    virtual void onReceiveFileStatus(IZoomVideoSDKReceiveFile* file,
                                    const FileTransferStatus& status) = 0;
    
    // Misc callbacks
    virtual void onVideoAlphaChannelStatusChanged(bool isAlphaModeOn) = 0;
    
    // Incoming live stream callbacks
    virtual void onBindIncomingLiveStreamResponse(bool bSuccess, const zchar_t* strStreamKeyID) = 0;
    virtual void onUnbindIncomingLiveStreamResponse(bool bSuccess, const zchar_t* strStreamKeyID) = 0;
    virtual void onIncomingLiveStreamStatusResponse(bool bSuccess,
                                                    IVideoSDKVector<IncomingLiveStreamStatus>* list) = 0;
    virtual void onStartIncomingLiveStreamResponse(bool bSuccess, const zchar_t* strStreamKeyID) = 0;
    virtual void onStopIncomingLiveStreamResponse(bool bSuccess, const zchar_t* strStreamKeyID) = 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
};
Session Leave Reason
enum ZoomVideoSDKSessionLeaveReason {
    ZoomVideoSDKSessionLeaveReason_EndByHost,
    ZoomVideoSDKSessionLeaveReason_HostEndForAll,
    ZoomVideoSDKSessionLeaveReason_KickedByHost,
    ZoomVideoSDKSessionLeaveReason_Timeout,
    ZoomVideoSDKSessionLeaveReason_SessionIdleTimeout,
    ZoomVideoSDKSessionLeaveReason_Default
};
Live Transcription Status
enum ZoomVideoSDKLiveTranscriptionStatus {
    ZoomVideoSDKLiveTranscription_Status_Stop,
    ZoomVideoSDKLiveTranscription_Status_Start
};
Network Status
enum ZoomVideoSDKNetworkStatus {
    ZoomVideoSDKNetworkStatus_Good,
    ZoomVideoSDKNetworkStatus_Normal,
    ZoomVideoSDKNetworkStatus_Poor,
    ZoomVideoSDKNetworkStatus_Bad,
    ZoomVideoSDKNetworkStatus_Connecting
};

Essential Headers

// Core 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

// Helper headers
#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"

// Message interfaces
#include "zoom_video_sdk_chat_message_interface.h"
#include "zoom_video_sdk_session_info_interface.h"

// Namespace
using namespace ZOOM_VIDEO_SDK_NAMESPACE;
// Or use macro
USING_ZOOM_VIDEO_SDK_NAMESPACE

Additional Resources

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/windows · 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-windows.zip