Skip to main content

继承关系

本地轨道由 SRTCEngine.createLocalXxxTrack() 创建,远端轨道由 SDK 在收到信令后创建、 经 channel.getRemoteTrack() 取得。两边都不要自己 new

Track(基类)

delegates强引用,必须成对 add / remove
getRtcTrack() / setRtcTrack() / updateInfo() / updatePartialInfo() 是 SDK 内部接口,业务侧不要调。

LocalTrack

所有本地轨道的共同部分。

LocalAudioTrack

抛出captureError(权限未授予、设备被占用等)
changeDeviceId / restartCapture 会换一条底层轨道。已发布的轨道需要重新发布,正确顺序是:
静音状态会自动保留 —— startCapture 内部会回放 isMutedByUser

子类


LocalVideoTrack

captureWidth / captureHeight 与你设定的值可能不同:采集分辨率受设备档位限制, 底层会吸附到最近的档位。要看实际值就读这两个字段。
SRTCVideoView 渲染时不需要自己碰 addRenderer —— 组件内部已经处理。

LocalCameraTrack

变焦

zoomRange() 返回的是”现在这一刻能不能变焦”,不是”这台设备支不支持变焦”。变焦范围与变焦设置都挂在系统的 CaptureSession 上,而该 session 只有在真的有人在消费视频帧时才处于 active 状态。同一台设备、同一条轨道的真机实测:因此:
  • 变焦要在轨道发布之后(或已挂上渲染之后)调,光 startCapture() 不够;
  • UI 上不要用 supported 决定变焦控件的显示与否 —— 在”开了摄像头但还没发布”这个很常见的中间态里它是 false,控件会莫名消失。
setZoom() 在不支持或超范围时不抛错:相机变焦是连续调节,手势滑到端点是常态,抛错会让调用方每次都得自己判边界。超范围的值会被夹到范围内。排障看 hdc shell hilog -x | grep -a SetZoomRatio,native 侧三种结果各有日志:clamped=(已生效)、ignored: zoom not supported by deviceignored: capture session not active

LocalScreenTrack

详见屏幕共享

RemoteAudioTrack

stopPlay() 只停本地播放,不退订 —— 带宽照旧消耗,但切回来是瞬时的。 要真正省带宽得用 channel.unsubscribeRemoteTrack()按用户维度控制播放更方便的做法是 channel.setUserAudioPlayback(uid, enabled)

RemoteAudioMixTrack

云端混音轨道。SeaStart 引擎在服务端把多路音频混成一路下发,客户端只订阅这一条, 省掉 N 路解码。 轨道 iddesc 固定是 audio_mix,与其它端一致 —— 服务端按这个字符串识别混音轨。

RemoteVideoTrack

SRTCVideoView 时不需要自己管:

渲染层

SRTCVideoView

ArkUI 自定义组件。参数: 另有 ScalingMode 控制填充方式。
track 必须是普通成员变量,不能声明成 @PropArkTS 的 @Prop 对复杂类型做深拷贝,且拷贝过程中除基本类型 / Map / Set / Date / Array 之外会丢失类型 —— Track 拷过来会变成一个没有方法的普通对象, 结果是画面黑屏、事件也永远收不到。@Link / @ObjectLink 能引用传递,但要求父组件为每一路画面单独持有一个 @State, 多路远端画面写不出来。所以轨道走普通成员变量按引用传入,换轨道靠组件重建 —— 让 if 分支或 ForEach 的 key 带上 trackId。
surface 与轨道的生命周期不同步,两个方向都要考虑:
  1. surface 比轨道晚到:远端轨道是信令先建对象、订阅协商完成后才绑底层轨道; 本地轨道则可能在组件挂载前就采集好了。
  2. surface 会重建:切后台、旋屏都会走一遍 destroy → create。
组件内部已经处理了这两种情况(挂载时主动挂一次 + 监听 onTrackBindRtcTrack 补挂), 但前提是保持同一个组件实例 —— 不要每次 build 都换 key。

SRTCVideoRenderer / VideoRendererRegistry

需要自己接渲染(画到自定义画布、做录制等)时用这一层。VideoRendererRegistry 维护 trackKey → 渲染器的映射,SRTCVideoView 内部走的也是它。 绝大多数业务不需要碰这层。

相关阅读