Skip to main content
关麦和关摄像头在 SDK 里是两套不同的动作,选错了会出现”对端以为你退会了”或者 “摄像头指示灯一直亮”这类问题。

三种”关”的语义


麦克风:用 mute / unmute

不要为了关麦去 unpublish + stopCapture。原因:
  • 用户预期是”我静音了,但还在会里” —— 轨道消失会让对端的成员列表状态错乱
  • 重新发布要走一遍 SDP 协商,开关麦这种高频操作扛不住这个开销
  • mute 在鸿蒙上就是把自己那条音频源的音量设 0,不影响其它轨道
鸿蒙的每条音频轨道都有独立的 AudioSource,所以按轨道静音互不干扰。 这一点和 iOS / macOS 不同 —— 那边所有音频源要先混成一路再发。

摄像头:用 unpublish + stopCapture

为什么摄像头不用 mute
  • 用户预期是”关了摄像头就该真的关” —— 摄像头指示灯必须熄灭,只发黑帧不行
  • 视频轨道留在会里但推黑帧,会白占带宽和对端的渲染格子

只采集、不发布

这是个有用的中间态:本地能看到画面,但不推流。
用途:
  • 入会前的设备自检:不需要服务端就能验证采集和渲染链路
  • 「摄像头预览 + 用户确认后再入会」的交互

换设备或改采集参数:必须重新发布

changeDeviceId()restartCapture() 会换一条底层轨道。已发布的轨道不重新发布, 对端收到的还是旧轨道(表现为换了麦克风但对方听到的没变)。静音状态会自动保留 —— startCapture 内部会回放 isMutedByUser,不用自己记。

远端音频:停播放 ≠ 退订

远端音频还有第三组选择:
channel.isUserAudioMuted(uid)getMutedAudioUids() 用来回读本地静音状态。

相关阅读