概述
会议画面分三类,入口各不相同:
本端画面不需要订阅,直接拿轨道渲染即可;远端画面必须先订阅才有数据。
本端画面
SwiftUI
打开摄像头时不要传view,之后直接把轨道交给 SRTCVideoView:
meeting.screenTrack:
SMeeting不是ObservableObject,cameraTrack/screenTrack从nil变成有值不会自己触发 SwiftUI 刷新。请在自己的@Published状态里记一个「摄像头已开」标记,由它驱动视图更新。
UIKit / AppKit
在打开摄像头时把预览视图传进去:
传进来的 view 必须是真实挂在视图层级上的对象。传一个临时创建、没有加入任何父视图的局部变量,会导致渲染链路空转。
远端画面(SwiftUI)
SMeetingRemoteVideoView 是 SwiftUI 场景的推荐入口,它负责整个订阅生命周期:视图出现时按 uid + trackDesc 订阅,视图消失时退订。
trackDesc 换成 .screen:
- 同一个
(uid, trackDesc)在多处渲染时不会互相踢掉订阅 - 布局切换导致视图重建(旧实例消失、新实例出现)时不会产生一次多余的退订 + 重订,画面不会闪断
- 订阅返回与底层媒体到达不是同一时刻,组件会在数据真正到达后自动完成绑定,你不需要做延时或重试
远端画面(UIKit / AppKit)
如果你已经持有一个挂在视图层级上的SRTCVideoRenderer,用这一对便利方法:
stopPlayRemoteVideo 只会移除你传入的这一个渲染视图;只有当这路轨道上已经没有任何渲染视图时,才会真正取消订阅。所以同一路画面在多个窗口里显示时,关掉其中一个不会影响其它窗口。
自行控制订阅
需要把订阅时机和渲染时机分开时(例如先预订阅再决定布局),用核心接口:unsubscribeRemoteVideoTrack 是无条件退订,不看还有没有渲染视图在用。多处渲染同一路画面时,请用 SMeetingRemoteVideoView 或 stopPlayRemoteVideo。
只想查一下某人某路轨道存不存在(不订阅),用:
什么时候该订阅
远端视频是按需订阅的,SDK 不会替你自动订阅所有人。判断依据来自成员状态和事件:MeetingUserInfo.cameraState == .on→ 这个人有摄像头画面MeetingUserInfo.shareState == ShareType.screen.rawValue→ 这个人在共享屏幕- 收到
userCameraStateDidChange、roomShareDidStart/roomShareDidStop时刷新布局
SMeetingRemoteVideoView 时,你只要让视图跟着这些状态出现 / 消失,订阅就自动跟着走了。
服务端合屏画面(MCU)
会议开启了服务端合屏任务时,可以只拉一路合成画面而不是逐个订阅:adminUpdateLayout(_:) 控制,见 录制与合屏布局。