SRTCVideoView,所以远端轨道晚到时的重绑逻辑不用写第二遍。
参数
宫格视图传
TrackDesc.cameraSmall、大窗传 cameraBig。
20 个人的宫格全订大流会把下行打满。meeting 必须是普通成员变量
退订是防抖的
组件在aboutToDisappear 里走
unsubscribeRemoteVideoTrack(uid, trackDesc, unsubscribeDebounceMs)。
为什么要防抖:列表滚动、分页切换时同一路画面会在几十毫秒内消失又出现,
立即退订再重订就是一轮轮完整的 SDP 协商。防抖窗口内重新订阅会把待执行的退订取消掉,
所以快速滑动是无感的。
需要更激进或更保守时调 unsubscribeDebounceMs:
- 长列表快速滚动 → 调大(如
800) - 需要尽快省带宽 → 调小
已知限制:同一路画面不能挂两个本组件实例
为什么组件不用「有渲染器就不退订」的守卫版
SDK 里确实有守卫版接口unsubscribeRemoteVideoTrackIfNoRenderers()(靠 RemoteVideoTrack.hasRenderers
引用计数判断)。但本组件没有用它,原因是 ArkUI 的卸载顺序:
父组件的 aboutToDisappear 先于子组件执行。 在本组件的
aboutToDisappear 里调守卫版时,子 SRTCVideoView 还没 removeRenderer,
会永远判成”还有渲染器”而永不退订 —— 那就成了带宽泄漏,比黑屏更糟。
所以现阶段选择了防抖退订这个更保守的方案。
与 SRTCVideoView 的分工
本地预览的写法: