跳转到主要内容

C++ 快速开始

本文档介绍如何在 Windows 平台使用 C++ 集成 SMeeting SDK。

基本概念

  • ISMeetingEngine:SDK 核心引擎类,提供 SMeeting 的基础功能。通过 setEventHandler 绑定回调监听,通过 getSetting 设置基本参数。
  • 部分接口只允许在进入会议后调用。

初始化 SDK

#include "SMeeting.h"

// 初始化引擎
SMeeting::ISMeetingEngine* _imeet = nullptr;
SMeeting::StatusCode ret = SMeeting::SMeetingEngine_Init(&_imeet);
if (ret != SMeeting::StatusCode::OK) {
    return ret;
}

// 设置事件回调(当前类需继承 ISMeetingEngineEvent)
_imeet->setEventHandler(this);

实现事件回调类

class MyEventHandler : public SMeeting::ISMeetingEngineEvent {
public:
    void onDisconnected(SMeeting::DisconnectReason reason, 
                        SMeeting::StatusCode code, 
                        std::string message) override {
        // 处理断开连接事件
    }

    void onReconnected() override {
        // 处理重连成功事件
    }

    void onUserEnter(std::string roomno, std::string userdata) override {
        // 处理用户进入事件
    }

    // ... 实现其他需要的事件回调
};

登录与登出

登录

std::string token = "your_token_here";
_imeet->login(token, [&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 登录成功
    } else {
        // 登录失败
    }
});

登出

_imeet->logout([&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 登出成功
    }
});

创建会议

SMeeting::SMeetingCreateMeetingModel model;
model.title = "我的会议";
model.content = "会议说明";
model.meeting_type = 1;  // 1: 临时会议,2: 预约会议
model.meeting_mode = 1;  // 1: 普通

_imeet->createRoom(model, [&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // msg 为会议号
        std::cout << "会议创建成功,会议号:" << msg << std::endl;
    }
});

加入会议

配置 SDK 参数

SMeeting::ISMeetingSetting* setting = nullptr;
_imeet->getSetting(&setting);
if (setting) {
    setting->set_stream_model(1);           // 设置流媒体模式
    setting->set_speaker_interval(500);     // 音柱回调周期 (ms)
    setting->set_stat_interval(10000);      // 网络统计回调周期 (ms)
    setting->set_enable_audio_record(1);    // 启用音频录制
    setting->set_enable_stream_log(1);      // 启用流日志
}

进入房间

std::string roomno = "123456789";
std::string name = "张三";
std::string pass = "";  // 会议密码,无密码则为空

_imeet->enterRoom(roomno, name, pass, [&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 进入房间成功
    } else {
        // 进入房间失败
    }
});

退出会议

_imeet->exitRoom([&](SMeeting::StatusCode status, std::string msg) {
    // 退出房间结果
});

结束会议(主持人)

// 主持人解散会议
_imeet->adminDestroyRoom([&](SMeeting::StatusCode status, std::string msg) {
    // 结束会议结果
});

取消会议(会议外)

std::string meeting_id = "sw46gz";
_imeet->cancelRoom(meeting_id, [&](SMeeting::StatusCode status, std::string msg) {
    // 取消会议结果
});

获取房间和成员信息

std::string s;

// 获取自身信息
_imeet->getMe(s);

// 获取房间信息
_imeet->getRoom(s);

// 获取所有成员信息
_imeet->getMembers(s);

// 获取指定成员信息
std::string uid = "user_123";
_imeet->getMember(uid, s);

更新昵称

std::string new_name = "新昵称";
_imeet->updateName(new_name, [&](SMeeting::StatusCode status, std::string msg) {
    // 昵称修改结果
});

获取设备列表

// type: 1=麦克风,2=扬声器,3=摄像头
std::vector<int> types = {1, 2, 3};
int page = 1;
std::string find_key = "";

_imeet->listAgent(types, page, find_key, [&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // msg 为设备列表 JSON 字符串
    }
});

摄像头操作

获取摄像头对象

SMeeting::IMEETLocalCamera* camera = nullptr;
SMeeting::StatusCode sc = _imeet->getLocalCamera(&camera);
if (sc != SMeeting::StatusCode::OK) {
    return;
}

打开摄像头

// 设置渲染窗口(hwnd 为窗口句柄)
camera->addPlayView(hwnd);

// 请求打开摄像头
camera->requestOpenCamera([&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 摄像头打开成功
    }
});

切换摄像头

std::string camera_name = "Integrated Camera";
int width = 640;
int height = 480;
camera->switchCamera(camera_name, width, height);

关闭摄像头

camera->closeCamera([&](SMeeting::StatusCode status, std::string msg) {
    // 摄像头关闭结果
});

远端视频播放

获取远端视频对象

std::string uid = "user_123";
std::string track_desc = SMeeting::TRACK_DESC_CAMERA_BIG;  // 或 TRACK_DESC_CAMERA_SMALL

SMeeting::IMEETRemoteVideo* remote_video = nullptr;
_imeet->getRemoteVideo(uid, track_desc, &remote_video);

开始播放

// 设置渲染窗口
remote_video->addPlayView(hwnd);

// 开始加载远端视频流
remote_video->loadRemoteVideo();

停止播放

remote_video->unLoadRemoteVideo();
remote_video->removeAllPlayView();

麦克风操作

获取麦克风对象

SMeeting::IMEETLocalMic* mic = nullptr;
_imeet->getLocalMic(&mic);

打开麦克风

mic->requestOpenMic([&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 麦克风打开成功
    }
});

切换麦克风

std::string mic_name = "Default Microphone";
mic->switchMic(mic_name);

关闭麦克风

mic->closeMic([&](SMeeting::StatusCode status, std::string msg) {
    // 麦克风关闭结果
});

扬声器操作

获取远端音频对象

SMeeting::IMEETRemoteAudio* audio = nullptr;
_imeet->getRemoteAudio("", &audio);

打开扬声器

audio->openSpeaker();

切换扬声器

std::string speaker_name = "Default Speakers";
audio->switchSpeaker(speaker_name);

关闭扬声器

audio->closeSpeaker();

屏幕共享

获取屏幕共享对象

SMeeting::IMEETLocalScreen* screen = nullptr;
_imeet->getLocalScreen(&screen);

开始共享

// tp: 1=屏幕共享,2=窗口共享
// data: 屏幕索引或窗口句柄字符串
int tp = 1;
std::string data = "0,0,1920,1080";  // 主屏幕
//std::string data_hwnd = "hwnd:123321";//窗口采集

screen->requestShare(tp, data, [&](SMeeting::StatusCode status, std::string msg) {
    if (status == SMeeting::StatusCode::OK) {
        // 共享开始成功
    }
});

停止共享

screen->stopShare([&](SMeeting::StatusCode status, std::string msg) {
    // 共享停止结果
});

聊天消息

发送聊天消息

// tp: 1=文本,2=文件,3=图片,4=声音
int msg_type = 1;
std::string msg = "大家好!";

_imeet->sendRoomChatMessage(msg_type, msg, [&](SMeeting::StatusCode status, std::string m) {
    // 发送结果
});

主持人管理接口

请求用户打开摄像头

std::string uid = "user_123";
_imeet->adminRequestUserOpenCamera(uid, [&](SMeeting::StatusCode status, std::string msg) {
    // 请求结果
});

关闭用户摄像头

_imeet->adminCloseUserCamera(uid, [&](SMeeting::StatusCode status, std::string msg) {
    // 操作结果
});

请求用户打开麦克风

_imeet->adminRequestUserOpenMic(uid, [&](SMeeting::StatusCode status, std::string msg) {
    // 请求结果
});

关闭用户麦克风

_imeet->adminCloseUserMic(uid, [&](SMeeting::StatusCode status, std::string msg) {
    // 操作结果
});

踢出用户

_imeet->adminKickUserOut(uid, [&](SMeeting::StatusCode status, std::string msg) {
    // 踢出结果
});

设置房间麦克风权限

bool self_unmute_mic_disabled = true;   // 是否禁止自行解除静音
bool mic_disabled = true;               // 是否禁用房间音频

_imeet->adminUpdateRoomMicState(self_unmute_mic_disabled, mic_disabled, 
    [&](SMeeting::StatusCode status, std::string msg) {
        // 设置结果
    });

MCU 合成视频

获取 MCU 视频对象

SMeeting::IMEETRemoteVideo* mcu_video = nullptr;
_imeet->getMcuVideo(&mcu_video);

播放合成流

mcu_video->addPlayView(hwnd);
mcu_video->loadRemoteVideo();

停止播放

mcu_video->unLoadRemoteVideo();

释放资源

// 释放引擎
if (_imeet) {
    _imeet->del();
    _imeet = nullptr;
}

完整示例

#include "SMeeting.h"
#include <iostream>

class MyHandler : public SMeeting::ISMeetingEngineEvent {
public:
    void onDisconnected(SMeeting::DisconnectReason reason,
                        SMeeting::StatusCode code,
                        std::string message) override {
        std::cout << "Disconnected: " << (int)code << std::endl;
    }

    void onUserEnter(std::string roomno, std::string userdata) override {
        std::cout << "User entered: " << userdata << std::endl;
    }
    
    // 实现其他需要的回调...
};

int main() {
    // 初始化
    SMeeting::ISMeetingEngine* engine = nullptr;
    SMeeting::StatusCode ret = SMeeting::SMeetingEngine_Init(&engine);
    if (ret != SMeeting::StatusCode::OK) {
        return -1;
    }

    MyHandler handler;
    engine->setEventHandler(&handler);

    // 登录
    std::string token = "your_token";
    engine->login(token, [&](SMeeting::StatusCode status, std::string msg) {
        if (status == SMeeting::StatusCode::OK) {
            // 创建会议
            SMeeting::SMeetingCreateMeetingModel model;
            model.title = "测试会议";
            engine->createRoom(model, [&](SMeeting::StatusCode status, std::string roomno) {
                if (status == SMeeting::StatusCode::OK) {
                    // 进入会议
                    engine->enterRoom(roomno, "用户 A", "", 
                        [&](SMeeting::StatusCode status, std::string msg) {
                            if (status == SMeeting::StatusCode::OK) {
                                std::cout << "进入会议成功" << std::endl;
                            }
                        });
                }
            });
        }
    });

    // 等待异步操作完成(实际应用中应有事件循环)
    std::this_thread::sleep_for(std::chrono::seconds(30));

    // 清理
    engine->logout();
    engine->del();

    return 0;
}