功能说明
本文主要介绍如何在通话过程中动态地开关摄像头及麦克风。
实现方案
方案一:使用 mute/unmute 方法
在通话过程中使用 muteAudio()、unmuteAudio()、muteVideo()、unmuteVideo() 方法开关摄像头及麦克风。
代码示例:
// 关闭音频,远端会收到 'mute-audio' 事件
localStream.muteAudio();
// 打开音频,远端会收到 'unmute-audio' 事件
localStream.unmuteAudio();
// 关闭视频,远端会收到 'mute-video' 事件
localStream.muteVideo();
// 打开视频,远端会收到 'unmute-video' 事件
localStream.unmuteVideo();
- 优点:耗时短,兼容性强。
- 缺点:使用 muteVideo/muteAudio 不会停止设备采集,此时摄像头、麦克风的灯任然是亮着的。
方案二:使用 addTrack/removeTrack 方法
通话过程中使用 addTrack() 和 removeTrack() 开关摄像头。
代码示例:
// 关闭摄像头
const videoTrack = localStream.getVideoTrack();
if (videoTrack) {
await localStream.removeTrack(videoTrack)
// 停止采集,关闭摄像头
videoTrack.stop();
}
// 打开摄像头
const videoStream = TRTC.createStream({ userId, audio: false, video: true });
await videoStream.initialize();
await localStream.addTrack(videoStream.getVideoTrack());
// 关闭麦克风
const audioTrack = localStream.getAudioTrack();
if (audioTrack) {
await localStream.removeTrack(audioTrack);
audioTrack.stop();
}
// 打开麦克风
const audioStream = TRTC.createStream({ audio: true, video:false });
await audioStream.initialize();
await localStream.addTrack(audioStream.getAudioTrack());
- 优点:关闭摄像头、麦克风时,会停止采集,摄像头及麦克风灯不会继续亮着。
- 缺点:开关麦克风方案的兼容性稍差于方案一,可参考:replaceTrack() 中关于兼容性的描述。
注意:
- v4.15.0 之前的版本, removeTrack() 不支持 remove audio track,需使用下述方式实现开关麦克风。
通话过程中使用 replaceTrack() 开关麦克风。
代码示例:
// 关闭麦克风
localStream.muteAudio();
const audioTrack = localStream.getAudioTrack();
if (audioTrack) {
audioTrack.stop();
}
// 打开麦克风,重新采集麦克风并替换 audio track
const stream = TRTC.createStream({ audio: true, video:false });
await stream.initialize();
localStream.unmuteAudio();
await localStream.replaceTrack(stream.getAudioTrack());