跳转到主要内容

继承关系

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

Track(基类)

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

LocalTrack

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

LocalAudioTrack

抛出(startCapture / restartCapture / changeDeviceId):
  • micPermissionDenied(108251):麦克风未授权。采集前只读预检,SDK 不弹授权框,权限由宿主申请
  • deviceNotFound(108021):没有麦克风,或指定的 deviceId 不在枚举结果里
  • captureError(108018):其它采集失败(设备被占用等)
以上 1.1.0 起都是 SRTCError,系统原码在 systemCode、原异常在 cause;1.0.1 及以前会直接抛系统异常。
changeDeviceId / restartCapture 会换一条底层轨道。已发布的轨道需要重新发布,正确顺序是:
静音状态会自动保留 —— startCapture 内部会回放 isMutedByUser。

子类


LocalVideoTrack

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

LocalCameraTrack

抛出(startCapture / restartCapture):cameraPermissionDenied(108231,摄像头未授权,采集前只读预检、不弹授权框)/ deviceNotFound(108021)/ captureError(108018)。规则同 LocalAudioTrack,1.1.0 起。

变焦

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

LocalScreenTrack

抛出(startCapture / restartCapture):screenShareDenied(108039,系统授权未通过)/ captureError(108018),1.1.0 起;系统原码在 systemCode。用户点「取消」时实际落到哪个码尚待确认。 系统侧结束共享(1.2.0 起):用户点状态栏录屏胶囊等系统入口结束共享时,SDK 会自己走一遍 stopCapture() 并触发 TrackDelegate.onTrackEnd。SDK 只停采集,撤发布和通知其他人由业务层在 onTrackEnd 里做。 详见屏幕共享。

RemoteAudioTrack

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

RemoteAudioMixTrack

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

RemoteVideoTrack

用 SRTCVideoView 时不需要自己管:
onReceiveStreamStatusChange 只报跳变:已出过帧的轨道退订后再订阅,不会再报一次「恢复」。所以画面上的初始加载指示要按 isReceiveTimedOut 现判,后续变化再跟事件走。

RemoteVideoMcuTrack

1.2.0 起
频道级 MCU 合成视频轨道,继承 RemoteVideoTrack,由 channel.subscribeRemoteVideoMcuTrack() 返回,不要自己构造。 渲染、收流状态与普通远端视频一致,见 Channel 接口「MCU 合成画面」一节。

渲染层

SRTCVideoView

ArkUI 自定义组件。参数: 另有 ScalingMode 控制填充方式。
track 必须是普通成员变量,不能声明成 @Prop。ArkTS 的 @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 内部走的也是它。 绝大多数业务不需要碰这层。

相关阅读