跳转到主要内容
srtcNet 的调用顺序和 C++ 一致,只是换成了惯用的 C# 写法:事件是 event, 轨道返回强类型对象,频道/引擎实现 IDisposable。先分清楚两层对象:
  • SrtcEngine —— 进程级,一个就够。创建/退出频道、设备枚举、IM、日志上传
  • SrtcChannel —— 一个频道一个对象,成员查询、轨道、推拉流、本地录制都在它上面

初始化 SDK

EnableLog = 0(或传 null)会关掉 SDK 文件日志。初始化失败时 Init 返回 null, 可配合 engine.LastErrorMessage 排查。

注册引擎级事件

这里只有不属于任何频道的回调:设备变化、默认设备变化、网络探测、IM。 其余回调都在 SrtcChannel 上。

加入频道

分两步:CreateChannel 只创建对象不入会,配置好之后再 Join()。 和 C++ 一样,事件必须在 Join() 之前订阅 —— Joined 是在 Join() 还没返回时同步触发的。
UserStreamAdded 只覆盖加入之后新发布的轨道。比自己先进频道的人,要在 Joined 的 MembersJson 里遍历其 stream_tracks 主动补订阅。

打开摄像头并发布

本地轨道先 StartCapture 再 Publish,顺序不能反。Publish 有视频/音频两个重载, 要发布音频请传 SrtcAudioPublishOptions。

打开麦克风并发布

播放频道混音(听到所有人)

远端音频用空 uid、空 trackId 取频道级混音,StartPlay 之后即可听到所有人,无需单独订阅:

播放远端视频

窗口渲染用现成的 SrtcHwndView(句柄);要渲染到自己的表面就从 SrtcView 派生并重写 MakeCurrent(GetViewType 返回 SrtcViewType.CallBack)。SrtcView 析构前必须先从所有轨道 RemovePlayView,否则渲染线程可能访问已释放对象。

共享屏幕

屏幕枚举 EnumScreen() 里 Type == 5 是显示器、Type == 0 是窗口。窗口共享把 DeviceId 设为 Hwnd;显示器共享设置 X/Y/Width/Height 矩形。

退出频道

SrtcChannel.Dispose() 之后它交出的所有轨道引用立即作废(远端/自定义轨道在原生侧就被删了)。 退出时先把视图从轨道上摘掉(RemovePlayView),再销毁频道,最后释放视图对象。

订阅与线程

  • 除 Joined(在 Join() 内、调用线程上同步触发)外,其余事件都来自 SDK 内部线程, 界面更新请自行 marshal(WinForms 用 BeginInvoke)到 UI 线程
  • SrtcEngine.Init 内部会让原生在 STA 线程初始化,因此从普通 .NET 线程(默认 MTA)调用也能成功
  • 常用强类型事件参数:SrtcUserStreamEventArgs(Uid / StreamJson)、 SrtcJoinedEventArgs(ChannelJson / MeJson / MembersJson / OptionsJson)、 SrtcCustomMessageEventArgs(Action / SenderId / Name / Message)
更完整的可运行示例见 WinForms Demo(九宫格布局,含设备选择、翻页、IM)。