跳转到主要内容
事件都以可选方法的接口形式提供,只实现关心的那几个即可:
delegates 是强引用,必须成对 add / remove。ArkTS 既没有弱引用、也没有 deinit。注册后不摘除会导致监听者永不回收, 而且离开页面后仍然收到回调。通常在 aboutToAppear / aboutToDisappear 里配对:

ChannelDelegate

频道级事件。第一个参数恒为 channel,下表省略。

连接状态

onReconnecting / onReconnected 之间 SDK 会自行恢复发布与订阅,业务侧一般只需要 更新 UI 上的连接指示。收到 onDisconnected 才需要走「退出会议」的业务流程。
心跳失败何时触发 onDisconnected(1.1.0 起): 只有后端返回业务错误(Token 失效、被踢等,SRTCError.isServerError(error) 为 true)才退出频道,reason 为 error、error 带后端码;网络抖动或响应解码失败(108006 / 108011)不再退会,等下一次心跳重试。1.0.1 及以前一次心跳网络失败就会触发 onDisconnected。IM 心跳与 onImDisconnected 同理。
onMediaStateChange 与上面几个不是同一条线。onReconnecting / onReconnected 说的是信令面(MQTT),onMediaStateChange 说的是画面和声音还在不在。两者各自独立地断开与恢复。UI 上的「网络异常」提示应当同时接这两条线:只接信令那条会出现”提示已经消失、画面还是黑的”;只接媒体这条会漏掉成员列表已经不再更新。参数 reason 只用于日志,不要拿它做分支判断。收到 disconnected 表示 SDK 已放弃重连、不会再自行恢复。状态取值见 MediaConnectionState。

成员

媒体轨道

onTrackAdded 只表示「可以订阅了」,不会自动订阅(除非入会时开了 autoSubscribeAudio / autoSubscribeVideo)。要看到画面还需要显式调用 channel.subscribeRemoteVideoTrack(uid, trackId)。
onReceiveStreamStatusChange(1.2.0 起):订阅后约 3 秒收不到该路视频帧报一次 timedOut = true,帧恢复后报一次 false;首帧到达时会先收到一次 false,可据此关掉初始 loading。按轨道判定,用来开关某一格画面上的「加载中 / 对方网络异常」指示,覆盖所有已订阅的远端视频(含 MCU 合成轨,uid 为 __mcu__)。判定纯在本端,两条引擎都触发。
只报跳变:已出过帧的轨道退订后再订阅,不会再报一次恢复。初始状态请按 RemoteVideoTrack.isReceiveTimedOut 现判。不要用 onConnectionQualityChange 代替——那是整条链路的档位,单路画面停了档位也可能是 excellent。

频道与消息

质量与 Simulcast

做 UI 指示器请用 onConnectionQualityChange(已经做过等级判定与抖动抑制), onQualityReport 是原始采样,适合上报到自己的监控系统。 细节见通话质量。

TrackDelegate

轨道级事件。第一个参数恒为 track。
onTrackBindRtcTrack 是渲染的关键时机:远端轨道是信令先建对象、订阅协商完成后才绑定 底层轨道,所以拿到 Track 对象不等于已经有帧。SRTCVideoView 内部已经监听了它并 自动补挂,自己接渲染层时需要处理这一点。

DeviceManagerDelegate

设备热插拔。注册在 DeviceManager.shared.delegates 上。

AudioRouteSessionDelegate

音频路由与通话状态。注册在 AudioRouteSession.shared.delegates 上。
外接设备由系统接管,SDK 只上报不主动切换 —— 收到 onAudioRouteChange 时更新 UI 即可, 不要试图在回调里再切回去,那会和系统抢。见音频路由。

ImDelegate

频道 IM。srtc.enableIm(tokenString) 之后注册在返回的 Im 对象上。 第一个参数恒为 im。

相关阅读