Skip to main content

SRTC

只做一件事:把宿主的 Context 交给 SDK。

SRTC.init(context)

UIAbility.onCreate 里调用一次。
不调用不会报错,但摄像头档位查询拿不到 Context,分辨率会退化为”由底层自行吸附档位”, 你在 CameraPreset 里设定的值不再生效。

SRTC.context

返回 undefined 表示没有调用过 init()

SRTCEngine

SDK 主入口。无参构造

属性

SRTCEngine 没有 dispose()。要释放资源就 leaveChannel() 并把注册过的 delegate 逐一 remove

joinChannel(tokenString, options?)

加入频道。
返回Promise<Channel> 抛出tokenExpired / tokenInvalid / alreadyJoined / apiRequestFailed / signalingConnectFailed 可以调用多次加入多个频道,各频道互不干扰。
options.autoSubscribeAudioautoSubscribeVideo 默认都是 false, 入会后不会自动收流。典型现象是”入会成功但听不到、看不到别人”。

leaveChannel()

离开默认频道(最早加入的那个)。

leaveChannelInstance(channel)

离开指定频道。多频道场景用这个。

createLocalMicTrack(preset?)

创建麦克风轨道。不传 preset 用默认参数。
创建 ≠ 采集 ≠ 发布。拿到轨道后还要 startCapture(),要让对端看到 / 听到还要 channel.publishLocalAudioTrack()

createLocalCameraTrack(preset?)

创建摄像头轨道。可选预设:cameraPreset1080p() / cameraPreset720p() / cameraPreset360p() / cameraPreset180p()
LocalCameraTrack 本身是无参构造,预设必须经引擎传入 —— new LocalCameraTrack(preset) 编不过。

createLocalScreenTrack(preset?, audioPreset?)

创建屏幕采集轨道。传了 audioPreset 时会同时采集系统音频,通过 screenTrack.audioTrack 取到那条音频轨。 startCapture() 会弹出系统授权窗,用户同意后才出帧。

enableIm(tokenString) / disableIm()

开启 / 关闭频道 IM 通道。Im 对象上注册 ImDelegate 收消息。
IM 是只收不发的:SDK 提供 onImMessage 回调,但没有发送接口 —— 发消息由业务后端负责。频道内自定义消息(onCustomMessage)同理。

Channel

一次已经完成鉴权和网络连接的 RTC 会话。由 joinChannel 返回,不要自己构造。

属性

delegates强引用,必须成对 add / remove。ArkTS 没有弱引用也没有 deinit, 漏掉会导致监听者永不回收、且离开页面后仍收到回调。

发布

不传 options 时用轨道的 defaultPublishOptions(预设里带的那份)。 抛出trackAlreadyPublished / trackNotPublished / transportNotReady / maxPublishLimitReached
轨道属于引擎而不是频道 —— 同一条采集轨道可以发布给多个频道,采集只做一次。

订阅

uid + trackId 来自 onTrackAdded 回调里的 UserInfoTrackInfo unsubscribeRemoteTrackdebounceMs 用来抑制”快速滑动列表导致的反复订阅/退订”—— 传 0 表示立即退订。
拿到 Track 对象不等于已经有帧。远端轨道是信令先建对象、订阅协商完成后才绑定底层 轨道,渲染时机看 onTrackBindRtcTrackSRTCVideoView 内部已处理)。

Simulcast

switchLayer 主动切到指定层(大流 / 小流)。getSubscribeHit 返回当前实际命中的 轨道 ID —— 服务端可能因带宽自动降级,这个值才是真相。 切换结果通过 onLayerSwitched 回调上报。

远端音频播放控制

这几个只影响本地播放,不改变订阅关系 —— 也就是”关扬声器”而不是”退订”。 带宽照旧消耗,但切回来是瞬时的。

成员

质量

主动查询当前连接质量。做 UI 指示器更建议监听 onConnectionQualityChange, 它已经做过等级判定与抖动抑制。

统计

采集一次本端 WebRTC 统计,返回 RtcStatsSnapshot getConnectionQuality() / onQualityReport 的分工: 所以网宿 CDN 路径上想拿到任何质量数据,只有 getStats() 这一条路;而”我实际编码出来是多少分辨率""编码器是被 CPU 还是被带宽限住了”这类问题服务端根本答不了,也只有这一条路。 logStats() 是排障快捷入口,采集一次并按每行一路流打成日志。
首次调用的码率恒为 0。 码率由两次采集之间的字节差算出,没有上一次快照就没有差分区间。要展示码率就周期性调用,1 秒一次比较合适;排障时连着调两次、看第二次。
上新机型或升级底层库后先跑 rawStatsTypeCounts() 底层 webrtc.d.ts 没有声明 outbound-rtp 等类型的字段,native 侧究竟填了哪些未经约定。类型缺失时上面所有统计读出来都是 undefined而且不报错

离开

一般用 srtc.leaveChannel() / srtc.leaveChannelInstance(channel), 它们会同时维护引擎侧的频道列表。
Channel 上还有 refresh() / leaveWithReason() / onDisconnect / isTrackPublishedInOtherChannel 等成员,那些是 SDK 内部在用的,业务侧不要调。

User

频道成员。由 channel.getUser(uid) 取得。

相关阅读