iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Zoom Meeting SDK для Windows (C++)

Справочник по Zoom Meeting SDK для Windows: встраивание встреч в приложения на C++, боты без интерфейса, захват видео и звука.

СкиллAnthropic (партнёр: Zoom)ClaudeMITНужен терминалПроверка не требуетсяСлужебный: его вызывают другие скиллы
Что делает
Справочник по Zoom Meeting SDK для Windows: встраивание встреч в приложения на C++, боты без интерфейса, захват видео и звука.
Когда брать
Когда нужно встроить встречу Zoom в настольное приложение Windows или создать бота, подключающегося к встречам и забирающего видео и звук.
Когда не брать
Если нужна веб-версия или другая платформа, либо достаточно REST API без встраивания встречи.
Пример запроса
Сделай приложение для Windows на C++, которое подключается к встрече Zoom и записывает звук участников.
Нужно подключить
терминал, Visual Studio

Входит в плагин zoom-plugin. В Cowork и Claude Code можно поставить плагин целиком.

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку zoom-meeting-sdk-windows в ~/.claude/skills/.
  3. Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.

Текст

---
name: zoom-meeting-sdk-windows
description: |
  Zoom Meeting SDK для Windows — нативный SDK на C++ для встраивания встреч Zoom в настольные
  приложения Windows. Поддерживает архитектуру с собственным интерфейсом (Custom UI), «сырые» данные видео и звука,
  ботов без интерфейса и глубокую интеграцию с функциями встреч. Включает шаблоны архитектуры SDK и работу с циклом сообщений Windows.
user-invocable: false
triggers:
  - "meeting sdk windows"
  - "windows meeting sdk"
  - "windows meeting bot"
  - "c++ meeting sdk windows"
  - "custom ui meeting windows"
---

Zoom Meeting SDK (Windows)

Встраивай возможности встреч Zoom в настольные приложения Windows: нативные интеграции на C++ и боты без интерфейса.

Впервые работаешь с Zoom SDK? Начни здесь!

Самый быстрый способ освоить SDK:

  1. [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — универсальный шаблон, который работает для ВСЕХ 35+ функций
  2. [Шаблон авторизации](examples/authentication-pattern.md) — рабочий бот, который подключается к встречам
  3. [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — исправление причины №1, по которой не срабатывают колбэки

Создаёшь собственный интерфейс (Custom UI)?

  • [Архитектура Custom UI](concepts/custom-ui-architecture.md) — как на самом деле работает отрисовка SDK (дочерние HWND, D3D и т. д.)
  • [Пример отрисовки видео в Custom UI](examples/custom-ui-video-rendering.md) — полный рабочий код
  • [Отрисовка средствами SDK или своя](concepts/custom-ui-vs-raw-data.md) — выбор подходящего подхода
  • [Методы интерфейса Custom UI](references/interface-methods.md) — все 13 обязательных виртуальных методов

Что-то не работает?

  • Ошибки сборки → [Руководство по ошибкам сборки](troubleshooting/build-errors.md)
  • Колбэки не срабатывают → [Цикл сообщений Windows](troubleshooting/windows-message-loop.md)
  • Быстрая диагностика → [Частые проблемы](troubleshooting/common-issues.md)
  • Производительность и качество обслуживания → [service-quality.md](examples/service-quality.md)
  • Заметки о развёртывании → [deployment.md](references/deployment.md)
  • MSBuild из git bash → [Руководство по ошибкам сборки](troubleshooting/build-errors.md#msbuild-command-pattern)
  • Полная навигация → [SKILL.md](SKILL.md)

Предварительные требования

  • Приложение Zoom с учётными данными Meeting SDK (Client ID и Secret)
  • Visual Studio 2019/2022 или новее
  • Windows 10 или новее
  • Среда разработки на C++
  • vcpkg для управления зависимостями

Нужна помощь с авторизацией? Создание JWT-токена — в скилле [zoom-oauth](../../oauth/SKILL.md).

Предпочтения проекта и накопленный опыт

ВАЖНО: это предпочтения, добытые тяжёлым опытом реальных проектов. Следуй им при создании новых проектов.

НЕ используй CMake — используй нативный .vcxproj Visual Studio

**Всегда создавай нативный проект Visual Studio .sln + .vcxproj**, а не проект CMake. Причины:

  • Это стандартнее и привычнее для разработчиков C++ под Windows
  • Разработчики могут сразу открыть проект в Visual Studio двойным щелчком по .sln
  • Настройки проекта (каталоги заголовков, каталоги библиотек, определения препроцессора) проще увидеть и изменить в окне свойств VS
  • Не нужны дополнительные инструменты CMake и шаг настройки
  • Проект дружелюбнее и понятнее для разработчиков, его проще поддерживать

config.json должен быть виден в обозревателе решений (Solution Explorer)

Файл config.json (содержит sdk_jwt, meeting_number, passcode) должен быть:

  1. **Включён в .vcxproj** как элемент <None> с <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  2. Помещён в фильтр «Config» в файле .vcxproj.filters, чтобы он отображался в обозревателе решений в папке «Config»
  3. Удобен для правки прямо из обозревателя решений — разработчикам не должно приходиться искать его в проводнике

Пример записи в .vcxproj:

<ItemGroup>
  <None Include="config.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Пример записи в .vcxproj.filters:

<ItemGroup>
  <Filter Include="Config">
    <UniqueIdentifier>{GUID-HERE}</UniqueIdentifier>
  </Filter>
</ItemGroup>
<ItemGroup>
  <None Include="config.json">
    <Filter>Config</Filter>
  </None>
</ItemGroup>

Обзор

Windows SDK — это нативный SDK на C++, предназначенный для:

  • Настольных приложений — нативные приложения Windows с полным контролем над интерфейсом
  • Ботов без интерфейса — подключение к встречам без UI
  • Доступа к «сырым» медиа — захват и отправка потоков звука и видео
  • Локальной записи — запись встреч локально или в облако

Ключевая архитектурная идея

SDK следует универсальному 3-шаговому шаблону для каждой функции:

  1. Получить контроллер (одиночка, singleton): meetingService->Get[Feature]Controller()
  2. Реализовать слушатель событий: class MyListener : public I[Feature]Event { ... }
  3. Зарегистрировать и использовать: controller->SetEvent(listener), затем вызывать методы

Это работает для ВСЕХ функций: звук, видео, чат, запись, участники, демонстрация экрана, комнаты обсуждения, вебинары, вопросы и ответы, опросы, доска и ещё 20+!

Подробнее: [Руководство по шаблону архитектуры SDK](concepts/sdk-architecture-pattern.md)

Быстрый старт

1. Скачай Windows SDK

Скачай из Zoom Marketplace:

  • Распакуй zoom-meeting-sdk-windows_x86_64-{version}.zip

2. Настрой структуру проекта

your-project/
  YourApp/
    SDK/
      x64/
        bin/          # DLL-файлы и зависимости
        h/            # Заголовочные файлы
        lib/          # sdk.lib
      x86/
        bin/
        h/
        lib/
    YourApp.cpp
    YourApp.vcxproj
    config.json

Скопируй файлы SDK:

xcopy /E /I sdk-package\x64 your-project\YourApp\SDK\x64\
xcopy /E /I sdk-package\x86 your-project\YourApp\SDK\x86\

3. Установи зависимости (vcpkg)

# Install vcpkg
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
cd C:\vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install

# Install dependencies
.\vcpkg install jsoncpp:x64-windows
.\vcpkg install curl:x64-windows

4. Настрой проект Visual Studio

Свойства проекта → C/C++ → General → Additional Include Directories:

$(SolutionDir)SDK\$(PlatformTarget)\h
C:\vcpkg\packages\jsoncpp_x64-windows\include
C:\vcpkg\packages\curl_x64-windows\include

Свойства проекта → Linker → General → Additional Library Directories:

$(SolutionDir)SDK\$(PlatformTarget)\lib

Свойства проекта → Linker → Input → Additional Dependencies:

sdk.lib

Post-Build Event (копирование DLL в каталог вывода):

xcopy /Y /D "$(SolutionDir)SDK\$(PlatformTarget)\bin\*.*" "$(OutDir)"

5. Настрой учётные данные

Создай config.json:

{
  "sdk_jwt": "YOUR_JWT_TOKEN",
  "meeting_number": "1234567890",
  "passcode": "password123",
  "zak": ""
}

6. Сборка и запуск

  • Открой решение в Visual Studio
  • Выбери конфигурацию x64 или x86
  • Нажми F5 для сборки и запуска

Основной рабочий процесс

┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  InitSDK    │───►│  AuthSDK    │───►│ JoinMeeting │───►│ Подписка на │
│             │    │  (JWT)      │    │             │    │ сырые данные│
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
                         │                   │
                         ▼                   ▼
                   OnAuthComplete      onInMeeting
                     колбэк             колбэк

⚠️ КРИТИЧНО: добавь цикл сообщений Windows, иначе колбэки не сработают!

while (!done) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

См.: [Руководство по циклу сообщений Windows](troubleshooting/windows-message-loop.md)

Примеры кода

💡 Совет профессионала: это минимальные примеры. Полный проверенный код — здесь: - [Шаблон авторизации](examples/authentication-pattern.md) — полный процесс авторизации - [Захват «сырого» видео](examples/raw-video-capture.md) — полный захват видео - [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — реализация любой функции

Важно: порядок подключения заголовков

КРИТИЧНО: подключай заголовки строго в таком порядке, иначе получишь ошибки сборки:

#include <windows.h>      // MUST be first
#include <cstdint>         // MUST be second (SDK headers use uint32_t)
// ... other standard headers ...
#include <zoom_sdk.h>
#include <meeting_service_components/meeting_audio_interface.h>  // BEFORE participants!
#include <meeting_service_components/meeting_participants_ctrl_interface.h>

См.: [Руководство по ошибкам сборки](troubleshooting/build-errors.md) — все исправления зависимостей.

1. Инициализация SDK

#include <windows.h>
#include <cstdint>
#include <zoom_sdk.h>

using namespace ZOOM_SDK_NAMESPACE;

bool InitMeetingSDK() {
    InitParam initParam;
    initParam.strWebDomain = L"https://zoom.us";
    initParam.strSupportUrl = L"https://zoom.us";
    initParam.emLanguageID = LANGUAGE_English;
    initParam.enableLogByDefault = true;
    initParam.enableGenerateDump = true;
    
    SDKError err = InitSDK(initParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"InitSDK failed: " << err << std::endl;
        return false;
    }
    return true;
}

2. Авторизация с помощью JWT

#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include "AuthServiceEventListener.h"

IAuthService* authService = nullptr;

void OnAuthenticationComplete() {
    std::cout << "Authentication successful!" << std::endl;
    JoinMeeting();  // Proceed to join meeting
}

bool AuthenticateSDK(const std::wstring& jwtToken) {
    CreateAuthService(&authService);
    if (!authService) return false;
    
    // Set event listener BEFORE calling SDKAuth
    authService->SetEvent(new AuthServiceEventListener(&OnAuthenticationComplete));
    
    // Authenticate with JWT
    AuthContext authContext;
    authContext.jwt_token = jwtToken.c_str();
    
    SDKError err = authService->SDKAuth(authContext);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"SDKAuth failed: " << err << std::endl;
        return false;
    }
    
    // CRITICAL: Add message loop or callback won't fire!
    // See complete example: examples/authentication-pattern.md
    
    return true;
}

AuthServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class AuthServiceEventListener : public IAuthServiceEvent {
public:
    AuthServiceEventListener(void (*onComplete)()) 
        : onAuthComplete(onComplete) {}
    
    void onAuthenticationReturn(AuthResult ret) override {
        if (ret == AUTHRET_SUCCESS && onAuthComplete) {
            onAuthComplete();
        } else {
            std::cout << "Auth failed: " << ret << std::endl;
        }
    }
    
    // Must implement ALL pure virtual methods (6 total)
    void onLoginReturnWithReason(LOGINSTATUS ret, IAccountInfo* info, LoginFailReason reason) override {}
    void onLogout() override {}
    void onZoomIdentityExpired() override {}
    void onZoomAuthIdentityExpired() override {}
#if defined(WIN32)
    void onNotificationServiceStatus(SDKNotificationServiceStatus status, SDKNotificationServiceError error) override {}
#endif

private:
    void (*onAuthComplete)();
};

Полный рабочий код: [Руководство по шаблону авторизации](examples/authentication-pattern.md)

3. Подключение к встрече

#include <meeting_service_interface.h>
#include "MeetingServiceEventListener.h"

IMeetingService* meetingService = nullptr;

void OnMeetingJoined() {
    std::cout << "Joining meeting..." << std::endl;
}

void OnInMeeting() {
    std::cout << "In meeting now!" << std::endl;
    // Start raw data capture here
}

void OnMeetingEnds() {
    std::cout << "Meeting ended" << std::endl;
}

bool JoinMeeting(UINT64 meetingNumber, const std::wstring& password) {
    CreateMeetingService(&meetingService);
    if (!meetingService) return false;
    
    // Set event listener
    meetingService->SetEvent(
        new MeetingServiceEventListener(&OnMeetingJoined, &OnMeetingEnds, &OnInMeeting)
    );
    
    // Prepare join parameters
    JoinParam joinParam;
    joinParam.userType = SDK_UT_WITHOUT_LOGIN;
    
    JoinParam4WithoutLogin& params = joinParam.param.withoutloginuserJoin;
    params.meetingNumber = meetingNumber;
    params.userName = L"Bot User";
    params.psw = password.c_str();
    params.isVideoOff = false;
    params.isAudioOff = false;
    
    SDKError err = meetingService->Join(joinParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"Join failed: " << err << std::endl;
        return false;
    }
    return true;
}

MeetingServiceEventListener.h:

#include <windows.h>
#include <cstdint>
#include <meeting_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class MeetingServiceEventListener : public IMeetingServiceEvent {
public:
    MeetingServiceEventListener(
        void (*onJoined)(),
        void (*onEnded)(), 
        void (*onInMeeting)()
    ) : onMeetingJoined(onJoined), 
        onMeetingEnded(onEnded),
        onInMeetingCallback(onInMeeting) {}
    
    void onMeetingStatusChanged(MeetingStatus status, int iResult) override {
        if (status == MEETING_STATUS_CONNECTING) {
            if (onMeetingJoined) onMeetingJoined();
        }
        else if (status == MEETING_STATUS_INMEETING) {
            if (onInMeetingCallback) onInMeetingCallback();
        }
        else if (status == MEETING_STATUS_ENDED) {
            if (onMeetingEnded) onMeetingEnded();
        }
    }
    
    // Must implement ALL pure virtual methods (9 total)
    void onMeetingStatisticsWarningNotification(StatisticsWarningType type) override {}
    void onMeetingParameterNotification(const MeetingParameter* param) override {}
    void onSuspendParticipantsActivities() override {}
    void onAICompanionActiveChangeNotice(bool isActive) override {}
    void onMeetingTopicChanged(const zchar_t* sTopic) override {}
    void onMeetingFullToWatchLiveStream(const zchar_t* sLiveStreamUrl) override {}
    void onUserNetworkStatusChanged(MeetingComponentType type, ConnectionQuality level, unsigned int userId, bool uplink) override {}
#if defined(WIN32)
    void onAppSignalPanelUpdated(IMeetingAppSignalHandler* pHandler) override {}
#endif

private:
    void (*onMeetingJoined)();
    void (*onMeetingEnded)();
    void (*onInMeetingCallback)();
};

Все обязательные методы: [Руководство по методам интерфейса](references/interface-methods.md)

4. Подписка на «сырое» видео

#include <windows.h>
#include <cstdint>
#include <rawdata/zoom_rawdata_api.h>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>  // REQUIRED for YUVRawDataI420
#include "ZoomSDKRendererDelegate.h"

IZoomSDKRenderer* videoHelper = nullptr;
ZoomSDKRendererDelegate* videoSource = new ZoomSDKRendererDelegate();

bool StartVideoCapture(uint32_t userId) {
    // STEP 1: Start raw recording FIRST (required!)
    IMeetingRecordingController* recordCtrl = 
        meetingService->GetMeetingRecordingController();
    
    SDKError canStart = recordCtrl->CanStartRawRecording();
    if (canStart != SDKERR_SUCCESS) {
        std::cout << "Cannot start recording: " << canStart << std::endl;
        return false;
    }
    
    recordCtrl->StartRawRecording();
    
    // Wait for recording to initialize
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    
    // STEP 2: Create renderer
    SDKError err = createRenderer(&videoHelper, videoSource);
    if (err != SDKERR_SUCCESS || !videoHelper) {
        std::cout << "createRenderer failed: " << err << std::endl;
        return false;
    }
    
    // STEP 3: Set resolution and subscribe
    videoHelper->setRawDataResolution(ZoomSDKResolution_720P);
    err = videoHelper->subscribe(userId, RAW_DATA_TYPE_VIDEO);
    if (err != SDKERR_SUCCESS) {
        std::cout << "Subscribe failed: " << err << std::endl;
        return false;
    }
    
    std::cout << "Video capture started! Frames arrive in onRawDataFrameReceived()" << std::endl;
    return true;
}

ZoomSDKRendererDelegate.h:

#include <windows.h>
#include <cstdint>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>
#include <fstream>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class ZoomSDKRendererDelegate : public IZoomSDKRendererDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        if (!data) return;
        
        // YUV420 (I420) format: Y plane + U plane + V plane
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();
        
        // Calculate buffer sizes
        // Y = full resolution, U/V = quarter resolution each
        size_t ySize = width * height;
        size_t uvSize = ySize / 4;  // (width/2) * (height/2)
        
        // Total size: width * height * 1.5 bytes
        
        // Save to file (playback: ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 output.yuv)
        std::ofstream outputFile("output.yuv", std::ios::binary | std::ios::app);
        outputFile.write(data->GetYBuffer(), ySize);    // Brightness
        outputFile.write(data->GetUBuffer(), uvSize);   // Blue-difference
        outputFile.write(data->GetVBuffer(), uvSize);   // Red-difference
        outputFile.close();
    }
    
    void onRawDataStatusChanged(RawDataStatus status) override {
        std::cout << "Raw data status: " << status << std::endl;
    }
    
    void onRendererBeDestroyed() override {
        std::cout << "Renderer destroyed" << std::endl;
    }
};

Полное руководство по захвату видео: [Руководство по захвату «сырого» видео](examples/raw-video-capture.md)

5. Подписка на «сырой» звук

#include <rawdata/rawdata_audio_helper_interface.h>

class ZoomSDKAudioRawDataDelegate : public IZoomSDKAudioRawDataDelegate {
public:
    void onMixedAudioRawDataReceived(AudioRawData* data) override {
        // Process PCM audio (mixed from all participants)
        std::ofstream pcmFile("audio.pcm", std::ios::binary | std::ios::app);
        pcmFile.write((char*)data->GetBuffer(), data->GetBufferLen());
        pcmFile.close();
    }
    
    void onOneWayAudioRawDataReceived(AudioRawData* data, uint32_t node_id) override {
        // Process audio from specific participant
    }
};

// Subscribe to audio
IZoomSDKAudioRawDataHelper* audioHelper = GetAudioRawdataHelper();
audioHelper->subscribe(new ZoomSDKAudioRawDataDelegate());

6. Главный цикл сообщений (КРИТИЧНО!)

⚠️ БЕЗ НЕГО КОЛБЭКИ НЕ СРАБОТАЮТ!

#include <windows.h>
#include <thread>
#include <chrono>

int main() {
    // Initialize COM
    CoInitialize(NULL);
    
    // Load config and initialize
    LoadConfig();
    InitMeetingSDK();
    AuthenticateSDK(sdk_jwt);
    
    // CRITICAL: Windows message loop for SDK callbacks
    // SDK uses Windows message pump to dispatch callbacks
    // Without this, callbacks are queued but NEVER fire!
    MSG msg;
    while (!g_exit) {
        // Process all pending Windows messages
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_exit = true;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        
        // Small sleep to avoid busy-waiting
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    
    // Cleanup
    CleanSDK();
    CoUninitialize();
    
    return 0;
}

Почему цикл сообщений критичен: SDK использует COM и сообщения Windows для асинхронных колбэков. Без PeekMessage() SDK ставит сообщения в очередь, но они никогда не извлекаются и не передаются обработчикам, поэтому колбэки не выполняются.

Симптомы при отсутствии цикла сообщений:

  • Тайм-аут авторизации (даже с действительным JWT)
  • Тайм-аут подключения к встрече
  • Ни одно событие колбэка не срабатывает
  • Выглядит как проблема сети или авторизации, но на самом деле проблема в цикле сообщений

Подробное объяснение: [Руководство по циклу сообщений Windows](troubleshooting/windows-message-loop.md)

Частые проблемы и решения

ПроблемаРешение
Колбэки не срабатывают / тайм-аут авторизацииДобавь цикл сообщений Windows → [Руководство](troubleshooting/windows-message-loop.md)
**Ошибки uint32_t / AudioType**Исправь порядок подключения заголовков → [Руководство](troubleshooting/build-errors.md)
Ошибка абстрактного классаРеализуй все виртуальные методы → [Руководство](references/interface-methods.md)
Как реализовать [функцию]?Следуй универсальному шаблону → [Руководство](concepts/sdk-architecture-pattern.md)
Не проходит авторизацияПроверь JWT-токен и коды ошибок → [Руководство](troubleshooting/common-issues.md)
Кадры видео не приходятСначала вызови StartRawRecording() → [Руководство](examples/raw-video-capture.md)

Полное руководство по устранению проблем: [Руководство по частым проблемам](troubleshooting/common-issues.md)

Как реализовать любую функцию

У SDK более 35 контроллеров функций (звук, видео, чат, запись, участники, демонстрация экрана, комнаты обсуждения, вебинары, вопросы и ответы, опросы, доска, субтитры, AI Companion и др.).

Универсальный шаблон, который работает для ВСЕХ функций:

  1. Получи контроллер (одиночка, singleton): ``cpp IMeetingAudioController* audioCtrl = meetingService->GetMeetingAudioController(); IMeetingChatController* chatCtrl = meetingService->GetMeetingChatController(); // ... 33 more controllers available ``
  1. Реализуй слушатель событий (шаблон «наблюдатель»): ``cpp class MyAudioListener : public IMeetingAudioCtrlEvent { void onUserAudioStatusChange(IList<IUserAudioStatus*>* lst) override { // React to audio events } // ... implement all required methods }; ``
  1. Зарегистрируй и используй: ``cpp audioCtrl->SetEvent(new MyAudioListener()); audioCtrl->MuteAudio(userId, true); // Use feature ``

Полное руководство с примерами: [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md)

Доступные примеры

ПримерОписание
SkeletonDemoМинимальное подключение к встрече — начни с него
GetVideoRawDataПодписка на потоки «сырого» видео
GetAudioRawDataПодписка на потоки «сырого» звука
SendVideoRawDataОтправка собственного видео как виртуальной камеры
SendAudioRawDataОтправка собственного звука как виртуального микрофона
GetShareRawDataЗахват содержимого демонстрации экрана
LocalRecordingЛокальная запись в MP4
ChatDemoФункции чата во время встречи
CaptionDemoСубтитры и живая расшифровка
BreakoutDemoУправление комнатами обсуждения

Подробные справочные материалы

🎯 Основные концепции (НАЧНИ ЗДЕСЬ!)

  • [concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md) — Универсальный шаблон реализации ЛЮБОЙ функции — понимание этого открывает весь SDK!

📚 Полные примеры

  • [examples/authentication-pattern.md](examples/authentication-pattern.md) — полная рабочая авторизация с JWT-токенами
  • [examples/raw-video-capture.md](examples/raw-video-capture.md) — захват видео YUV420 с подробным описанием формата

🔧 Руководства по устранению проблем

  • [troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md) — почему не срабатывают колбэки (САМОЕ КРИТИЧНОЕ!)
  • [troubleshooting/build-errors.md](troubleshooting/build-errors.md) — проблемы зависимостей заголовков SDK и их исправление
  • [troubleshooting/common-issues.md](troubleshooting/common-issues.md) — быстрый порядок диагностики и таблицы кодов ошибок

📖 Справочные материалы

  • [references/interface-methods.md](references/interface-methods.md) — как реализовать ВСЕ обязательные виртуальные методы
  • [references/windows-reference.md](references/windows-reference.md) — зависимости, настройка Visual Studio
  • [../references/authorization.md](../references/authorization.md) — создание JWT для SDK
  • [../references/bot-authentication.md](../references/bot-authentication.md) — типы токенов бота (ZAK, OBF, JWT)

🎨 Руководства по отдельным функциям

  • [../references/breakout-rooms.md](../references/breakout-rooms.md) — программное управление комнатами обсуждения
  • [../references/ai-companion.md](../references/ai-companion.md) — управление AI Companion

Репозитории с примерами

РепозиторийОписание
meetingsdk-windows-raw-recording-sampleОфициальные примеры захвата «сырых» данных
meetingsdk-windows-local-recording-sampleЛокальная запись с Docker

Воспроизведение файлов «сырого» видео и звука

В «сырых» файлах YUV/PCM нет заголовков — формат нужно указывать явно.

Воспроизведение «сырого» видео YUV

ffplay -video_size 1280x720 -pixel_format yuv420p -f rawvideo output.yuv

Преобразование YUV в MP4

ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv -c:v libx264 output.mp4

Воспроизведение «сырого» звука PCM

ffplay -f s16le -ar 32000 -ac 1 audio.pcm

Преобразование PCM в WAV

ffmpeg -f s16le -ar 32000 -ac 1 -i audio.pcm output.wav

Объединение видео и звука

ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv ^
       -f s16le -ar 32000 -ac 1 -i audio.pcm ^
       -c:v libx264 -c:a aac -shortest output.mp4

Основные флаги:

ФлагОписание
-video_size WxHРазмеры кадра (например, 1280x720)
-pixel_format yuv420pПланарный формат I420/YUV420
-f rawvideoВход «сырого» видео (без контейнера)
-f s16leЗнаковый 16-битный PCM с прямым порядком байтов (little-endian)
-ar 32000Частота дискретизации (Zoom использует 32 кГц)
-ac 1Моно (для стерео используй -ac 2)

Требования к авторизации (обновление 2026 года)

Важно: начиная со 2 марта 2026 года приложения, которые подключаются к встречам за пределами своего аккаунта, должны быть авторизованы.

Используй один из вариантов:

  • App Privilege Token (OBF) — рекомендуется для ботов (app_privilege_token в JoinParam)
  • ZAK Token — ключ доступа Zoom (Zoom Access Key) (userZAK в JoinParam)
  • On Behalf Token — для особых случаев (onBehalfToken в JoinParam)

📖 Полная библиотека документации

Этот скилл включает подробные руководства, созданные на основе реальной отладки:

🎯 Начни здесь

  • [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — главный документ: универсальный шаблон для ЛЮБОЙ функции
  • [SKILL.md](SKILL.md) — полное навигационное руководство

📚 По категориям

Основные концепции:

  • [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — как работает каждая функция (одиночка + наблюдатель)

Полные примеры:

  • [Шаблон авторизации](examples/authentication-pattern.md) — рабочая авторизация JWT со всем кодом
  • [Захват «сырого» видео](examples/raw-video-capture.md) — захват видео YUV420 с объяснениями

Устранение проблем:

  • [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — КРИТИЧНО: почему не срабатывают колбэки
  • [Ошибки сборки](troubleshooting/build-errors.md) — исправление зависимостей заголовков SDK
  • [Частые проблемы](troubleshooting/common-issues.md) — быстрая диагностика и коды ошибок

Справочные материалы:

  • [Методы интерфейса](references/interface-methods.md) — все обязательные виртуальные методы (6 Auth + 9 Meeting)
  • [Справочник по Windows](references/windows-reference.md) — настройка платформы
  • [Авторизация](../references/authorization.md) — создание JWT
  • [Авторизация ботов](../references/bot-authentication.md) — типы токенов бота
  • [Комнаты обсуждения](../references/breakout-rooms.md) — API комнат обсуждения
  • [AI Companion](../references/ai-companion.md) — функции ИИ

🚨 Самые критичные проблемы (из реальной отладки)

  1. Колбэки не срабатывают → нет цикла сообщений Windows (99 % проблем)
  2. См.: [Руководство по циклу сообщений Windows](troubleshooting/windows-message-loop.md)
  1. Ошибки сборки → зависимости заголовков SDK (uint32_t, AudioType и т. д.)
  2. См.: [Руководство по ошибкам сборки](troubleshooting/build-errors.md)
  1. Ошибки абстрактного класса → не реализованы виртуальные методы
  2. См.: [Руководство по методам интерфейса](references/interface-methods.md)

💡 Ключевая мысль

Выучив 3-шаговый шаблон, ты сможешь реализовать ЛЮБУЮ из 35+ функций:

  1. Получить контроллер → 2. Реализовать слушатель событий → 3. Зарегистрировать и использовать

См.: [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md)

Официальные ресурсы


Версия документации: основана на Zoom Windows Meeting SDK v6.7.2.26830

Нужна помощь? Начни с [SKILL.md](SKILL.md) — полная навигация.

Объединено из meeting-sdk/windows/SKILL.md

Zoom Windows Meeting SDK — полный указатель документации

🚀 Путь быстрого старта

Если ты впервые работаешь с SDK, иди в таком порядке:

  1. Прочитай шаблон архитектуры → [concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)
  2. Он учит универсальной формуле, которая применима ко ВСЕМ функциям
  3. Поняв её, ты сможешь реализовать любую функцию, читая файлы .h
  1. Исправь ошибки сборки → [troubleshooting/build-errors.md](troubleshooting/build-errors.md)
  2. Проблемы зависимостей заголовков SDK
  3. Обязательный порядок подключения
  1. Реализуй авторизацию → [examples/authentication-pattern.md](examples/authentication-pattern.md)
  2. Полный рабочий код авторизации JWT
  1. Исправь проблемы с колбэками → [troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md)
  2. КРИТИЧНО: почему колбэки не срабатывают без цикла сообщений Windows
  3. Эту проблему было сложнее всего диагностировать!
  1. Реализуй виртуальные методы → [references/interface-methods.md](references/interface-methods.md)
  2. Полные списки всех обязательных методов
  3. Как избежать ошибок абстрактного класса
  1. Захват видео (необязательно) → [examples/raw-video-capture.md](examples/raw-video-capture.md)
  2. Формат YUV420 с объяснениями
  3. Полный процесс захвата «сырых» данных
  1. Устрани любые проблемы → [troubleshooting/common-issues.md](troubleshooting/common-issues.md)
  2. Быстрый диагностический чек-лист
  3. Таблицы кодов ошибок
  4. Справочник «если видишь X, делай Y»

📂 Структура документации

meeting-sdk/windows/
├── SKILL.md                           # Обзор основного скилла
├── SKILL.md                           # Этот файл — навигационное руководство
│
├── concepts/                          # Основные архитектурные шаблоны
│   ├── sdk-architecture-pattern.md   # САМЫЙ ВАЖНЫЙ ДОКУМЕНТ
│   │                                  # Универсальная формула для ЛЮБОЙ функции
│   ├── singleton-hierarchy.md        # Путеводитель по службам SDK
│   │                                  # Дерево служб глубиной 4 уровня, когда и как
│   ├── custom-ui-architecture.md     # Как работает отрисовка Custom UI
│   │                                  # Дочерние HWND, D3D, раскладка, события
│   └── custom-ui-vs-raw-data.md      # Отрисовка средствами SDK или своя
│                                      # Руководство по выбору подхода к Custom UI
│
├── examples/                          # Полные рабочие примеры кода
│   ├── authentication-pattern.md     # Авторизация JWT с полным кодом
│   ├── raw-video-capture.md          # Захват видео с подробностями о YUV420
│   │                                  # Запись или потоковая передача, разрешения
│   ├── custom-ui-video-rendering.md  # Custom UI с контейнером видео
│   │                                  # Активный докладчик + раскладка «галерея»
│   ├── breakout-rooms.md             # Полное руководство по комнатам обсуждения
│   │                                  # 5 ролей, создание, управление, вход
│   ├── chat.md                       # Отправка и получение сообщений чата
│   │                                  # Форматированный текст, ветки, передача файлов
│   ├── captions-transcription.md     # Живая расшифровка и субтитры
│   │                                  # Перевод на несколько языков
│   ├── local-recording.md            # Локальная запись в MP4
│   │                                  # Процесс разрешений, мониторинг кодировщика
│   ├── share-raw-data-capture.md     # Захват сырых данных демонстрации экрана
│   │                                  # Кадры YUV420 из демонстрируемого содержимого
│   └── send-raw-data.md              # Виртуальная камера, микрофон, демонстрация
│                                      # Отправка собственного видео, звука, демонстрации
│
├── troubleshooting/                   # Руководства по устранению проблем
│   ├── windows-message-loop.md       # КРИТИЧНО — почему не срабатывают колбэки
│   ├── build-errors.md               # Исправление зависимостей заголовков + MSBuild
│   └── common-issues.md              # Быстрый порядок диагностики
│
└── references/                        # Справочная документация
    ├── interface-methods.md           # Обязательные виртуальные методы
    │                                  # Auth(6) + Meeting(9) + CustomUI(13)
    ├── windows-reference.md           # Настройка платформы
    ├── authorization.md               # Создание JWT
    ├── bot-authentication.md          # Типы токенов бота
    ├── breakout-rooms.md              # Возможности комнат обсуждения
    └── ai-companion.md                # Возможности AI Companion

🎯 По сценариям использования

Хочу создать бота для встреч

  1. [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — пойми шаблон
  2. [Шаблон авторизации](examples/authentication-pattern.md) — подключение к встречам
  3. [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — исправление проблем с колбэками
  4. [Методы интерфейса](references/interface-methods.md) — реализация колбэков

Получаю ошибки сборки

  1. [Руководство по ошибкам сборки](troubleshooting/build-errors.md) — зависимости заголовков SDK
  2. [Методы интерфейса](references/interface-methods.md) — ошибки абстрактного класса
  3. [Частые проблемы](troubleshooting/common-issues.md) — ошибки компоновщика

Получаю ошибки во время выполнения

  1. [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — колбэки не срабатывают
  2. [Шаблон авторизации](examples/authentication-pattern.md) — тайм-аут авторизации
  3. [Частые проблемы](troubleshooting/common-issues.md) — таблицы кодов ошибок

Хочу создать приложение для встреч с собственным интерфейсом (Custom UI)

  1. [Архитектура Custom UI](concepts/custom-ui-architecture.md) — как работает отрисовка SDK
  2. [Отрисовка средствами SDK или своя](concepts/custom-ui-vs-raw-data.md) — выбери подход
  3. [Отрисовка видео в Custom UI](examples/custom-ui-video-rendering.md) — полный рабочий код
  4. [Методы интерфейса](references/interface-methods.md) — 13 виртуальных методов Custom UI
  5. [Руководство по ошибкам сборки](troubleshooting/build-errors.md) — MSBuild из git bash

Хочу захватывать видео и звук

  1. [Захват «сырого» видео](examples/raw-video-capture.md) — полный процесс работы с видео
  2. Подходы «запись» и «потоковая передача»
  3. Требования к разрешениям (организатор, токены OAuth)
  4. Захват звука PCM
  5. [Захват «сырых» данных демонстрации экрана](examples/share-raw-data-capture.md) — захват демонстрации экрана
  6. Подписка на RAW_DATA_TYPE_SHARE
  7. Обработка изменяющегося разрешения
  8. [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — шаблон контроллера
  9. [Частые проблемы](troubleshooting/common-issues.md) — кадры не приходят

Хочу использовать комнаты обсуждения

  1. [Руководство по комнатам обсуждения](examples/breakout-rooms.md) — полный процесс работы с комнатами обсуждения
  2. 5 ролей: Creator, Admin, Data, Assistant, Attendee
  3. Создание, настройка, управление, вход и выход
  4. [Частые проблемы](troubleshooting/common-issues.md) — коды ошибок комнат обсуждения

Хочу реализовать чат

  1. [Руководство по чату](examples/chat.md) — отправка и получение сообщений
  2. Форматирование текста (полужирный, курсив, ссылки)
  3. Личные сообщения и ветки
  4. События передачи файлов

Хочу использовать живую расшифровку

  1. [Руководство по субтитрам и расшифровке](examples/captions-transcription.md) — живая расшифровка
  2. Автоматическое преобразование речи в текст
  3. Перевод на несколько языков
  4. Ручные субтитры (функция организатора)

Хочу записывать встречи

  1. [Руководство по локальной записи](examples/local-recording.md) — локальная запись в MP4
  2. Процесс запроса разрешения
  3. Мониторинг кодировщика zTscoder.exe
  4. Вид «галерея» или активный докладчик

Хочу реализовать конкретную функцию

  1. [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — НАЧНИ ЗДЕСЬ!
  2. Найди контроллер в SDK/x64/h/meeting_service_interface.h
  3. Найди заголовок в SDK/x64/h/meeting_service_components/
  4. Следуй универсальному шаблону: получи контроллер → реализуй слушатель → используй методы

Хочу понять архитектуру SDK

  1. [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — полный обзор архитектуры
  2. [Иерархия одиночек (Singleton Hierarchy)](concepts/singleton-hierarchy.md) — навигация по дереву служб (4 уровня)
  3. [Методы интерфейса](references/interface-methods.md) — шаблон слушателя событий
  4. [Шаблон авторизации](examples/authentication-pattern.md) — шаблон службы

🔥 Самые критичные документы

1. Шаблон архитектуры SDK (⭐ ГЛАВНЫЙ ДОКУМЕНТ)

[concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)

Это САМЫЙ важный документ. Он учит универсальному 3-шаговому шаблону:

  1. Получить контроллер (шаблон «одиночка»)
  2. Реализовать слушатель событий (шаблон «наблюдатель»)
  3. Зарегистрировать и использовать

Поняв этот шаблон, ты сможешь реализовать любую из 35+ функций, просто читая заголовки SDK.

Ключевая мысль: архитектура Zoom SDK идеально последовательна. Каждая функция работает одинаково.


2. Цикл сообщений Windows (⚠️ САМАЯ ЧАСТАЯ ПРОБЛЕМА)

[troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md)

99 % проблем «колбэки не срабатывают» вызваны отсутствием цикла сообщений Windows. Этот документ объясняет:

  • Почему SDK требует цикла PeekMessage()
  • Как реализовать его правильно
  • Как диагностировать проблемы с колбэками

Это была самая трудная для поиска ошибка за время разработки (заняла около 2 часов).


3. Руководство по ошибкам сборки

[troubleshooting/build-errors.md](troubleshooting/build-errors.md)

В заголовках SDK есть ошибки зависимостей, которые приводят к ошибкам сборки. Этот документ содержит:

  • Обязательный порядок подключения
  • Исправление отсутствующего <cstdint>
  • Исправление отсутствующего AudioType
  • Исправление отсутствующего YUVRawDataI420

📊 По типам документов

Концепции (почему и как)

  • [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — универсальный шаблон реализации
  • [Иерархия одиночек (Singleton Hierarchy)](concepts/singleton-hierarchy.md) — путеводитель по службам SDK (глубина 4 уровня)

Примеры (полный рабочий код)

  • [Шаблон авторизации](examples/authentication-pattern.md) — авторизация JWT
  • [Захват «сырого» видео](examples/raw-video-capture.md) — захват видео YUV420, запись или потоковая передача
  • [Отрисовка видео в Custom UI](examples/custom-ui-video-rendering.md) — контейнеры видео, отрисовываемые SDK
  • [Комнаты обсуждения](examples/breakout-rooms.md) — создание, управление, вход в комнаты обсуждения
  • [Чат](examples/chat.md) — отправка и получение сообщений с форматированием
  • [Субтитры и расшифровка](examples/captions-transcription.md) — живая расшифровка и субтитры
  • [Локальная запись](examples/local-recording.md) — локальная запись в MP4 с процессом разрешений
  • [Захват «сырых» данных демонстрации экрана](examples/share-raw-data-capture.md) — захват «сырых» данных демонстрации экрана
  • [Отправка «сырых» данных](examples/send-raw-data.md) — виртуальная камера, микрофон и демонстрация экрана

Устранение проблем

  • [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — проблемы с колбэками
  • [Ошибки сборки](troubleshooting/build-errors.md) — проблемы компиляции
  • [Частые проблемы](troubleshooting/common-issues.md) — быстрая диагностика

Справочные материалы (для поиска информации)

  • [Методы интерфейса](references/interface-methods.md) — обязательные виртуальные методы
  • [Справочник по Windows](references/windows-reference.md) — настройка платформы
  • [Авторизация](../references/authorization.md) — создание JWT
  • [Авторизация ботов](../references/bot-authentication.md) — токены ботов
  • [Комнаты обсуждения](../references/breakout-rooms.md) — API комнат обсуждения
  • [AI Companion](../references/ai-companion.md) — функции ИИ

💡 Ключевые выводы из реальной отладки

Эти документы созданы на основе отладки нерабочего примера Zoom SDK. Вот главные выводы:

Критичные открытия:

  1. Цикл сообщений Windows ОБЯЗАТЕЛЕН (не по желанию)
  2. SDK использует насос сообщений Windows (message pump) для колбэков
  3. Без него колбэки ставятся в очередь, но никогда не срабатывают
  4. Проявляется как «тайм-аут авторизации» даже с действительным JWT
  5. См.: [Руководство по циклу сообщений Windows](troubleshooting/windows-message-loop.md)
  1. В заголовках SDK есть ошибки зависимостей
  2. В заголовках SDK отсутствует #include <cstdint>
  3. meeting_participants_ctrl_interface.h не подключает meeting_audio_interface.h
  4. rawdata_renderer_interface.h только объявляет YUVRawDataI420 без определения (forward declaration)
  5. См.: [Руководство по ошибкам сборки](troubleshooting/build-errors.md)
  1. Порядок подключения КРИТИЧЕН
  2. <windows.h> должен быть ПЕРВЫМ
  3. <cstdint> должен быть ВТОРЫМ
  4. Затем заголовки SDK в определённом порядке
  5. См.: [Руководство по ошибкам сборки](troubleshooting/build-errors.md)
  1. Нужно реализовать ВСЕ виртуальные методы
  2. В том числе методы, зависящие от WIN32
  3. SDK v6.7.2 требует 6 методов авторизации и 9 методов встреч
  4. Разные версии имеют разные требования
  5. См.: [Руководство по методам интерфейса](references/interface-methods.md)
  1. Архитектура удивительно последовательна
  2. Каждая функция следует одному и тому же 3-шаговому шаблону
  3. Контроллеры — одиночки (singleton)
  4. Слушатели событий используют шаблон «наблюдатель»
  5. Выучив шаблон, ты сможешь реализовать любую функцию
  6. См.: [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md)

🎓 Путь обучения по уровню подготовки

Начинающий (никогда не работал с Zoom SDK)

  1. Прочитай [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md), чтобы понять общий замысел
  2. Пройди [Шаблон авторизации](examples/authentication-pattern.md), чтобы подключиться к своей первой встрече
  3. Обращайся к [Частым проблемам](troubleshooting/common-issues.md), когда возникнут сложности

Средний уровень (знаком с основами SDK)

  1. Глубоко изучи [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — реализуй несколько функций
  2. Изучи [Захват «сырого» видео](examples/raw-video-capture.md) для обработки медиа
  3. Используй [Методы интерфейса](references/interface-methods.md) как справочник

Продвинутый (создаёшь боты для продакшена)

  1. Изучи [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — научись реализовывать ЛЮБУЮ функцию
  2. Освой [Цикл сообщений Windows](troubleshooting/windows-message-loop.md) — пойми поток асинхронных колбэков
  3. Обращайся к заголовкам SDK напрямую, используя универсальный шаблон

🔍 Как найти нужное

«Мой код не компилируется»

→ [Руководство по ошибкам сборки](troubleshooting/build-errors.md)

«Тайм-аут авторизации»

→ [Цикл сообщений Windows](troubleshooting/windows-message-loop.md)

«Колбэки никогда не срабатывают»

→ [Цикл сообщений Windows](troubleshooting/windows-message-loop.md)

«Ошибка абстрактного класса»

→ [Методы интерфейса](references/interface-methods.md)

«Как реализовать [функцию]?»

→ [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md)

«Как подключиться к встрече?»

→ [Шаблон авторизации](examples/authentication-pattern.md)

«Как захватить видео?»

→ [Захват «сырого» видео](examples/raw-video-capture.md)

«Что означает этот код ошибки?»

→ [Частые проблемы](troubleshooting/common-issues.md) — подробные таблицы кодов ошибок (SDKERR, AUTHRET, Login, BO, Phone, OBF)

«Как использовать комнаты обсуждения?»

→ [Руководство по комнатам обсуждения](examples/breakout-rooms.md)

«Как устроен SDK?»

→ [Шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md)

«Как перейти к конкретному контроллеру или функции?»

→ [Иерархия одиночек (Singleton Hierarchy)](concepts/singleton-hierarchy.md)

«Как отправлять и получать сообщения чата?»

→ [Руководство по чату](examples/chat.md)

«Как использовать живую расшифровку?»

→ [Руководство по субтитрам и расшифровке](examples/captions-transcription.md)

«Как записывать локально?»

→ [Руководство по локальной записи](examples/local-recording.md)

«Как захватить демонстрацию экрана?»

→ [Захват «сырых» данных демонстрации экрана](examples/share-raw-data-capture.md)


📝 Версия документа

Все документы основаны на Zoom Windows Meeting SDK v6.7.2.26830.

В разных версиях SDK могут отличаться:

  • Обязательные методы колбэков
  • Коды ошибок
  • Поведение API

Если используешь другую версию, проверь обязательные методы командой grep "= 0" SDK/x64/h/*.h.


Помни: [шаблон архитектуры SDK](concepts/sdk-architecture-pattern.md) — самый быстрый способ понять, как устроен Windows Meeting SDK. Прочитай его первым, если отлаживаешь собственный интерфейс или поток событий.

Эксплуатация

  • [RUNBOOK.md](RUNBOOK.md) — пятиминутный чек-лист предварительной проверки и отладки.

Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/knowledge-work-plugins/tree/main/partner-built/zoom-plugin/skills/meeting-sdk/windows, лицензия MIT. Изменения: перевод на русский язык.

Оригинал на английском
---
name: zoom-meeting-sdk-windows
description: |
  Zoom Meeting SDK for Windows - Native C++ SDK for embedding Zoom meetings into Windows desktop
  applications. Supports custom UI architecture with raw video/audio data, headless bots, and deep
  integration with meeting features. Includes SDK architecture patterns and Windows message loop handling.
user-invocable: false
triggers:
  - "meeting sdk windows"
  - "windows meeting sdk"
  - "windows meeting bot"
  - "c++ meeting sdk windows"
  - "custom ui meeting windows"
---

# Zoom Meeting SDK (Windows)

Embed Zoom meeting capabilities into Windows desktop applications for native C++ integrations and headless bots.

## New to Zoom SDK? Start Here!

**The fastest way to master the SDK:**

1. **[SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)** - Learn the universal pattern that works for ALL 35+ features
2. **[Authentication Pattern](examples/authentication-pattern.md)** - Get a working bot joining meetings
3. **[Windows Message Loop](troubleshooting/windows-message-loop.md)** - Fix the #1 reason callbacks don't fire

**Building a Custom UI?**
- [Custom UI Architecture](concepts/custom-ui-architecture.md) - How SDK rendering actually works (child HWNDs, D3D, etc.)
- [Custom UI Video Rendering Example](examples/custom-ui-video-rendering.md) - Complete working code
- [SDK-Rendered vs Self-Rendered](concepts/custom-ui-vs-raw-data.md) - Choose the right approach
- [Custom UI Interface Methods](references/interface-methods.md) - All 13 required virtual methods

**Having issues?**
- Build errors → [Build Errors Guide](troubleshooting/build-errors.md)
- Callbacks not firing → [Windows Message Loop](troubleshooting/windows-message-loop.md)
- Quick diagnostics → [Common Issues](troubleshooting/common-issues.md)
- Performance / service quality → [service-quality.md](examples/service-quality.md)
- Deployment notes → [deployment.md](references/deployment.md)
- MSBuild from git bash → [Build Errors Guide](troubleshooting/build-errors.md#msbuild-command-pattern)
- Complete navigation → [SKILL.md](SKILL.md)

## Prerequisites

- Zoom app with Meeting SDK credentials (Client ID & Secret)
- Visual Studio 2019/2022 or later
- Windows 10 or later
- C++ development environment
- vcpkg for dependency management

> **Need help with authentication?** See the **[zoom-oauth](../../oauth/SKILL.md)** skill for JWT token generation.

## Project Preferences & Learnings

> **IMPORTANT**: These are hard-won preferences from real project experience. Follow these when creating new projects.

### Do NOT use CMake — Use native Visual Studio `.vcxproj`

**Always create a native Visual Studio `.sln` + `.vcxproj` project**, not a CMake project. Reasons:
- More standard and familiar for Windows C++ developers
- Developers can double-click the `.sln` to open in Visual Studio immediately
- Project settings (include dirs, lib dirs, preprocessor defines) are easier to see and edit in the VS Property Pages UI
- No extra CMake tooling or configuration step required
- Friendlier and easier for developers to understand and maintain

### `config.json` must be visible in Solution Explorer

The `config.json` file (containing `sdk_jwt`, `meeting_number`, `passcode`) must be:
1. **Included in the `.vcxproj`** as a `<None>` item with `<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>`
2. **Placed in a "Config" filter** in the `.vcxproj.filters` file so it appears under a "Config" folder in Solution Explorer
3. **Easily editable** by developers directly from Solution Explorer — they should never have to hunt for it in File Explorer

Example `.vcxproj` entry:
```xml
<ItemGroup>
  <None Include="config.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
```

Example `.vcxproj.filters` entry:
```xml
<ItemGroup>
  <Filter Include="Config">
    <UniqueIdentifier>{GUID-HERE}</UniqueIdentifier>
  </Filter>
</ItemGroup>
<ItemGroup>
  <None Include="config.json">
    <Filter>Config</Filter>
  </None>
</ItemGroup>
```

## Overview

The Windows SDK is a **C++ native SDK** designed for:
- **Desktop applications** - Native Windows apps with full UI control
- **Headless bots** - Join meetings without UI
- **Raw media access** - Capture/send audio/video streams
- **Local recording** - Record meetings locally or to cloud

### Key Architectural Insight

The SDK follows a **universal 3-step pattern** for every feature:
1. **Get controller** (singleton): `meetingService->Get[Feature]Controller()`
2. **Implement event listener**: `class MyListener : public I[Feature]Event { ... }`
3. **Register and use**: `controller->SetEvent(listener)` then call methods

**This works for ALL features**: audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, and 20+ more!

Learn more: **[SDK Architecture Pattern Guide](concepts/sdk-architecture-pattern.md)**

## Quick Start

### 1. Download Windows SDK

Download from [Zoom Marketplace](https://marketplace.zoom.us/):
- Extract `zoom-meeting-sdk-windows_x86_64-{version}.zip`

### 2. Setup Project Structure

```
your-project/
  YourApp/
    SDK/
      x64/
        bin/          # DLL files and dependencies
        h/            # Header files
        lib/          # sdk.lib
      x86/
        bin/
        h/
        lib/
    YourApp.cpp
    YourApp.vcxproj
    config.json
```

Copy SDK files:
```cmd
xcopy /E /I sdk-package\x64 your-project\YourApp\SDK\x64\
xcopy /E /I sdk-package\x86 your-project\YourApp\SDK\x86\
```

### 3. Install Dependencies (vcpkg)

```powershell
# Install vcpkg
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
cd C:\vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install

# Install dependencies
.\vcpkg install jsoncpp:x64-windows
.\vcpkg install curl:x64-windows
```

### 4. Configure Visual Studio Project

**Project Properties → C/C++ → General → Additional Include Directories:**
```
$(SolutionDir)SDK\$(PlatformTarget)\h
C:\vcpkg\packages\jsoncpp_x64-windows\include
C:\vcpkg\packages\curl_x64-windows\include
```

**Project Properties → Linker → General → Additional Library Directories:**
```
$(SolutionDir)SDK\$(PlatformTarget)\lib
```

**Project Properties → Linker → Input → Additional Dependencies:**
```
sdk.lib
```

**Post-Build Event** (Copy DLLs to output):
```cmd
xcopy /Y /D "$(SolutionDir)SDK\$(PlatformTarget)\bin\*.*" "$(OutDir)"
```

### 5. Configure Credentials

Create `config.json`:
```json
{
  "sdk_jwt": "YOUR_JWT_TOKEN",
  "meeting_number": "1234567890",
  "passcode": "password123",
  "zak": ""
}
```

### 6. Build & Run

- Open solution in Visual Studio
- Select x64 or x86 configuration
- Press F5 to build and run

## Core Workflow

```
┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│  InitSDK    │───►│  AuthSDK    │───►│ JoinMeeting │───►│ Raw Data    │
│             │    │  (JWT)      │    │             │    │ Subscribe   │
└─────────────┘    └─────────────┘    └─────────────┘    └─────────────┘
                         │                   │
                         ▼                   ▼
                   OnAuthComplete      onInMeeting
                     callback           callback
```

**⚠️ CRITICAL**: Add Windows message loop or callbacks won't fire!
```cpp
while (!done) {
    MSG msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
```
See: [Windows Message Loop Guide](troubleshooting/windows-message-loop.md)

## Code Examples

> **💡 Pro Tip**: These are minimal examples. For complete, tested code see:
> - [Authentication Pattern](examples/authentication-pattern.md) - Full auth workflow
> - [Raw Video Capture](examples/raw-video-capture.md) - Complete video capture
> - [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Implement any feature

### Important: Include Order

**CRITICAL**: Include headers in this exact order or you'll get build errors:

```cpp
#include <windows.h>      // MUST be first
#include <cstdint>         // MUST be second (SDK headers use uint32_t)
// ... other standard headers ...
#include <zoom_sdk.h>
#include <meeting_service_components/meeting_audio_interface.h>  // BEFORE participants!
#include <meeting_service_components/meeting_participants_ctrl_interface.h>
```

See: [Build Errors Guide](troubleshooting/build-errors.md) for all dependency fixes.

### 1. Initialize SDK

```cpp
#include <windows.h>
#include <cstdint>
#include <zoom_sdk.h>

using namespace ZOOM_SDK_NAMESPACE;

bool InitMeetingSDK() {
    InitParam initParam;
    initParam.strWebDomain = L"https://zoom.us";
    initParam.strSupportUrl = L"https://zoom.us";
    initParam.emLanguageID = LANGUAGE_English;
    initParam.enableLogByDefault = true;
    initParam.enableGenerateDump = true;
    
    SDKError err = InitSDK(initParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"InitSDK failed: " << err << std::endl;
        return false;
    }
    return true;
}
```

### 2. Authenticate with JWT

```cpp
#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include "AuthServiceEventListener.h"

IAuthService* authService = nullptr;

void OnAuthenticationComplete() {
    std::cout << "Authentication successful!" << std::endl;
    JoinMeeting();  // Proceed to join meeting
}

bool AuthenticateSDK(const std::wstring& jwtToken) {
    CreateAuthService(&authService);
    if (!authService) return false;
    
    // Set event listener BEFORE calling SDKAuth
    authService->SetEvent(new AuthServiceEventListener(&OnAuthenticationComplete));
    
    // Authenticate with JWT
    AuthContext authContext;
    authContext.jwt_token = jwtToken.c_str();
    
    SDKError err = authService->SDKAuth(authContext);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"SDKAuth failed: " << err << std::endl;
        return false;
    }
    
    // CRITICAL: Add message loop or callback won't fire!
    // See complete example: examples/authentication-pattern.md
    
    return true;
}
```

**AuthServiceEventListener.h:**
```cpp
#include <windows.h>
#include <cstdint>
#include <auth_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class AuthServiceEventListener : public IAuthServiceEvent {
public:
    AuthServiceEventListener(void (*onComplete)()) 
        : onAuthComplete(onComplete) {}
    
    void onAuthenticationReturn(AuthResult ret) override {
        if (ret == AUTHRET_SUCCESS && onAuthComplete) {
            onAuthComplete();
        } else {
            std::cout << "Auth failed: " << ret << std::endl;
        }
    }
    
    // Must implement ALL pure virtual methods (6 total)
    void onLoginReturnWithReason(LOGINSTATUS ret, IAccountInfo* info, LoginFailReason reason) override {}
    void onLogout() override {}
    void onZoomIdentityExpired() override {}
    void onZoomAuthIdentityExpired() override {}
#if defined(WIN32)
    void onNotificationServiceStatus(SDKNotificationServiceStatus status, SDKNotificationServiceError error) override {}
#endif

private:
    void (*onAuthComplete)();
};
```

**See complete working code**: [Authentication Pattern Guide](examples/authentication-pattern.md)

### 3. Join Meeting

```cpp
#include <meeting_service_interface.h>
#include "MeetingServiceEventListener.h"

IMeetingService* meetingService = nullptr;

void OnMeetingJoined() {
    std::cout << "Joining meeting..." << std::endl;
}

void OnInMeeting() {
    std::cout << "In meeting now!" << std::endl;
    // Start raw data capture here
}

void OnMeetingEnds() {
    std::cout << "Meeting ended" << std::endl;
}

bool JoinMeeting(UINT64 meetingNumber, const std::wstring& password) {
    CreateMeetingService(&meetingService);
    if (!meetingService) return false;
    
    // Set event listener
    meetingService->SetEvent(
        new MeetingServiceEventListener(&OnMeetingJoined, &OnMeetingEnds, &OnInMeeting)
    );
    
    // Prepare join parameters
    JoinParam joinParam;
    joinParam.userType = SDK_UT_WITHOUT_LOGIN;
    
    JoinParam4WithoutLogin& params = joinParam.param.withoutloginuserJoin;
    params.meetingNumber = meetingNumber;
    params.userName = L"Bot User";
    params.psw = password.c_str();
    params.isVideoOff = false;
    params.isAudioOff = false;
    
    SDKError err = meetingService->Join(joinParam);
    if (err != SDKERR_SUCCESS) {
        std::wcout << L"Join failed: " << err << std::endl;
        return false;
    }
    return true;
}
```

**MeetingServiceEventListener.h:**
```cpp
#include <windows.h>
#include <cstdint>
#include <meeting_service_interface.h>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class MeetingServiceEventListener : public IMeetingServiceEvent {
public:
    MeetingServiceEventListener(
        void (*onJoined)(),
        void (*onEnded)(), 
        void (*onInMeeting)()
    ) : onMeetingJoined(onJoined), 
        onMeetingEnded(onEnded),
        onInMeetingCallback(onInMeeting) {}
    
    void onMeetingStatusChanged(MeetingStatus status, int iResult) override {
        if (status == MEETING_STATUS_CONNECTING) {
            if (onMeetingJoined) onMeetingJoined();
        }
        else if (status == MEETING_STATUS_INMEETING) {
            if (onInMeetingCallback) onInMeetingCallback();
        }
        else if (status == MEETING_STATUS_ENDED) {
            if (onMeetingEnded) onMeetingEnded();
        }
    }
    
    // Must implement ALL pure virtual methods (9 total)
    void onMeetingStatisticsWarningNotification(StatisticsWarningType type) override {}
    void onMeetingParameterNotification(const MeetingParameter* param) override {}
    void onSuspendParticipantsActivities() override {}
    void onAICompanionActiveChangeNotice(bool isActive) override {}
    void onMeetingTopicChanged(const zchar_t* sTopic) override {}
    void onMeetingFullToWatchLiveStream(const zchar_t* sLiveStreamUrl) override {}
    void onUserNetworkStatusChanged(MeetingComponentType type, ConnectionQuality level, unsigned int userId, bool uplink) override {}
#if defined(WIN32)
    void onAppSignalPanelUpdated(IMeetingAppSignalHandler* pHandler) override {}
#endif

private:
    void (*onMeetingJoined)();
    void (*onMeetingEnded)();
    void (*onInMeetingCallback)();
};
```

**See all required methods**: [Interface Methods Guide](references/interface-methods.md)

### 4. Subscribe to Raw Video

```cpp
#include <windows.h>
#include <cstdint>
#include <rawdata/zoom_rawdata_api.h>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>  // REQUIRED for YUVRawDataI420
#include "ZoomSDKRendererDelegate.h"

IZoomSDKRenderer* videoHelper = nullptr;
ZoomSDKRendererDelegate* videoSource = new ZoomSDKRendererDelegate();

bool StartVideoCapture(uint32_t userId) {
    // STEP 1: Start raw recording FIRST (required!)
    IMeetingRecordingController* recordCtrl = 
        meetingService->GetMeetingRecordingController();
    
    SDKError canStart = recordCtrl->CanStartRawRecording();
    if (canStart != SDKERR_SUCCESS) {
        std::cout << "Cannot start recording: " << canStart << std::endl;
        return false;
    }
    
    recordCtrl->StartRawRecording();
    
    // Wait for recording to initialize
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    
    // STEP 2: Create renderer
    SDKError err = createRenderer(&videoHelper, videoSource);
    if (err != SDKERR_SUCCESS || !videoHelper) {
        std::cout << "createRenderer failed: " << err << std::endl;
        return false;
    }
    
    // STEP 3: Set resolution and subscribe
    videoHelper->setRawDataResolution(ZoomSDKResolution_720P);
    err = videoHelper->subscribe(userId, RAW_DATA_TYPE_VIDEO);
    if (err != SDKERR_SUCCESS) {
        std::cout << "Subscribe failed: " << err << std::endl;
        return false;
    }
    
    std::cout << "Video capture started! Frames arrive in onRawDataFrameReceived()" << std::endl;
    return true;
}
```

**ZoomSDKRendererDelegate.h:**
```cpp
#include <windows.h>
#include <cstdint>
#include <rawdata/rawdata_renderer_interface.h>
#include <zoom_sdk_raw_data_def.h>
#include <fstream>
#include <iostream>

using namespace ZOOM_SDK_NAMESPACE;

class ZoomSDKRendererDelegate : public IZoomSDKRendererDelegate {
public:
    void onRawDataFrameReceived(YUVRawDataI420* data) override {
        if (!data) return;
        
        // YUV420 (I420) format: Y plane + U plane + V plane
        int width = data->GetStreamWidth();
        int height = data->GetStreamHeight();
        
        // Calculate buffer sizes
        // Y = full resolution, U/V = quarter resolution each
        size_t ySize = width * height;
        size_t uvSize = ySize / 4;  // (width/2) * (height/2)
        
        // Total size: width * height * 1.5 bytes
        
        // Save to file (playback: ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 output.yuv)
        std::ofstream outputFile("output.yuv", std::ios::binary | std::ios::app);
        outputFile.write(data->GetYBuffer(), ySize);    // Brightness
        outputFile.write(data->GetUBuffer(), uvSize);   // Blue-difference
        outputFile.write(data->GetVBuffer(), uvSize);   // Red-difference
        outputFile.close();
    }
    
    void onRawDataStatusChanged(RawDataStatus status) override {
        std::cout << "Raw data status: " << status << std::endl;
    }
    
    void onRendererBeDestroyed() override {
        std::cout << "Renderer destroyed" << std::endl;
    }
};
```

**Complete video capture guide**: [Raw Video Capture Guide](examples/raw-video-capture.md)

### 5. Subscribe to Raw Audio

```cpp
#include <rawdata/rawdata_audio_helper_interface.h>

class ZoomSDKAudioRawDataDelegate : public IZoomSDKAudioRawDataDelegate {
public:
    void onMixedAudioRawDataReceived(AudioRawData* data) override {
        // Process PCM audio (mixed from all participants)
        std::ofstream pcmFile("audio.pcm", std::ios::binary | std::ios::app);
        pcmFile.write((char*)data->GetBuffer(), data->GetBufferLen());
        pcmFile.close();
    }
    
    void onOneWayAudioRawDataReceived(AudioRawData* data, uint32_t node_id) override {
        // Process audio from specific participant
    }
};

// Subscribe to audio
IZoomSDKAudioRawDataHelper* audioHelper = GetAudioRawdataHelper();
audioHelper->subscribe(new ZoomSDKAudioRawDataDelegate());
```

### 6. Main Message Loop (CRITICAL!)

**⚠️ WITHOUT THIS, CALLBACKS WON'T FIRE!**

```cpp
#include <windows.h>
#include <thread>
#include <chrono>

int main() {
    // Initialize COM
    CoInitialize(NULL);
    
    // Load config and initialize
    LoadConfig();
    InitMeetingSDK();
    AuthenticateSDK(sdk_jwt);
    
    // CRITICAL: Windows message loop for SDK callbacks
    // SDK uses Windows message pump to dispatch callbacks
    // Without this, callbacks are queued but NEVER fire!
    MSG msg;
    while (!g_exit) {
        // Process all pending Windows messages
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                g_exit = true;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        
        // Small sleep to avoid busy-waiting
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    
    // Cleanup
    CleanSDK();
    CoUninitialize();
    
    return 0;
}
```

**Why message loop is critical**: The SDK uses Windows COM/messaging for async callbacks. Without `PeekMessage()`, the SDK queues messages but they're never retrieved/dispatched, so callbacks never execute.

**Symptoms without message loop**:
- Authentication timeout (even with valid JWT)
- Meeting join timeout
- No callback events fire
- Appears like network/auth issue but it's a message loop issue

**See detailed explanation**: [Windows Message Loop Guide](troubleshooting/windows-message-loop.md)

## Common Issues & Solutions

| Issue | Solution |
|-------|----------|
| **Callbacks don't fire / Auth timeout** | Add Windows message loop → [Guide](troubleshooting/windows-message-loop.md) |
| **`uint32_t` / `AudioType` errors** | Fix include order → [Guide](troubleshooting/build-errors.md) |
| **Abstract class error** | Implement all virtual methods → [Guide](references/interface-methods.md) |
| **How to implement [feature]?** | Follow universal pattern → [Guide](concepts/sdk-architecture-pattern.md) |
| **Authentication fails** | Check JWT token & error codes → [Guide](troubleshooting/common-issues.md) |
| **No video frames received** | Call StartRawRecording() first → [Guide](examples/raw-video-capture.md) |

**Complete troubleshooting**: [Common Issues Guide](troubleshooting/common-issues.md)

## How to Implement Any Feature

The SDK has **35+ feature controllers** (audio, video, chat, recording, participants, screen sharing, breakout rooms, webinars, Q&A, polling, whiteboard, captions, AI companion, etc.).

**Universal pattern that works for ALL features:**

1. **Get the controller** (singleton):
   ```cpp
   IMeetingAudioController* audioCtrl = meetingService->GetMeetingAudioController();
   IMeetingChatController* chatCtrl = meetingService->GetMeetingChatController();
   // ... 33 more controllers available
   ```

2. **Implement event listener** (observer pattern):
   ```cpp
   class MyAudioListener : public IMeetingAudioCtrlEvent {
       void onUserAudioStatusChange(IList<IUserAudioStatus*>* lst) override {
           // React to audio events
       }
       // ... implement all required methods
   };
   ```

3. **Register and use**:
   ```cpp
   audioCtrl->SetEvent(new MyAudioListener());
   audioCtrl->MuteAudio(userId, true);  // Use feature
   ```

**Complete guide with examples**: [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)

## Available Examples

| Example | Description |
|---------|-------------|
| **SkeletonDemo** | Minimal join meeting - start here |
| **GetVideoRawData** | Subscribe to raw video streams |
| **GetAudioRawData** | Subscribe to raw audio streams |
| **SendVideoRawData** | Send custom video as virtual camera |
| **SendAudioRawData** | Send custom audio as virtual mic |
| **GetShareRawData** | Capture screen share content |
| **LocalRecording** | Local MP4 recording |
| **ChatDemo** | In-meeting chat functionality |
| **CaptionDemo** | Closed caption/live transcription |
| **BreakoutDemo** | Breakout room management |

## Detailed References

### 🎯 Core Concepts (START HERE!)
- **[concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)** - **Universal pattern for implementing ANY feature** - Understanding this unlocks the entire SDK!

### 📚 Complete Examples
- **[examples/authentication-pattern.md](examples/authentication-pattern.md)** - Complete working authentication with JWT tokens
- **[examples/raw-video-capture.md](examples/raw-video-capture.md)** - YUV420 video capture with detailed format explanation

### 🔧 Troubleshooting Guides
- **[troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md)** - **Why callbacks don't fire** (MOST CRITICAL!)
- **[troubleshooting/build-errors.md](troubleshooting/build-errors.md)** - SDK header dependency issues and fixes
- **[troubleshooting/common-issues.md](troubleshooting/common-issues.md)** - Quick diagnostic workflow and error code tables

### 📖 References
- **[references/interface-methods.md](references/interface-methods.md)** - How to implement ALL required virtual methods
- **[references/windows-reference.md](references/windows-reference.md)** - Dependencies, Visual Studio setup
- **[../references/authorization.md](../references/authorization.md)** - SDK JWT generation
- **[../references/bot-authentication.md](../references/bot-authentication.md)** - Bot token types (ZAK, OBF, JWT)

### 🎨 Feature-Specific Guides
- **[../references/breakout-rooms.md](../references/breakout-rooms.md)** - Programmatic breakout room management
- **[../references/ai-companion.md](../references/ai-companion.md)** - AI Companion controls

## Sample Repositories

| Repository | Description |
|------------|-------------|
| [meetingsdk-windows-raw-recording-sample](https://github.com/zoom/meetingsdk-windows-raw-recording-sample) | Official raw data capture samples |
| [meetingsdk-windows-local-recording-sample](https://github.com/zoom/meetingsdk-windows-local-recording-container-sample) | Local recording with Docker |

## Playing Raw Video/Audio Files

Raw YUV/PCM files have no headers - you must specify format explicitly.

### Play Raw YUV Video
```cmd
ffplay -video_size 1280x720 -pixel_format yuv420p -f rawvideo output.yuv
```

### Convert YUV to MP4
```cmd
ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv -c:v libx264 output.mp4
```

### Play Raw PCM Audio
```cmd
ffplay -f s16le -ar 32000 -ac 1 audio.pcm
```

### Convert PCM to WAV
```cmd
ffmpeg -f s16le -ar 32000 -ac 1 -i audio.pcm output.wav
```

### Combine Video + Audio
```cmd
ffmpeg -video_size 1280x720 -pixel_format yuv420p -f rawvideo -i output.yuv ^
       -f s16le -ar 32000 -ac 1 -i audio.pcm ^
       -c:v libx264 -c:a aac -shortest output.mp4
```

**Key flags:**
| Flag | Description |
|------|-------------|
| `-video_size WxH` | Frame dimensions (e.g., 1280x720) |
| `-pixel_format yuv420p` | I420/YUV420 planar format |
| `-f rawvideo` | Raw video input (no container) |
| `-f s16le` | Signed 16-bit little-endian PCM |
| `-ar 32000` | Sample rate (Zoom uses 32kHz) |
| `-ac 1` | Mono (use `-ac 2` for stereo) |

## Authentication Requirements (2026 Update)

> **Important**: Beginning **March 2, 2026**, apps joining meetings outside their account must be authorized.

Use one of:
- **App Privilege Token (OBF)** - Recommended for bots (`app_privilege_token` in JoinParam)
- **ZAK Token** - Zoom Access Key (`userZAK` in JoinParam)
- **On Behalf Token** - For specific use cases (`onBehalfToken` in JoinParam)

## 📖 Complete Documentation Library

This skill includes comprehensive guides created from real-world debugging:

### 🎯 Start Here
- **[SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)** - Master document: Universal pattern for ANY feature
- **[SKILL.md](SKILL.md)** - Complete navigation guide

### 📚 By Category

**Core Concepts:**
- [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - How every feature works (singleton + observer pattern)

**Complete Examples:**
- [Authentication Pattern](examples/authentication-pattern.md) - Working JWT auth with all code
- [Raw Video Capture](examples/raw-video-capture.md) - YUV420 video capture explained

**Troubleshooting:**
- [Windows Message Loop](troubleshooting/windows-message-loop.md) - **CRITICAL**: Why callbacks don't fire
- [Build Errors](troubleshooting/build-errors.md) - SDK header dependency fixes
- [Common Issues](troubleshooting/common-issues.md) - Quick diagnostics & error codes

**References:**
- [Interface Methods](references/interface-methods.md) - All required virtual methods (6 auth + 9 meeting)
- [Windows Reference](references/windows-reference.md) - Platform setup
- [Authorization](../references/authorization.md) - JWT generation
- [Bot Authentication](../references/bot-authentication.md) - Bot token types
- [Breakout Rooms](../references/breakout-rooms.md) - Breakout room API
- [AI Companion](../references/ai-companion.md) - AI features

### 🚨 Most Critical Issues (From Real Debugging)

1. **Callbacks not firing** → Missing Windows message loop (99% of issues)
   - See: [Windows Message Loop Guide](troubleshooting/windows-message-loop.md)

2. **Build errors** → SDK header dependencies (`uint32_t`, `AudioType`, etc.)
   - See: [Build Errors Guide](troubleshooting/build-errors.md)

3. **Abstract class errors** → Missing virtual method implementations
   - See: [Interface Methods Guide](references/interface-methods.md)

### 💡 Key Insight

**Once you learn the 3-step pattern, you can implement ANY of the 35+ features:**
1. Get controller → 2. Implement event listener → 3. Register and use

See: [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)

## Official Resources

- **Official docs**: https://developers.zoom.us/docs/meeting-sdk/windows/
- **API Reference**: https://marketplacefront.zoom.us/sdk/meeting/windows/annotated.html
- **Developer forum**: https://devforum.zoom.us/
- **SDK download**: https://marketplace.zoom.us/

---

**Documentation Version**: Based on Zoom Windows Meeting SDK v6.7.2.26830

**Need help?** Start with [SKILL.md](SKILL.md) for complete navigation.


## Merged from meeting-sdk/windows/SKILL.md

# Zoom Windows Meeting SDK - Complete Documentation Index

## 🚀 Quick Start Path

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

1. **Read the architecture pattern** → [concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)
   - This teaches you the universal formula that applies to ALL features
   - Once you understand this, you can implement any feature by reading the `.h` files

2. **Fix build errors** → [troubleshooting/build-errors.md](troubleshooting/build-errors.md)
   - SDK header dependencies issues
   - Required include order

3. **Implement authentication** → [examples/authentication-pattern.md](examples/authentication-pattern.md)
   - Complete working JWT authentication code

4. **Fix callback issues** → [troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md)
   - **CRITICAL**: Why callbacks don't fire without Windows message loop
   - This was the hardest issue to diagnose!

5. **Implement virtual methods** → [references/interface-methods.md](references/interface-methods.md)
   - Complete lists of all required methods
   - How to avoid abstract class errors

6. **Capture video (optional)** → [examples/raw-video-capture.md](examples/raw-video-capture.md)
   - YUV420 format explained
   - Complete raw data capture workflow

7. **Troubleshoot any issues** → [troubleshooting/common-issues.md](troubleshooting/common-issues.md)
   - Quick diagnostic checklist
   - Error code tables
   - "If you see X, do Y" reference

---

## 📂 Documentation Structure

```
meeting-sdk/windows/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core architectural patterns
│   ├── sdk-architecture-pattern.md   # THE MOST IMPORTANT DOC
│   │                                  # Universal formula for ANY feature
│   ├── singleton-hierarchy.md        # Navigation guide for SDK services
│   │                                  # 4-level deep service tree, when/how
│   ├── custom-ui-architecture.md     # How Custom UI rendering works
│   │                                  # Child HWNDs, D3D, layout, events
│   └── custom-ui-vs-raw-data.md      # SDK-rendered vs self-rendered
│                                      # Decision guide for Custom UI approach
│
├── examples/                          # Complete working code
│   ├── authentication-pattern.md     # JWT auth with full code
│   ├── raw-video-capture.md          # Video capture with YUV420 details
│   │                                  # Recording vs Streaming, permissions
│   ├── custom-ui-video-rendering.md  # Custom UI with video container
│   │                                  # Active speaker + gallery layout
│   ├── breakout-rooms.md             # Complete breakout room guide
│   │                                  # 5 roles, create/manage/join
│   ├── chat.md                       # Send/receive chat messages
│   │                                  # Rich text, threading, file transfer
│   ├── captions-transcription.md     # Live transcription & closed captions
│   │                                  # Multi-language translation
│   ├── local-recording.md            # Local MP4 recording
│   │                                  # Permission flow, encoder monitoring
│   ├── share-raw-data-capture.md     # Screen share raw data capture
│   │                                  # YUV420 frames from shared content
│   └── send-raw-data.md              # Virtual camera/mic/share
│                                      # Send custom video/audio/share
│
├── troubleshooting/                   # Problem solving guides
│   ├── windows-message-loop.md       # CRITICAL - Why callbacks fail
│   ├── build-errors.md               # Header dependency fixes + MSBuild
│   └── common-issues.md              # Quick diagnostic workflow
│
└── references/                        # Reference documentation
    ├── interface-methods.md           # Required virtual methods
    │                                  # Auth(6) + Meeting(9) + CustomUI(13)
    ├── windows-reference.md           # Platform setup
    ├── authorization.md               # JWT generation
    ├── bot-authentication.md          # Bot token types
    ├── breakout-rooms.md              # Breakout room features
    └── ai-companion.md                # AI Companion features
```

---

## 🎯 By Use Case

### I want to build a meeting bot
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Understand the pattern
2. [Authentication Pattern](examples/authentication-pattern.md) - Join meetings
3. [Windows Message Loop](troubleshooting/windows-message-loop.md) - Fix callback issues
4. [Interface Methods](references/interface-methods.md) - Implement callbacks

### I'm getting build errors
1. [Build Errors Guide](troubleshooting/build-errors.md) - SDK header dependencies
2. [Interface Methods](references/interface-methods.md) - Abstract class errors
3. [Common Issues](troubleshooting/common-issues.md) - Linker errors

### I'm getting runtime errors
1. [Windows Message Loop](troubleshooting/windows-message-loop.md) - Callbacks not firing
2. [Authentication Pattern](examples/authentication-pattern.md) - Auth timeout
3. [Common Issues](troubleshooting/common-issues.md) - Error code tables

### I want to build a Custom UI meeting app
1. [Custom UI Architecture](concepts/custom-ui-architecture.md) - How SDK rendering works
2. [SDK-Rendered vs Self-Rendered](concepts/custom-ui-vs-raw-data.md) - Choose your approach
3. [Custom UI Video Rendering](examples/custom-ui-video-rendering.md) - Complete working code
4. [Interface Methods](references/interface-methods.md) - 13 Custom UI virtual methods
5. [Build Errors Guide](troubleshooting/build-errors.md) - MSBuild from git bash

### I want to capture video/audio
1. [Raw Video Capture](examples/raw-video-capture.md) - Complete video workflow
   - Recording vs Streaming approaches
   - Permission requirements (host, OAuth tokens)
   - Audio PCM capture
2. [Share Raw Data Capture](examples/share-raw-data-capture.md) - Screen share capture
   - Subscribe to RAW_DATA_TYPE_SHARE
   - Handle dynamic resolution
3. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Controller pattern
4. [Common Issues](troubleshooting/common-issues.md) - No frames received

### I want to use breakout rooms
1. [Breakout Rooms Guide](examples/breakout-rooms.md) - Complete breakout room workflow
   - 5 roles: Creator, Admin, Data, Assistant, Attendee
   - Create, configure, manage, join/leave rooms
2. [Common Issues](troubleshooting/common-issues.md) - Breakout room error codes

### I want to implement chat
1. [Chat Guide](examples/chat.md) - Send/receive messages
   - Rich text formatting (bold, italic, links)
   - Private messages and threading
   - File transfer events

### I want to use live transcription
1. [Captions & Transcription Guide](examples/captions-transcription.md) - Live transcription
   - Automatic speech-to-text
   - Multi-language translation
   - Manual closed captions (host feature)

### I want to record meetings
1. [Local Recording Guide](examples/local-recording.md) - Local MP4 recording
   - Permission request workflow
   - zTscoder.exe encoder monitoring
   - Gallery view vs active speaker

### I want to implement a specific feature
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - **START HERE!**
2. Find the controller in `SDK/x64/h/meeting_service_interface.h`
3. Find the header in `SDK/x64/h/meeting_service_components/`
4. Follow the universal pattern: Get controller → Implement listener → Use methods

### I want to understand the SDK architecture
1. [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Complete architecture overview
2. [Singleton Hierarchy](concepts/singleton-hierarchy.md) - Navigate the service tree (4 levels)
3. [Interface Methods](references/interface-methods.md) - Event listener pattern
4. [Authentication Pattern](examples/authentication-pattern.md) - Service pattern

---

## 🔥 Most Critical Documents

### 1. SDK Architecture Pattern (⭐ MASTER DOCUMENT)
**[concepts/sdk-architecture-pattern.md](concepts/sdk-architecture-pattern.md)**

This is THE most important document. It teaches the universal 3-step pattern:
1. Get controller (singleton pattern)
2. Implement event listener (observer pattern)
3. Register and use

Once you understand this pattern, you can implement **any of the 35+ features** by just reading the SDK headers.

**Key insight**: The Zoom SDK follows a perfectly consistent architecture. Every feature works the same way.

---

### 2. Windows Message Loop (⚠️ MOST COMMON ISSUE)
**[troubleshooting/windows-message-loop.md](troubleshooting/windows-message-loop.md)**

99% of "callbacks not firing" issues are caused by missing Windows message loop. This document explains:
- Why SDK requires `PeekMessage()` loop
- How to implement it correctly
- How to diagnose callback issues

**This was the hardest bug to find during development** (took ~2 hours).

---

### 3. Build Errors Guide
**[troubleshooting/build-errors.md](troubleshooting/build-errors.md)**

SDK headers have dependency bugs that cause build errors. This document provides:
- Required include order
- Missing `<cstdint>` fix
- Missing `AudioType` fix
- Missing `YUVRawDataI420` fix

---

## 📊 By Document Type

### Concepts (Why and How)
- [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - Universal implementation pattern
- [Singleton Hierarchy](concepts/singleton-hierarchy.md) - Navigation guide for SDK services (4 levels deep)

### Examples (Complete Working Code)
- [Authentication Pattern](examples/authentication-pattern.md) - JWT authentication
- [Raw Video Capture](examples/raw-video-capture.md) - Video capture with YUV420, recording vs streaming
- [Custom UI Video Rendering](examples/custom-ui-video-rendering.md) - SDK-rendered video containers
- [Breakout Rooms](examples/breakout-rooms.md) - Create, manage, join breakout rooms
- [Chat](examples/chat.md) - Send/receive messages with rich formatting
- [Captions & Transcription](examples/captions-transcription.md) - Live transcription and closed captions
- [Local Recording](examples/local-recording.md) - Local MP4 recording with permission flow
- [Share Raw Data Capture](examples/share-raw-data-capture.md) - Screen share raw data capture
- [Send Raw Data](examples/send-raw-data.md) - Virtual camera, microphone, and share

### Troubleshooting (Problem Solving)
- [Windows Message Loop](troubleshooting/windows-message-loop.md) - Callback issues
- [Build Errors](troubleshooting/build-errors.md) - Compilation issues
- [Common Issues](troubleshooting/common-issues.md) - Quick diagnostics

### References (Lookup Information)
- [Interface Methods](references/interface-methods.md) - Required virtual methods
- [Windows Reference](references/windows-reference.md) - Platform setup
- [Authorization](../references/authorization.md) - JWT generation
- [Bot Authentication](../references/bot-authentication.md) - Bot tokens
- [Breakout Rooms](../references/breakout-rooms.md) - Breakout room API
- [AI Companion](../references/ai-companion.md) - AI features

---

## 💡 Key Learnings from Real Debugging

These documents were created from actual debugging of a non-functional Zoom SDK sample. Here are the key insights:

### Critical Discoveries:

1. **Windows Message Loop is MANDATORY** (not optional)
   - SDK uses Windows message pump for callbacks
   - Without it, callbacks are queued but never fire
   - Manifests as "authentication timeout" even with valid JWT
   - See: [Windows Message Loop Guide](troubleshooting/windows-message-loop.md)

2. **SDK Headers Have Dependency Bugs**
   - Missing `#include <cstdint>` in SDK headers
   - `meeting_participants_ctrl_interface.h` doesn't include `meeting_audio_interface.h`
   - `rawdata_renderer_interface.h` only forward-declares `YUVRawDataI420`
   - See: [Build Errors Guide](troubleshooting/build-errors.md)

3. **Include Order is CRITICAL**
   - `<windows.h>` must be FIRST
   - `<cstdint>` must be SECOND
   - Then SDK headers in specific order
   - See: [Build Errors Guide](troubleshooting/build-errors.md)

4. **ALL Virtual Methods Must Be Implemented**
   - Including WIN32-conditional methods
   - SDK v6.7.2 requires 6 auth methods + 9 meeting methods
   - Different versions have different requirements
   - See: [Interface Methods Guide](references/interface-methods.md)

5. **The Architecture is Beautifully Consistent**
   - Every feature follows the same 3-step pattern
   - Controllers are singletons
   - Event listeners use observer pattern
   - Once you learn the pattern, you can implement any feature
   - See: [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)

---

## 🎓 Learning Path by Skill Level

### Beginner (Never used Zoom SDK)
1. Read [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) to understand the overall design
2. Follow [Authentication Pattern](examples/authentication-pattern.md) to join your first meeting
3. Reference [Common Issues](troubleshooting/common-issues.md) when you hit problems

### Intermediate (Familiar with SDK basics)
1. Deep dive into [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - implement multiple features
2. Learn [Raw Video Capture](examples/raw-video-capture.md) for media processing
3. Use [Interface Methods](references/interface-methods.md) as reference

### Advanced (Building production bots)
1. Study [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) - learn to implement ANY feature
2. Master [Windows Message Loop](troubleshooting/windows-message-loop.md) - understand async callback flow
3. Reference SDK headers directly using the universal pattern

---

## 🔍 How to Find What You Need

### "My code won't compile"
→ [Build Errors Guide](troubleshooting/build-errors.md)

### "Authentication times out"
→ [Windows Message Loop](troubleshooting/windows-message-loop.md)

### "Callbacks never fire"
→ [Windows Message Loop](troubleshooting/windows-message-loop.md)

### "Abstract class error"
→ [Interface Methods](references/interface-methods.md)

### "How do I implement [feature]?"
→ [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)

### "How do I join a meeting?"
→ [Authentication Pattern](examples/authentication-pattern.md)

### "How do I capture video?"
→ [Raw Video Capture](examples/raw-video-capture.md)

### "What error code means what?"
→ [Common Issues](troubleshooting/common-issues.md) - Comprehensive error code tables (SDKERR, AUTHRET, Login, BO, Phone, OBF)

### "How do I use breakout rooms?"
→ [Breakout Rooms Guide](examples/breakout-rooms.md)

### "How does the SDK work?"
→ [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md)

### "How do I navigate to a specific controller/feature?"
→ [Singleton Hierarchy](concepts/singleton-hierarchy.md)

### "How do I send/receive chat messages?"
→ [Chat Guide](examples/chat.md)

### "How do I use live transcription?"
→ [Captions & Transcription Guide](examples/captions-transcription.md)

### "How do I record locally?"
→ [Local Recording Guide](examples/local-recording.md)

### "How do I capture screen share?"
→ [Share Raw Data Capture](examples/share-raw-data-capture.md)

---

## 📝 Document Version

All documents are based on **Zoom Windows Meeting SDK v6.7.2.26830**.

Different SDK versions may have:
- Different required callback methods
- Different error codes
- Different API behavior

If using a different version, use `grep "= 0" SDK/x64/h/*.h` to verify required methods.

---

Remember: The [SDK Architecture Pattern](concepts/sdk-architecture-pattern.md) is the fastest way to understand how the Windows Meeting SDK fits together. Read it first if you are debugging custom UI or event flow issues.

## Operations

- [RUNBOOK.md](RUNBOOK.md) - 5-minute preflight and debugging checklist.

Источник: anthropics/knowledge-work-plugins / zoom-plugin / zoom-meeting-sdk-windows ↗. Ссылка проверена 2026-10-10.