srtcNet 的调用顺序和 C++ 一致,只是换成了惯用的 C# 写法:事件是 event,
轨道返回强类型对象,频道/引擎实现 IDisposable。先分清楚两层对象:
SrtcEngine—— 进程级,一个就够。创建/退出频道、设备枚举、IM、日志上传SrtcChannel—— 一个频道一个对象,成员查询、轨道、推拉流、本地录制都在它上面
初始化 SDK
EnableLog = 0(或传 null)会关掉 SDK 文件日志。初始化失败时 Init 返回 null,
可配合 engine.LastErrorMessage 排查。
注册引擎级事件
SrtcChannel 上。
加入频道
分两步:CreateChannel 只创建对象不入会,配置好之后再 Join()。
和 C++ 一样,事件必须在 Join() 之前订阅 —— Joined 是在 Join() 还没返回时同步触发的。
UserStreamAdded 只覆盖加入之后新发布的轨道。比自己先进频道的人,要在 Joined 的
MembersJson 里遍历其 stream_tracks 主动补订阅。打开摄像头并发布
打开麦克风并发布
播放频道混音(听到所有人)
远端音频用空 uid、空 trackId 取频道级混音,StartPlay 之后即可听到所有人,无需单独订阅:
播放远端视频
窗口渲染用现成的
SrtcHwndView(句柄);要渲染到自己的表面就从 SrtcView 派生并重写
MakeCurrent(GetViewType 返回 SrtcViewType.CallBack)。SrtcView 析构前必须先从所有轨道
RemovePlayView,否则渲染线程可能访问已释放对象。共享屏幕
EnumScreen() 里 Type == 5 是显示器、Type == 0 是窗口。窗口共享把 DeviceId
设为 Hwnd;显示器共享设置 X/Y/Width/Height 矩形。
退出频道
订阅与线程
- 除
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)