另外还有一个小问题,就是两个部手机进行测试的时候,进行外部 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 流推出去(别人也能听到背景音乐)
相关推荐
DogDaoDao3 小时前
AV1 帧内预测核心文件 reconintra.c 源码深度解析
音视频·实时音视频·视频编解码·av1·libaom·帧内预测·reconintra.c
hz567891 天前
2026主流RTC音视频SDK选型全解析:性能对比+避坑指南+国产化适配深度横评
云计算·音视频·实时音视频·信息与通信
是个红桃1 天前
团队小、预算少,会议软件怎么挑?
人工智能·语音识别·实时音视频·视频
Multipath7121 天前
与辉同行山东行看大型户外活动的通信保障
网络·5g·安全·无人机·实时音视频
chenying9981791 天前
本地部署 TTS 方案横向对比:Fish Speech、CosyVoice 2、GPT-SoVITS 与 VoxFlash-TTS
人工智能·实时音视频·语音合成·tts
崇山峻岭之间1 天前
单片机RTC实验
单片机·嵌入式硬件·实时音视频
做萤石二次开发的哈哈2 天前
ERTC-产品介绍-应用场景
音视频·实时音视频
Multipath7122 天前
多链路聚合路由与宽带自组网、卫星便携站结合的传输应用
网络·5g·安全·无人机·实时音视频
做萤石二次开发的哈哈2 天前
ERTC产品文档
音视频·实时音视频
weixin_452600692 天前
D1307-RTC时钟芯片简介
机器人·无人机·实时音视频·摄像头·充电桩·电动工具·光伏逆变器