Zoom Video SDK Windows 云录制实战:RecordingHelper 封装、状态回调与录制同意处理
Zoom Video SDK Windows 云录制实战RecordingHelper 封装、状态回调与录制同意处理【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins本篇基于 knowledge-work-plugins 仓库中 Zoom 插件的 Windows 云录制示例文档讲解如何在使用 Zoom Video SDKCWindows 平台的自定义应用中以编程方式控制云端录制从RecordingManager完整封装类、onSessionJoin中的启动时机、RecordingStatus状态机到录制同意Consent回调的两种处理分支。读完后可直接复制示例代码在自己的 SDK 集成中实现“入会即录、离会即停、状态全程可观测”的云端录制能力。云录制能力与核心流程云录制Cloud Recording将会话录像保存到 Zoom 云端存储而非写入本地磁盘。该能力在 Windows SDK 中通过IZoomVideoSDKRecordingHelper暴露主要特性包括以编程方式启动/停止录制startCloudRecording()/stopCloudRecording()处理参会者的录制同意Recording Consent通过onCloudRecordingStatus回调接收录制状态通知。原文档给出的整体流程为四步┌─────────────────────────────────────────────────────────────────┐ │ CLOUD RECORDING FLOW │ ├─────────────────────────────────────────────────────────────────┤ │ 1. Check canStartRecording() │ │ 2. Start recording → startCloudRecording() │ │ 3. Handle consent → onCloudRecordingStatus() callback │ │ 4. Stop recording → stopCloudRecording() │ └─────────────────────────────────────────────────────────────────┘从源码结构看这套流程与 Zoom Windows SDK 的通用“单例 → 委托 → 订阅”三层架构一致先从IZoomVideoSDK获取getRecordingHelper()单例再实现IZoomVideoSDKDelegate的录制回调最后根据回调事件驱动 UI 或业务逻辑。该模式在 Windows 技能总览 中被列为任何功能包括云录制的通用三步法。前置条件与运行环境原文档列出的三项业务前置条件是会话必须已启用云录制Session must have cloud recording enabled当前用户必须具有录制权限主持人或被授予权限使用具有云录制配额的 Zoom 账号。工程环境方面Windows 技能文档 要求Windows 101903 或更高版本或 Windows 11x64推荐、x86 或 ARM64 架构Visual Studio 2019 或 2022Windows SDK 10.0.19041.0 及以上。需要特别注意一个高频坑SDK 依赖 Windows 消息泵分发回调控制台应用或自定义主循环必须处理 Windows 消息PeekMessage/TranslateMessage/DispatchMessage否则onSessionJoin()等回调不会触发云录制的启动时机也就无从谈起。RecordingManager 封装类完整代码原文档给出的核心是一个把录制控制逻辑从委托中剥离出来的RecordingManager类。头文件声明如下#pragma once #include windows.h #include zoom_video_sdk_interface.h USING_ZOOM_VIDEO_SDK_NAMESPACE class RecordingManager { public: RecordingManager(IZoomVideoSDK* sdk); // Recording control bool StartRecording(); bool StopRecording(); bool PauseRecording(); bool ResumeRecording(); // Status bool CanStartRecording(); bool IsRecording() const { return m_isRecording; } // Called from delegate void OnRecordingStatus(RecordingStatus status, IZoomVideoSDKRecordingConsentHandler* handler); private: IZoomVideoSDK* m_sdk; IZoomVideoSDKRecordingHelper* m_recordingHelper; bool m_isRecording; };实现部分完整继承原文档并按调用链补充注释#include RecordingManager.h #include iostream RecordingManager::RecordingManager(IZoomVideoSDK* sdk) : m_sdk(sdk) , m_recordingHelper(nullptr) , m_isRecording(false) { } // 1. 预检拿 helper 单例 canStartRecording() 双重检查 bool RecordingManager::CanStartRecording() { m_recordingHelper m_sdk-getRecordingHelper(); if (!m_recordingHelper) { std::cout Recording helper not available std::endl; return false; } ZoomVideoSDKErrors err m_recordingHelper-canStartRecording(); if (err ZoomVideoSDKErrors_Success) { return true; } std::cout Cannot start recording: err std::endl; return false; } // 2. 启动必须先通过 CanStartRecording() 预检 bool RecordingManager::StartRecording() { if (!CanStartRecording()) { return false; } ZoomVideoSDKErrors err m_recordingHelper-startCloudRecording(); if (err ZoomVideoSDKErrors_Success) { std::cout Cloud recording started std::endl; return true; } std::cout Start recording failed: err std::endl; return false; } // 3. 停止helper 为空时延迟重试获取避免启动过又取不到 bool RecordingManager::StopRecording() { if (!m_recordingHelper) { m_recordingHelper m_sdk-getRecordingHelper(); } if (!m_recordingHelper) { return false; } ZoomVideoSDKErrors err m_recordingHelper-stopCloudRecording(); if (err ZoomVideoSDKErrors_Success) { std::cout Cloud recording stopped std::endl; m_isRecording false; return true; } std::cout Stop recording failed: err std::endl; return false; } // 4. 暂停 bool RecordingManager::PauseRecording() { if (!m_recordingHelper) return false; ZoomVideoSDKErrors err m_recordingHelper-pauseCloudRecording(); if (err ZoomVideoSDKErrors_Success) { std::cout Recording paused std::endl; return true; } return false; } // 5. 恢复 bool RecordingManager::ResumeRecording() { if (!m_recordingHelper) return false; ZoomVideoSDKErrors err m_recordingHelper-resumeCloudRecording(); if (err ZoomVideoSDKErrors_Success) { std::cout Recording resumed std::endl; return true; } return false; } // 6. 状态回调统一入口由 Delegate 转发调用 void RecordingManager::OnRecordingStatus(RecordingStatus status, IZoomVideoSDKRecordingConsentHandler* handler) { switch (status) { case RecordingStatus_Start: std::cout Recording started std::endl; m_isRecording true; break; case RecordingStatus_Stop: std::cout Recording stopped std::endl; m_isRecording false; break; case RecordingStatus_Pause: std::cout Recording paused std::endl; break; case RecordingStatus_Connecting: std::cout Recording connecting... std::endl; break; case RecordingStatus_DiskFull: std::cout Recording stopped - disk full! std::endl; m_isRecording false; break; default: std::cout Recording status: status std::endl; } // Handle consent if required if (handler) { // Automatically accept recording consent // In production, you may want to prompt the user handler-accept(); std::cout Recording consent accepted std::endl; } }这段实现有两个值得注意的工程细节其一m_isRecording状态以RecordingStatus_Start/RecordingStatus_Stop回调为准而不是以同步返回值为准因为录制的真实生命周期由 SDK 异步决定例如云配额不足、网络中断都可能触发非预期停止其二consent handler 的自动accept()只是示例做法文档明确提示生产环境应改为向用户弹出提示再决定。在 Delegate 中接入启动时机与停止时机IZoomVideoSDKDelegate中与录制相关的两个纯虚回调在 API 参考 中有完整签名// Recording callbacks virtual void onCloudRecordingStatus(RecordingStatus status, IZoomVideoSDKRecordingConsentHandler* pHandler) 0; virtual void onUserRecordingConsent(IZoomVideoSDKUser* pUser) 0;原文档给出的委托集成方式是把RecordingManager挂到 Delegate 上并在会话生命周期节点上驱动录制class MyDelegate : public IZoomVideoSDKDelegate { private: RecordingManager* m_recordingManager; public: MyDelegate(IZoomVideoSDK* sdk) { m_recordingManager new RecordingManager(sdk); } void onSessionJoin() override { // Start recording when session begins if (m_recordingManager-CanStartRecording()) { m_recordingManager-StartRecording(); } } void onSessionLeave() override { // Stop recording before leaving if (m_recordingManager-IsRecording()) { m_recordingManager-StopRecording(); } } void onCloudRecordingStatus(RecordingStatus status, IZoomVideoSDKRecordingConsentHandler* handler) override { m_recordingManager-OnRecordingStatus(status, handler); } void onUserRecordingConsent(IZoomVideoSDKUser* user) override { std::wcout LUser gave recording consent: user-getUserName() std::endl; } // ... other callbacks };这里有三层时机设计启动放在onSessionJoin()join 返回成功只表示请求被受理会话尚未真正建立。原文档在“Recording Doesnt Start”一节中明确说明必须在onSessionJoin回调之后启动录制这与 入会模式文档 中“在onSessionJoin里连接音频、启动视频”的官方样本时机一致停止放在onSessionLeave()先检查IsRecording()再停避免对未开始的录制发停止请求状态与同意事件统一转发onCloudRecordingStatus只负责转发业务逻辑全部收敛在RecordingManager::OnRecordingStatus中UI 层无需感知 SDK 细节。RecordingStatus 状态值全表原文档的状态表如下五个状态覆盖了连接、进行、暂停、停止与异常存储满全生命周期状态含义RecordingStatus_Start录制已开始RecordingStatus_Stop录制已停止RecordingStatus_Pause录制已暂停RecordingStatus_Connecting正在连接录制服务RecordingStatus_DiskFull因存储已满而停止仓库中的 API 参考文件 也给出了该枚举定义以Recording_Start、Recording_Stop、Recording_Pause、Recording_Connecting、Recording_DiskFull命名两者对应同一组状态具体符号名以你所用 SDK 版本的zoom_video_sdk_delegate_interface.h头文件为准。录制同意Recording Consent机制当录制开启时参会者可能需要被征询同意。onCloudRecordingStatus回调的第二参IZoomVideoSDKRecordingConsentHandler*即为此提供处理分支有两种void onCloudRecordingStatus(RecordingStatus status, IZoomVideoSDKRecordingConsentHandler* handler) override { if (handler) { // Options: handler-accept(); // Accept recording handler-decline(); // Decline (will leave session) } }accept()接受录制流程继续decline()拒绝录制该方将会离开会话。另外onUserRecordingConsent(IZoomVideoSDKUser* user)用于通知“某位参会者已给出同意”示例代码中通过user-getUserName()打印用户名。一个容易误判的情况是handler 为 NULL 并不代表出错——并非所有会话都需要征询同意此时直接忽略即可。IZoomVideoSDKRecordingHelper 方法清单原文档汇总的 Helper 方法及其返回类型如下所有控制方法都返回ZoomVideoSDKErrors需逐一判错方法返回类型说明canStartRecording()ZoomVideoSDKErrors检查当前是否可开始录制startCloudRecording()ZoomVideoSDKErrors启动云录制stopCloudRecording()ZoomVideoSDKErrors停止云录制pauseCloudRecording()ZoomVideoSDKErrors暂停云录制resumeCloudRecording()ZoomVideoSDKErrors恢复云录制getCloudRecordingStatus()RecordingStatus获取当前录制状态从源码结构看getRecordingHelper()是IZoomVideoSDK一级接口的方法见 windows-reference.md 中的纯虚声明virtual IZoomVideoSDKRecordingHelper* getRecordingHelper() 0;属于 SDK 五级单例层级中最浅的一层因此不需要先拿到 session 或 user 对象即可取用。若头文件编译报错可参考仓库 构建错误指南 提到的头文件依赖录制相关接口对应helpers/zoom_video_sdk_recording_helper_interface.h。常见问题排查canStartRecording() 返回错误可能原因当前不是主持人或未获录制权限账号未开通云录制已经处于录制中。排查方向核对会议角色权限与 Zoom 账号的云录制设置。录制没有开始原因是会话尚未完成加入。修正方式与上文委托示例一致void onSessionJoin() override { // Safe to start recording now recordingManager-StartRecording(); }同时确认主循环中存在 Windows 消息泵否则连onSessionJoin本身都不会触发。Consent Handler 为 NULL这不是错误表示该会话无需录制同意。属于正常情况代码中按handler空指针分支放行即可。在 Zoom 插件文档体系中的位置本示例对应官方样本仓库中的VSDK_CloudRecording样本样本清单见 samples 参考在整个 Windows 技能文档中的关联导航为Session Join Pattern — 入会前置流程JWT、init、join、消息泵Delegate Methods — 全部 80 回调方法中“Recording Events”一节的两个录制回调API Reference — 五级 API 层级、错误码与方法签名。按“先入会、再取 Helper、后驱动回调”的顺序组合这三份文档即可把本文的RecordingManager方案落地到完整的 Windows 桌面应用中。【免费下载链接】knowledge-work-pluginsOpen source repository of plugins primarily intended for knowledge workers to use in Claude Cowork项目地址: https://gitcode.com/GitHub_Trending/kn/knowledge-work-plugins创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考