另外还有一个小问题,就是两个部手机进行测试的时候,进行外部 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 流推出去(别人也能听到背景音乐)
相关推荐
byte轻骑兵3 天前
【LE Audio】BASS精讲[6]: SDP适配全流程,BR/EDR下的BASS服务互通
人工智能·实时音视频·le audio·低功耗音频·bass
郭源潮14 天前
从8k嘈杂到16k清晰,我是如何使用RNNoise+libresample构建音频降噪管道的?
c++·音视频·实时音视频
YWamy4 天前
音视频SDK赋能智能硬件:实时RTC技术的应用难点与落地实践
音视频·实时音视频·智能硬件
ZEGO即构6 天前
AI教育重构教与学:RTC+AI如何赋能全学段教学场景?
人工智能·实时音视频·ai教育
metaRTC6 天前
metaRTC8 成功适配 RTOS:开启 MCU/嵌入式实时音视频新时代
单片机·嵌入式硬件·webrtc·实时音视频·rtos
byte轻骑兵9 天前
【LE Audio】BASS精讲[3]: 从服务声明到行为逻辑 解锁广播音频接收核心
音视频·实时音视频·le audio·低功耗音频·蓝牙通话
危桥带雨10 天前
RTC理论知识
stm32·单片机·嵌入式硬件·实时音视频
rit843249911 天前
基于STM32的RTC(实时时钟)程序设计与实现
stm32·嵌入式硬件·实时音视频
nibabaoo15 天前
前端开发攻略---H5页面手机获取摄像头权限回显出画面并且同步到PC页面
javascript·websocket·实时音视频·实时同步·录制
拉拉尼亚18 天前
WebRTC 完全指南:原理、教程与应用场景
前端·typescript·实时音视频