三种”关”的语义
麦克风:用 mute / unmute
unpublish + stopCapture。原因:
- 用户预期是”我静音了,但还在会里” —— 轨道消失会让对端的成员列表状态错乱
- 重新发布要走一遍 SDP 协商,开关麦这种高频操作扛不住这个开销
mute在鸿蒙上就是把自己那条音频源的音量设 0,不影响其它轨道
鸿蒙的每条音频轨道都有独立的
AudioSource,所以按轨道静音互不干扰。
这一点和 iOS / macOS 不同 —— 那边所有音频源要先混成一路再发。摄像头:用 unpublish + stopCapture
mute:
- 用户预期是”关了摄像头就该真的关” —— 摄像头指示灯必须熄灭,只发黑帧不行
- 视频轨道留在会里但推黑帧,会白占带宽和对端的渲染格子
只采集、不发布
这是个有用的中间态:本地能看到画面,但不推流。- 入会前的设备自检:不需要服务端就能验证采集和渲染链路
- 「摄像头预览 + 用户确认后再入会」的交互
换设备或改采集参数:必须重新发布
远端音频:停播放 ≠ 退订
对远端音频还有第三组选择:channel.isUserAudioMuted(uid) 和 getMutedAudioUids() 用来回读本地静音状态。