另外还有一个小问题,就是两个部手机进行测试的时候,进行外部 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 流推出去(别人也能听到背景音乐)
相关推荐
u152109648492 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
国产化创客2 天前
ESP32 CameraWebServer 原生摄像头项目全解析
物联网·开源·嵌入式·实时音视频·智能硬件
u152109648493 天前
S.S.Audio PRO A202 音频隔离器
音视频·实时音视频·视频编解码·视频·被复线
hz567893 天前
基于音视频 PaaS 的实时音视频解决方案:技术架构与落地实践
安全·架构·音视频·实时音视频·信息与通信·paas
DogDaoDao5 天前
AV1 解码器核心:decodeframe.c文件深度剖析
音视频·实时音视频·视频编解码·av1·解码器·decode·vp9
做萤石二次开发的哈哈6 天前
AI 陪护机器人硬件如何接入萤石ERTC 实现实时通话?
人工智能·音视频·实时音视频·萤石开放平台
Multipath7126 天前
急救车上的“信号堡垒”:多链路聚合路由如何让生命连线永不掉线
网络·5g·安全·实时音视频
Zyed7 天前
[STM32]Day12读写备份寄存器+RTC
stm32·单片机·实时音视频
hz567897 天前
国产化视频会议系统怎么做?鲲鹏+麒麟+国密的完整国产化路径
音视频·实时音视频·信息与通信
weixin_408318049 天前
医疗器械企业学术营销直播指南:设备演示+手术示教+线上培训三场景实战方案
实时音视频