SRTCEngine 可以同时加入多个频道。多次 joinChannel 各返回独立的 Channel
句柄,发布 / 订阅 / 成员 / 事件 / 离会都在各自的频道上进行,互不干扰。
alreadyJoined。
轨道属于引擎,不属于频道
这是多频道最重要的一条:同一条采集轨道可以发布给多个频道,采集只做一次。SDK 内部有”某本地轨是否仍被其它存活频道发布着”的判定,所以某个频道离会时不会误关
还在别处使用的采集轨。业务侧只要保证自己
stopCapture 的时机正确即可。音频没有跨频道约束
这是 HarmonyOS 与 iOS / macOS 的一处实质差别,别照那边的经验推。iOS / macOS 上所有音频源必须先混成一路再发(那边的 WebRTC 音频源不提供推流接口、
整个进程只有一个音频输入口),代价是麦克风、自定义音频、屏幕音频三者共用一路发送,
多频道时还会互相串音 —— 所以那边有”各频道的音频源集合必须相同”这条硬约束。鸿蒙这边每条音频轨道有独立的
AudioSource,各自带音量控制,所以:- 按轨道静音就是把自己的源音量设 0,不影响别的轨道
- 多频道各发各的,不存在共用一份混音导致的跨频道泄漏
- 对端看到几路音频就是几路,语义直白
默认频道的顺延规则
srtc.leaveChannel() 的无参版本作用于默认频道 —— 最早加入且仍存活的那个。
它离会后,默认频道顺延到下一个。
事件要按频道区分
所有ChannelDelegate 回调的第一个参数都是 channel,多频道时必须用它区分来源:
remove。
状态与 UI 的组织
多频道下最容易出问题的是状态管理。几条经验:- 每个
Channel一份独立的 UI 状态(成员列表、画面列表),不要合并成一个大列表 - 用
channel.token.channel(频道名)或自己维护的 key 做索引 - 渲染多路画面时
ForEach的 key 要同时包含频道标识和 trackId, 否则两个频道里同名 trackId 会撞