Zoom Video SDK Windows
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 Windows provides a C++ library for building custom video applications on Windows platforms. It supports session management, raw audio and video capture or injection, screen sharing, cloud recording, and live transcription. The SDK offers two primary rendering approaches: the Canvas API for direct window rendering and a Raw Data Pipe for custom frame processing. It includes support for C# via a C++/CLI wrapper and requires specific implementation of Windows message loops and delegate callbacks to function correctly.
What it does
- Enables joining and managing Zoom video sessions
- Provides access to raw YUV420 video and PCM audio frames
- Supports custom audio and video injection into sessions
- Facilitates screen sharing and collaborative whiteboard features
- Allows for cloud recording and RTMP live streaming
- Integrates with .NET applications using C++/CLI
When to use it
- When building custom video conferencing interfaces on Windows
- When requiring raw access to audio or video streams for processing
- When integrating Zoom functionality into existing C++ or C# desktop applications
- When implementing custom screen sharing or virtual camera sources
Advantages
- Direct integration with Windows HWND for video rendering
- Flexible rendering options via Canvas API or Raw Data Pipe
- Comprehensive support for session lifecycle and user events
- Native C++ performance with C# interoperability
Usage examples
- “How do I join a Zoom session in my C++ Windows application?”
- Initialize the SDK object, add a delegate listener, and call joinSession with your session context, ensuring a Windows message pump is running to process callbacks.
- “How can I render video in my application?”
- Use the Canvas API to subscribe to a user's video directly to an HWND, or use the Raw Data Pipe to receive YUV420 frames for custom processing and rendering.
- “Why are my SDK callbacks not firing?”
- Ensure your application has a Windows message pump (using PeekMessage, TranslateMessage, and DispatchMessage) in the main loop to allow the SDK to deliver events.
- “How do I handle remote user video subscriptions?”
- Implement the onUserJoin and onUserVideoStatusChanged delegate methods to manually subscribe to remote users using their video canvas.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/openai/zoom-video-sdk-windows/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip zoom-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
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
Windows Message Loop - CRITICAL: Fix callbacks not firing
Video Rendering - Display video with Canvas API
Reference:
Singleton Hierarchy - 5-level SDK navigation map
API Reference - Methods, error codes, timing rules
Delegate Methods - All 80+ callback methods
Sample Applications - Official samples guide
windows.md - Secondary overview doc (pointer-style)
SKILL.md - Complete documentation navigation
Having issues?
Callbacks not firing → Windows Message Loop
Build errors → Build Errors Guide
Video subscribe fails → Video Rendering (subscribe in
onUserVideoStatusChanged)Quick diagnostics → Common Issues
Building a Custom UI?
Canvas vs Raw Data - Choose your rendering approach
Raw Video Capture - YUV420 frame processing
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:
Desktop development with C++
MSVC v142 or v143 compiler
Windows 10/11 SDK
C++ CMake tools (optional)
.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
| Feature | Description |
|---|---|
| Session Management | Join, 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 Sharing | Share screens or custom content |
| Cloud Recording | Record sessions to Zoom cloud |
| Live Streaming | Stream to RTMP endpoints |
| Chat | Send/receive chat messages |
| Command Channel | Custom command messaging |
| Live Transcription | Real-time speech-to-text |
| C# Support | Full .NET Framework integration |
Sample Applications
Official Repository: https://github.com/zoom/videosdk-windows-rawdata-sample
| Sample | Description |
|---|---|
| VSDK_SkeletonDemo | Minimal session join - start here |
| VSDK_getRawVideo | Capture YUV420 video frames |
| VSDK_getRawAudio | Capture PCM audio |
| VSDK_sendRawVideo | Inject custom video (virtual camera) |
| VSDK_sendRawAudio | Inject custom audio (virtual mic) |
| VSDK_CloudRecording | Cloud recording control |
| VSDK_CommandChannel | Custom command messaging |
| VSDK_TranscriptionAndTranslation | Live 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 {}
// ... etcTip: 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 callbacksUse 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.
🎯 Canvas API (Recommended for Most Use Cases)
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 croppingZoomVideoSDKVideoAspect_FullFilled- Fill window, may crop edgesZoomVideoSDKVideoAspect_PanAndScan- Smart crop to fill windowZoomVideoSDKVideoAspect_LetterBox- Show full video with black bars
Resolution Options:
ZoomVideoSDKResolution_90PZoomVideoSDKResolution_180PZoomVideoSDKResolution_360P- Good balanceZoomVideoSDKResolution_720P- HD qualityZoomVideoSDKResolution_1080PZoomVideoSDKResolution_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:
onSessionJoin- Subscribe to self videoonUserJoin- Subscribe to new remote usersonUserVideoStatusChanged- Re-subscribe when video turns on/offonUserLeave- 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 callbackThe
IZoomVideoSDKShareActionobject 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
| Issue | Cause | Solution |
|---|---|---|
| Video not showing | Not calling startVideo() | Call videoHelper->startVideo() in onSessionJoin |
| Artifacts/tearing | Using Raw Data Pipe | Switch to Canvas API |
| Poor performance | YUV conversion on UI thread | Use Canvas API or move conversion to worker thread |
| Video freezes | Not processing Windows messages | Add message pump to main loop |
| Can't see self | Subscribing to wrong user | Use session->getMyself() for self video |
| Seeing self in remote list | Not excluding self | Check if (user != myself) before subscribing |
Complete Documentation Library
This skill includes comprehensive guides organized by category:
Core Concepts (Start Here!)
SDK Architecture Pattern - Universal 3-step pattern for ANY feature
Singleton Hierarchy - 5-level navigation guide
Canvas vs Raw Data - Choose your rendering approach
Complete Examples
Session Join Pattern - JWT auth + session join with full code
Video Rendering - Canvas API video display
Screen Share Subscription - View remote screen shares (DIFFERENT from video!)
Raw Video Capture - YUV420 frame capture
Raw Audio Capture - PCM audio capture
Send Raw Video - Virtual camera (inject custom video)
Send Raw Audio - Virtual mic (inject custom audio)
Cloud Recording - Cloud recording control
Command Channel - Custom command messaging
Transcription - Live transcription/captions
UI Framework Integration
Win32 Native - Direct SDK usage with Canvas API (best performance)
WinForms (.NET) - C++/CLI wrapper + Raw Data Pipe
WPF (.NET) - C++/CLI wrapper + BitmapSource conversion
Production Quality Guidelines - Checklist and common issues
C++/CLI Wrapper Patterns (Wrapping ANY Native Library)
Complete Guide - 8 patterns for native→.NET interop
Pattern 1: Basic Structure - Project setup, class layout
Pattern 2: void* Pointers - Hide native types
Pattern 3: gcroot Callbacks - Native→Managed events
Pattern 4: IDisposable - Cleanup pattern
Pattern 5: Strings - String^ ↔ wstring/string
Pattern 6: Arrays - pin_ptr, Marshal::Copy
Pattern 7: Threading - UI thread dispatch
Pattern 8: LockBits - Fast image conversion
Common Errors - Troubleshooting
Troubleshooting
Windows Message Loop - CRITICAL: Why callbacks don't fire
Build Errors - SDK header dependency fixes
Common Issues - Quick diagnostics & error codes
References
API Reference - 5-level API hierarchy, methods, error codes
Delegate Methods - All 80+ callback methods
SKILL.md - Complete navigation guide
Most Critical Issues (From Real Debugging)
Callbacks not firing → Missing Windows message loop (99% of issues)
Video subscribe returns error 2 → Subscribing too early
See: Video Rendering - Subscribe in
onUserVideoStatusChanged
Abstract class errors → Missing virtual method implementations
See: Delegate Methods
Key Insight
Once you learn the 3-step pattern, you can implement ANY feature:
Get singleton → 2. Implement delegate → 3. Subscribe & use
Resources
Official Docs: https://developers.zoom.us/docs/video-sdk/windows/
API Reference: https://marketplacefront.zoom.us/sdk/custom/windows/
Dev Forum: https://devforum.zoom.us/
GitHub Samples: https://github.com/zoom/videosdk-windows-rawdata-sample
Working Sample:
C:\tempsdk\zoom-video-sdk-windows-sample\(complete implementation)
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:
Overview → windows.md
Read the architecture pattern → concepts/sdk-architecture-pattern.md
Universal formula: Singleton → Delegate → Subscribe
Once you understand this, you can implement any feature
Fix build errors → troubleshooting/build-errors.md
SDK header dependencies
Required include order
Implement session join → examples/session-join-pattern.md
Complete working JWT + session join code
Fix callback issues → troubleshooting/windows-message-loop.md
CRITICAL: Why callbacks don't fire without Windows message loop
Implement video → examples/video-rendering.md
Canvas API (SDK-rendered) vs Raw Data Pipe
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 guideBy Use Case
I want to build a video app
SDK Architecture Pattern - Understand the pattern
Session Join Pattern - Join sessions
Video Rendering - Display video
Windows Message Loop - Fix callback issues
I'm getting build errors
Build Errors Guide - SDK header dependencies
Delegate Methods - Abstract class errors
Common Issues - Linker errors
I'm getting runtime errors
Windows Message Loop - Callbacks not firing
Common Issues - Error code tables
I want to view screen shares
Screen Share Subscription - DIFFERENT from video!
SDK Architecture Pattern - Event-driven pattern
Video Rendering - Compare with video subscription
I want to capture raw video/audio
Canvas vs Raw Data - Choose your approach
Raw Video Capture - YUV420 frame capture
Raw Audio Capture - PCM audio capture
SDK Architecture Pattern - Subscription pattern
I want to send custom video/audio (virtual camera/mic)
Send Raw Video - Inject custom video frames
Send Raw Audio - Inject custom audio
SDK Architecture Pattern - External source pattern
I want to record sessions
Cloud Recording - Start/stop cloud recording
API Reference - Recording helper methods
I want to use live transcription
Transcription - Enable live captions
Delegate Methods - Transcription callbacks
I want custom messaging between participants
Command Channel - Send custom commands
API Reference - Command channel methods
I want to build a Win32 native app
Win32 Integration - Direct SDK + Canvas API
Video Rendering - Canvas API patterns
Production Guidelines - Best practices
I want to build a WinForms (.NET) app
WinForms Integration - C++/CLI wrapper + Raw Data
C++/CLI Patterns - gcroot, Finalizer, LockBits
Production Guidelines - IDisposable, thread safety
I want to build a WPF (.NET) app
WPF Integration - C++/CLI + BitmapSource
Bitmap Conversion - Freeze(), Dispatcher
Production Guidelines - Performance optimization
I want to use C# / .NET Framework (general)
.NET Integration Overview - Complete C++/CLI wrapper guide
Raw Video Capture - YUV→RGB conversion patterns
Session Join Pattern - SDK initialization flow
I want to wrap ANY native C++ library for .NET
C++/CLI Wrapper Patterns - Complete 8-pattern guide
Pattern 1: Basic Structure - Project setup + class layout
Pattern 3: gcroot Callbacks - Native→Managed events
Pattern 4: IDisposable - Cleanup pattern
Common Errors - Troubleshooting
I want to implement a specific feature
SDK Architecture Pattern - START HERE!
Singleton Hierarchy - Navigate to the feature
API Reference - Method signatures
Most Critical Documents
1. SDK Architecture Pattern (MASTER DOCUMENT)
concepts/sdk-architecture-pattern.md
The universal 3-step pattern:
Get singleton (SDK, helpers, session, users)
Implement delegate (event callbacks)
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:
Windows Message Loop is MANDATORY
SDK uses Windows message pump for callbacks
Without it, callbacks are queued but never fire
Subscribe in onUserVideoStatusChanged, NOT onUserJoin
Video may not be ready when user joins
Wait for video status change callback
See: Video Rendering
Two Rendering Paths
Canvas API: SDK renders to your HWND (recommended)
Raw Data Pipe: You receive YUV frames (advanced)
See: Canvas vs Raw Data
Helpers Control YOUR Streams Only
videoHelper->startVideo()starts YOUR cameraTo see others, subscribe to their Canvas/Pipe
See: Singleton Hierarchy
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()
C++/CLI Wrapper Patterns (for ANY native library → .NET)
void*pointers - hide native types from managed headersgcroot<T^>- prevent GC from collecting managed references in native codeFinalizer + Destructor -
~Class()and!Class()for IDisposable cleanuppin_ptr+Marshal::Copy- array/buffer conversionLockBits- 100x faster than SetPixel for image manipulationThread marshaling - InvokeRequired (WinForms) / Dispatcher (WPF)
Audio Connection Timing
Set
audioOption.connect = falseduring joinCall
startAudio()inonSessionJoincallback
Quick Reference
"My code won't compile"
"Callbacks never fire"
"Video subscription returns error 2"
→ Video Rendering - Subscribe in onUserVideoStatusChanged
"Abstract class error"
"How do I implement [feature]?"
"How do I navigate to [controller]?"
"What error code means what?"
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
- ATTRIBUTION.mdAdded by AutoGineer886 B
- LICENSELicence file added by AutoGineer1.1 KiB
- RUNBOOK.md2.2 KiB
- SKILL.md39.8 KiB
- agents/openai.yaml277 B
- concepts/canvas-vs-raw-data.md10.0 KiB
- concepts/sdk-architecture-pattern.md8.6 KiB
- concepts/singleton-hierarchy.md22.2 KiB
- examples/cloud-recording.md8.8 KiB
- examples/command-channel.md8.8 KiB
- examples/dotnet-winforms/guide.md37.7 KiB
- examples/raw-audio-capture.md7.1 KiB
- examples/raw-video-capture.md12.8 KiB
- examples/screen-share-subscription.md18.0 KiB
- examples/send-raw-audio.md9.0 KiB
- examples/send-raw-video.md10.5 KiB
- examples/session-join-pattern.md17.6 KiB
- examples/transcription.md11.5 KiB
- examples/video-rendering.md13.1 KiB
- references/delegate-methods.md31.6 KiB
- references/samples.md7.7 KiB
- references/windows-reference.md42.5 KiB
- troubleshooting/build-errors.md6.0 KiB
- troubleshooting/common-issues.md7.2 KiB
- troubleshooting/windows-message-loop.md6.9 KiB
- windows.md1.9 KiB
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*| Method | Returns | Purpose |
|---|---|---|
initialize(params) | ZoomVideoSDKErrors | Initialize SDK (call once) |
joinSession(context) | IZoomVideoSDKSession* | Join and get session object |
leaveSession(end) | ZoomVideoSDKErrors | Leave or end session |
addListener(delegate) | void | Register 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();| Method | Returns | Purpose |
|---|---|---|
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.
| Method | Returns | Purpose |
|---|---|---|
startVideo() | ZoomVideoSDKErrors | Turn on your camera |
stopVideo() | ZoomVideoSDKErrors | Turn off your camera |
rotateMyVideo(rotation) | bool | Rotate camera output |
switchCamera(deviceId) | bool | Change camera device |
getCameraList() | IVideoSDKVector<IZoomVideoSDKCameraDevice*>* | Available cameras |
getNumberOfCameras() | uint32_t | Camera count |
startVideoCanvasPreview(hwnd, aspect, resolution) | ZoomVideoSDKErrors | Preview your video |
stopVideoCanvasPreview(hwnd) | ZoomVideoSDKErrors | Stop preview |
IZoomVideoSDKAudioHelper
| Method | Returns | Purpose |
|---|---|---|
startAudio() | ZoomVideoSDKErrors | Connect to audio |
stopAudio() | ZoomVideoSDKErrors | Disconnect audio |
muteAudio(user) | ZoomVideoSDKErrors | Mute a user |
unmuteAudio(user) | ZoomVideoSDKErrors | Unmute a user |
getMicList() | IVideoSDKVector<IZoomVideoSDKMicDevice*>* | Available mics |
getSpeakerList() | IVideoSDKVector<IZoomVideoSDKSpeakerDevice*>* | Available speakers |
selectMic(deviceId, name) | ZoomVideoSDKErrors | Select mic |
selectSpeaker(deviceId, name) | ZoomVideoSDKErrors | Select speaker |
IZoomVideoSDKShareHelper
| Method | Returns | Purpose |
|---|---|---|
startShareScreen(monitorId) | ZoomVideoSDKErrors | Share a monitor |
startShareWindow(hwnd) | ZoomVideoSDKErrors | Share a window |
stopShare() | ZoomVideoSDKErrors | Stop sharing |
isShareLocked() | bool | Check if locked |
lockShare(lock) | ZoomVideoSDKErrors | Lock sharing |
isOtherSharing() | bool | Someone else sharing? |
Level 3: User & Rendering Objects
IZoomVideoSDKUser
Represents a participant. Get from session->getMyself() or callbacks.
| Method | Returns | Purpose |
|---|---|---|
getUserID() | const zchar_t* | Unique user ID |
getUserName() | const zchar_t* | Display name |
isHost() | bool | Is session host? |
isManager() | bool | Is manager? |
GetVideoCanvas() | IZoomVideoSDKCanvas* | SDK-rendered video |
GetVideoPipe() | IZoomVideoSDKRawDataPipe* | Raw YUV frames |
GetShareCanvas() | IZoomVideoSDKCanvas* | SDK-rendered share |
GetSharePipe() | IZoomVideoSDKRawDataPipe* | Raw share frames |
getVideoStatus() | ZoomVideoSDKVideoStatus | Video on/off state |
getAudioStatus() | ZoomVideoSDKAudioStatus | Audio mute state |
IZoomVideoSDKCanvas (SDK Rendering)
Let the SDK render video directly to your HWND. Recommended for most apps.
| Method | Returns | Purpose |
|---|---|---|
subscribeWithView(hwnd, aspect, resolution) | ZoomVideoSDKErrors | Start rendering to HWND |
unSubscribeWithView(hwnd) | ZoomVideoSDKErrors | Stop rendering |
setAspectMode(aspect) | ZoomVideoSDKErrors | Change aspect ratio |
setResolution(resolution) | ZoomVideoSDKErrors | Change resolution |
IZoomVideoSDKRawDataPipe (Raw YUV Access)
Get raw YUV420 frames for custom processing.
| Method | Returns | Purpose |
|---|---|---|
subscribe(resolution, delegate) | ZoomVideoSDKErrors | Start receiving frames |
unSubscribe(delegate) | ZoomVideoSDKErrors | Stop receiving |
getVideoStatus() | ZoomVideoSDKVideoStatus | Check if video is on |
IZoomVideoSDKShareAction
Received in onUserShareStatusChanged callback. Controls remote share subscription.
| Method | Returns | Purpose |
|---|---|---|
subscribe() | ZoomVideoSDKErrors | Subscribe to share |
unSubscribe() | ZoomVideoSDKErrors | Unsubscribe |
subscribeWithView(hwnd, aspect) | ZoomVideoSDKErrors | Render share to HWND |
unSubscribeWithView(hwnd) | ZoomVideoSDKErrors | Stop rendering |
getShareCanvas() | IZoomVideoSDKCanvas* | Get share canvas |
getSharePipe() | IZoomVideoSDKRawDataPipe* | Get raw share pipe |
getShareType() | ZoomVideoSDKShareType | Screen/window/etc |
Level 4: Devices, Chat & Callbacks
IZoomVideoSDKCameraDevice
| Method | Returns |
|---|---|
getDeviceId() | const zchar_t* |
getDeviceName() | const zchar_t* |
isSelectedDevice() | bool |
IZoomVideoSDKMicDevice / IZoomVideoSDKSpeakerDevice
| Method | Returns |
|---|---|
getDeviceId() | const zchar_t* |
getDeviceName() | const zchar_t* |
isSelectedDevice() | bool |
IZoomVideoSDKChatHelper
| Method | Returns | Purpose |
|---|---|---|
sendChatToAll(message) | ZoomVideoSDKErrors | Broadcast message |
sendChatToUser(user, message) | ZoomVideoSDKErrors | Private message |
canChatMessageBeDeleted(msgId) | bool | Check delete permission |
deleteChatMessage(msgId) | ZoomVideoSDKErrors | Delete a message |
IZoomVideoSDKChatMessage
Received in onChatNewMessageNotify callback.
| Method | Returns |
|---|---|
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).
| Method | Returns | Purpose |
|---|---|---|
GetYBuffer() | char* | Y plane (luminance) |
GetUBuffer() | char* | U plane (chrominance) |
GetVBuffer() | char* | V plane (chrominance) |
GetStreamWidth() | unsigned int | Frame width |
GetStreamHeight() | unsigned int | Frame height |
GetRotation() | unsigned int | 0, 90, 180, 270 |
GetTimeStamp() | unsigned long long | Frame timestamp |
CanAddRef() / AddRef() / Release() | - | Reference counting |
AudioRawData
PCM audio samples (16-bit signed).
| Method | Returns | Purpose |
|---|---|---|
GetBuffer() | char* | PCM sample buffer |
GetBufferLen() | unsigned int | Buffer size (bytes) |
GetSampleRate() | unsigned int | Sample rate (Hz) |
GetChannelNum() | unsigned int | 1=mono, 2=stereo |
IZoomVideoSDKUserHelper
Admin actions on users.
| Method | Returns | Purpose |
|---|---|---|
removeUser(user) | bool | Kick user from session |
makeHost(user) | bool | Transfer host role |
makeManager(user) | bool | Promote to manager |
revokeManager(user) | bool | Demote manager |
changeName(user, name) | bool | Rename user |
IZoomVideoSDKCmdChannel
Custom signaling (max 60 messages/second).
| Method | Returns | Purpose |
|---|---|---|
sendCommand(user, command) | ZoomVideoSDKErrors | Send to one user |
sendCommandToAll(command) | ZoomVideoSDKErrors | Broadcast to all |
IVirtualBackgroundItem
| Method | Returns |
|---|---|
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 subscribeisOn == false→ Unsubscribe or skiphasSource == 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
| Code | Name | Common Cause |
|---|---|---|
| 0 | Success | - |
| 1 | Wrong_Usage | Calling method in wrong state |
| 2 | Internal_Error | Video not ready, subscribe too early |
| 7 | Invalid_Parameter | NULL pointer, bad HWND |
| 8 | Call_Too_Frequently | Need Sleep() between calls |
Two Rendering Approaches
| Approach | Interface | When to Use |
|---|---|---|
| Canvas API | IZoomVideoSDKCanvas::subscribeWithView(HWND) | Standard apps, best quality |
| Raw Data Pipe | IZoomVideoSDKRawDataPipe::subscribe(delegate) | Custom processing, effects, recording |
Canvas API (Recommended)
// 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
| 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 16-bit) |
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 |
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 |
IZoomVideoSDKRTMSHelper | Real-time media streams |
IZoomVideoSDKIncomingLiveStreamHelper | Incoming live stream |
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 |
|---|---|
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: 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_NAMESPACEAdditional Resources
Official Docs: https://developers.zoom.us/docs/video-sdk/windows/
API Reference: https://marketplacefront.zoom.us/sdk/custom/windows/
Sample Code: https://github.com/zoom/videosdk-windows-rawdata-sample
Dev Forum: https://devforum.zoom.us
C# .NET Sample: https://github.com/zoom/videosdk-windows-dotnet-quickstart
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/windows · 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-windows.zip