跳转到主要内容
SMeetingNet 把 SMeeting.h 的 C++ 接口包装成惯用的 C# 写法:回调变成 event,媒体变成强类型对象, SMeetingEngine / SMeetingChannel 可以 Dispose,不需要自己写回调 vtable。 调用顺序与 C++ 快速开始 完全一致,先分清楚两层对象:
  • SMeetingEngine —— 进程级,一个就够。登录、会议管理 HTTP 接口、频道生命周期、设备枚举、IM、资源盘
  • SMeetingChannel —— 一个会议一个对象,入会、房间与成员数据、会中操作、媒体对象都在它上面

初始化 SDK

SetLanguage / Version / GetStatusMessage 都是静态方法,不必先有 engine 实例。 状态码文案用 SMeetingEngine.GetStatusMessage(code) 取,语言跟随 SetLanguage(未设置时为英文)。

注册引擎级事件

这里只有不属于任何会议的回调:设备变化、默认设备变化、网络探测、IM、会议开始提醒(MeetingStartMessage)。 会议内的回调都在 SMeetingChannel 上。

登录

Login 是异步的,结果只能从回调里拿。

创建会议

已有会议号或房间号时,直接跳到下一步。

加入会议

分两步:CreateChannel 只创建对象、不入会,配置好之后再 Enter()。 和 C++ 一样,事件必须在 Enter() 之前订阅 —— 入会过程中的回调是在 enter 还没返回时就同步触发的。
RoomName(入会昵称)与 StreamVendor 都要在 Enter() 之前设置。 入会失败时 channel 对象依然存在,必须用 engine.LeaveChannel(channel) 回收。

获取房间与成员信息

这几个接口返回的都是原始 json,schema 由后端定义,需要你自己解析(每个成员的已发布轨道在 stream_tracks 字段里,含 desc / kind / width / height / fps)。

摄像头

麦克风

扬声器(听到所有人)

远端音频传空 uid 取的是频道混音,打开后即可听到所有人,无需逐个订阅:

播放远端视频

远端轨道不是可以长期持有的句柄:成员离开后 SDK 会销毁对应对象,届时再按同一个 (uid, desc) 取会得到 null。所以不要缓存 SMeetingRemoteVideo,每次使用都重新 GetRemoteVideo。 本地摄像头 / 屏幕共享对象相反,在频道存活期间可以一直持有。
窗口渲染直接用现成的 SMeetingHwndView(句柄);要渲染到自己的表面就从 SMeetingView 派生并重写 UpdatePlanes(GetViewType 返回 SMeetingViewType.CallBack)。SMeetingView 析构前务必先 RemovePlayView,否则渲染线程可能访问已释放对象。

屏幕共享

可共享的目标用 engine.EnumScreen() 枚举:Type == 5 是显示器(取 X / Y / Width / Height 拼矩形), Type == 0 是窗口(取 Hwnd)。

聊天与自定义消息

收到的消息在 RoomChatMessage / RoomCustomMessage 事件里。

主持人操作

本地录制

退出与释放

线程与生命周期

  • 除入会过程中的事件外,所有事件都在 SDK 内部线程触发,界面更新请自己 marshal (WinForms 用 BeginInvoke)到 UI 线程
  • 带 SMeetingCallback 的异步接口(Login / Enter / RequestOpenCamera 等)回调只触发一次, 参数是 (SMeetingStatusCode code, string data)
  • 媒体对象都是频道借出的句柄:只在频道存活期间有效,退出频道后一律不要再使用
  • SMeetingNet.dll 是 C++/CLI 混合模式程序集,位数必须与 bin 及工程目标平台一致,见集成
更完整的可运行示例见 WinForms Demo(九宫格布局,含设备选择、翻页、共享与聊天)。