另外还有一个小问题,就是两个部手机进行测试的时候,进行外部 RTC 通话的时候。我使用 QQ 音乐播放背景音乐,但是背景音乐没有加上。有冲突

你这个问题非常典型: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 端修改

必须给 AVAudioSessionmixWithOthers,否则系统直接停音乐。

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], 混音流);

三、你现在测试(两部手机)最快修复步骤

  1. 先在通话 App 里改音频模式
    • Android:不要用 VOICE_CALL / 通话流 ,改用 MUSIC 流
    • iOS:必须加 mixWithOthers
  2. 不要用外部 QQ 音乐 (系统会冲突)
    • 测试阶段:把音乐放进你的 App 内播放(内嵌音频)
  3. 通话时:
    • 能听到对方声音
    • 同时能听到 内嵌背景音乐
    • 外部 QQ 音乐 才有可能不被完全杀死(要看系统 / 厂商)

四、一句话总结

  • 外部音乐(QQ 音乐)+ RTC 通话 → 系统级冲突,很难 100% 保证都有声音(尤其小米、华为、iOS)
  • 正确方案
    • 背景音乐由你的 App 自己播放
    • RTC 音频配置为「允许混音 / 非独占」
    • 再把音乐 混进 RTC 流推出去(别人也能听到背景音乐)
相关推荐
海水冷却4 天前
2026年实时音视频服务计费模式指南
实时音视频
番茄灭世神6 天前
PN学堂GD32教程第8篇——RTC
实时音视频
runner365.git6 天前
RTC实现VoiceAgent(二)
大模型·webrtc·实时音视频·voiceagent
xuxie996 天前
N18 RTC
单片机·嵌入式硬件·实时音视频
runner365.git7 天前
RTC会议实时翻译系统
实时音视频
runner365.git7 天前
如何使用RTCPilot配置一个集群RTC服务
webrtc·实时音视频·音视频开发
深念Y8 天前
从WebSocket到WebRTC,豆包级实时语音交互背后的技术演进
websocket·网络协议·实时互动·webrtc·语音识别·实时音视频
海水冷却11 天前
2026 主流 RTC SDK 选型参考,7 大维度横向对比
实时音视频·rtc
TEL1892462247712 天前
IT6636/IT66362(3进1出 / 2进1出 HDMI 2.1 48Gbps Retiming Switch,内置 MCU)
音视频·实时音视频·视频编解码