SRTC
进程级的全局配置入口:把宿主的 Context 交给 SDK,以及设置 SDK 语言(1.1.0 起)。
SRTC.init(context)
在
UIAbility.onCreate 里调用一次。
SRTC.context
undefined 表示没有调用过 init()。
SRTC.setLanguage(lang?)
1.1.0 起
影响两件事:
- 请求后端时的
Accept-Language头 —— 后端业务错误(码 ≥ 1000)的文案随之返回中 / 英 audioRouteName/audioRouteTargetName/audioCallStateName的显示名:语言以zh开头出中文,其余一律英文
SRTCError.detail 一律英文,见错误码。进程级全局设置,随时可改,下次请求 / 下次取显示名时生效;SMeeting 鸿蒙版读的也是这一个值。
缺省取的是系统语言。宿主用
setAppPreferredLanguage 单独设置的应用语言暂不跟随,需要与应用内语言一致时请显式调用 SRTC.setLanguage。SRTC.language
1.1.0 起
setLanguage() 设置的值 > 系统语言 > 'zh'。
SRTCEngine
SDK 主入口。无参构造。
属性
SRTCEngine 没有 dispose()。要释放资源就 leaveChannel() 并把注册过的
delegate 逐一 remove。joinChannel(tokenString, options?)
加入频道。
返回:
Promise<Channel>
抛出:tokenExpired / tokenInvalid / alreadyJoined / apiRequestFailed /
signalingConnectFailed / peerConnectionFailed
apiRequestFailed 的 code 为后端业务码、108006(网络 / HTTP 失败,见 httpStatus)或 108011(响应解码失败),见错误码。
可以调用多次加入多个频道,各频道互不干扰。
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 对象上注册 ImDelegate 收消息。
重复调用 enableIm 抛 alreadyJoined(108005;1.0.1 及以前是 invalidState)。
IM 是只收不发的:SDK 提供
onImMessage 回调,但没有发送接口 ——
发消息由业务后端负责。频道内自定义消息(onCustomMessage)同理。Channel
一次已经完成鉴权和网络连接的 RTC 会话。由 joinChannel 返回,不要自己构造。
属性
发布
options 时用轨道的 defaultPublishOptions(预设里带的那份)。
抛出:trackAlreadyPublished / trackNotPublished / transportNotReady /
maxPublishLimitReached,以及 1.1.0 起:
轨道属于引擎而不是频道 —— 同一条采集轨道可以发布给多个频道,采集只做一次。
订阅
uid + trackId 来自 onTrackAdded 回调里的 UserInfo 与 TrackInfo。
抛出(订阅):userNotFound(108204,频道内没有该 uid)/ trackNotFound(108003)/
invalidArgument(108031,轨道类型与方法不符)/ transportNotReady(108014,重连中)/
subscribeFailed(108301,SeaStart 引擎未连接 / 已断开)。其中 108204 / 108031 / 108301 为 1.1.0 起;此前 uid 不存在报 108003。
unsubscribeRemoteTrack 的 debounceMs 用来抑制”快速滑动列表导致的反复订阅/退订”——
传 0 表示立即退订。
拿到
Track 对象不等于已经有帧。远端轨道是信令先建对象、订阅协商完成后才绑定底层
轨道,渲染时机看 onTrackBindRtcTrack(SRTCVideoView 内部已处理)。MCU 合成画面
1.2.0 起
__mcu__ 发布,不在成员列表里,所以不能走 subscribeRemoteVideoTrack(uid, trackId),要用这一组按保留标识直接订阅。保留标识与 Swift / C / Python SDK 一致。
- 需要服务端先开启合成任务(服务端 API
mcu/start)。任务没起来时 SFU 回 not found,SDK 会重试几秒;任务起来得更晚,请在收到合成任务进入运行状态后再调一次——这个时机由业务决定,SDK 不监听合成任务状态。 - 重复调用返回同一个轨道对象;订阅失败时对象仍保留在
remoteVideoMcuTrack上,可直接再调一次重试。 - 收流状态同样经
onReceiveStreamStatusChange上报,uid为RemoteVideoMcuTrack.publisherUid。 - SeaStart 与网宿两条引擎都支持。
Simulcast
switchLayer 主动切到指定层(大流 / 小流)。getSubscribeHit 返回当前实际命中的
轨道 ID —— 服务端可能因带宽自动降级,这个值才是真相。
切换结果通过 onLayerSwitched 回调上报。
远端音频播放控制
成员
质量
onConnectionQualityChange,
它已经做过等级判定与抖动抑制。
本端采集电平
1.2.0 起
onActiveSpeakersChange 只含远端,自己的音量要用它读。
- 读的是送进编码器之前的电平:
mute()后归零,与对端听到的一致。 - 未发布的轨道没有发送统计,返回
undefined。 - 每次调用是一次
getStats,轮询频率别超过 10Hz(建议 5~10Hz),平滑与映射由业务层做。
统计
RtcStatsSnapshot。
与 getConnectionQuality() / onQualityReport 的分工:
所以网宿 CDN 路径上想拿到任何质量数据,只有
getStats() 这一条路;而”我实际编码出来是多少分辨率""编码器是被 CPU 还是被带宽限住了”这类问题服务端根本答不了,也只有这一条路。
logStats() 是排障快捷入口,采集一次并按每行一路流打成日志。
上新机型或升级底层库后先跑
rawStatsTypeCounts()。 底层 webrtc.d.ts 没有声明 outbound-rtp 等类型的字段,native 侧究竟填了哪些未经约定。类型缺失时上面所有统计读出来都是 undefined,而且不报错。离开
srtc.leaveChannel() / srtc.leaveChannelInstance(channel),
它们会同时维护引擎侧的频道列表。
Channel 上还有 refresh() / leaveWithReason() / onDisconnect /
isTrackPublishedInOtherChannel 等成员,那些是 SDK 内部在用的,业务侧不要调。User
频道成员。由 channel.getUser(uid) 取得。