你这个问题非常典型:WebRTC 通话时,QQ 音乐 / 后台音乐被静音、加不进去 → 本质是「音频焦点 / 音频会话」冲突,系统强制把背景音乐停了。
一、为什么会冲突(一句话原理)
- Android :WebRTC 通话会申请 VOICE_COMMUNICATION / 通话类音频焦点(独占),系统会暂停所有后台音乐(QQ 音乐、网易云等)。
- iOS :WebRTC 用
AVAudioSessionCategoryPlayAndRecord+VoiceChat模式,默认不允许混音,直接中断背景音乐。
结果:只有 RTC 通话声音,没有背景音乐。
二、解决方案(Android + iOS 双端)
你要的是:RTC 通话声音清晰 + 背景音乐同时播放(可压低 / 可正常)
1)Android 端修改(最关键)
WebRTC 初始化时,不要用默认的独占音频焦点,改成「允许混音 / 闪避」。
如果你用的是 libwebrtc / Mediasoup Client / SRS 客户端,要改音频流类型和焦点请求:
java
运行
// 1. 把音频流从 VOICE_COMMUNICATION 改成 支持混音的模式
// 原来(会抢焦点、停音乐)
// WebRTC 音频默认:AudioManager.STREAM_VOICE_CALL
// 改成(允许后台音乐播放)
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 2. 请求焦点时用 DUCK(压低其他声音)而不是完全暂停
int focusRequestResult = audioManager.requestAudioFocus(
focusChangeListener,
// 用 MUSIC 或 允许混音的通话类型
AudioManager.STREAM_MUSIC, // 关键:不要用 STREAM_VOICE_CALL
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK // 允许其他App duck
);
WebRTC 层配置(Java)
java
运行
// 让 WebRTC 使用 STREAM_MUSIC 而非通话流
PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
options.audioDeviceModule.setAudioStreamType(AudioManager.STREAM_MUSIC);
SRS / Mediasoup Client 常见设置
- 找到:
AudioOptions/AudioTrack - 把
usage/streamType设为 USAGE_MEDIA / STREAM_MUSIC - 禁用「独占音频焦点」
2)iOS 端修改
必须给 AVAudioSession 加 mixWithOthers,否则系统直接停音乐。
objc
// 通话开始前配置
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error = nil;
// 关键:PlayAndRecord + mixWithOthers + duckOthers
[session setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionMixWithOthers |
AVAudioSessionCategoryOptionDuckOthers |
AVAudioSessionCategoryOptionAllowBluetooth
error:&error];
[session setActive:YES error:&error];
mixWithOthers:允许和其他 App 混音(QQ 音乐能响)duckOthers:通话时自动压低背景音乐(可选,更清晰)
WebRTC for iOS
- 找到
RTCAudioSession - 禁用它默认的「独占会话」配置
- 自己手动设置
Category+Options
3)如果你是 Web/H5 页面(Vue + WebRTC)
浏览器里 无法直接混音后台 App 音乐(安全限制)。要加背景音乐必须:
- 把音乐放在你的网页内播放(用 `` 或 Web Audio)
- 不要用外部 QQ 音乐
- 再把 音乐轨道混进 WebRTC 发送的流里(推流带背景音乐)
javascript
运行
// 简单示例:把背景音乐混入本地流
const audioContext = new AudioContext();
const mediaStreamSource = audioContext.createMediaStreamSource(本地流);
const musicSource = audioContext.createMediaElementSource(audio音乐元素);
const destination = audioContext.createMediaStreamDestination();
mediaStreamSource.connect(destination);
musicSource.connect(destination);
// 混音后的流用于 WebRTC 发送
const 混音流 = destination.stream;
peerConnection.addTrack(混音流.getAudioTracks()[0], 混音流);
三、你现在测试(两部手机)最快修复步骤
- 先在通话 App 里改音频模式
- Android:不要用 VOICE_CALL / 通话流 ,改用 MUSIC 流
- iOS:必须加 mixWithOthers
- 不要用外部 QQ 音乐 (系统会冲突)
- 测试阶段:把音乐放进你的 App 内播放(内嵌音频)
- 通话时:
- 能听到对方声音
- 同时能听到 内嵌背景音乐
- 外部 QQ 音乐 才有可能不被完全杀死(要看系统 / 厂商)
四、一句话总结
- 外部音乐(QQ 音乐)+ RTC 通话 → 系统级冲突,很难 100% 保证都有声音(尤其小米、华为、iOS)
- 正确方案 :
- 背景音乐由你的 App 自己播放
- RTC 音频配置为「允许混音 / 非独占」
- 再把音乐 混进 RTC 流推出去(别人也能听到背景音乐)