另外还有一个小问题,就是两个部手机进行测试的时候,进行外部 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 流推出去(别人也能听到背景音乐)
相关推荐
REDcker8 小时前
远程实时操控技术详解
音视频·实时音视频·数据采集·遥控·遥操作·数据闭环·远程操控
阿拉斯攀登15 小时前
RTSP 拉流与录制:IPC 摄像头本地录像完整方案
ffmpeg·音视频·webrtc·实时音视频·视频编解码
阿拉斯攀登1 天前
数据通道:RTCDataChannel 可靠与不可靠传输
音视频·webrtc·实时音视频·媒体·视频编解码
VidDown1 天前
在线视频下载器技术解析:原理、工具与合规实践
网络·音视频·实时音视频·视频编解码·视频下载
REDcker1 天前
腾讯TRRO SDK深度剖析
音视频·webrtc·实时音视频·直播·rtc·腾讯
阿拉斯攀登2 天前
FFmpeg 转码详解:封装格式、编码器、码率控制
ffmpeg·音视频·webrtc·实时音视频·视频编解码
阿拉斯攀登2 天前
媒体流与轨道:MediaStream 与 MediaStreamTrack
嵌入式硬件·webrtc·实时音视频·媒体·视频编解码
阿拉斯攀登3 天前
音视频采集:getUserMedia 与设备管理
音视频·webrtc·实时音视频·视频编解码
FlightYe4 天前
FFmpeg移动端硬解机制
linux·网络·ffmpeg·音视频·实时音视频·视频编解码
想你依然心痛4 天前
休眠唤醒策略设计:事件驱动 vs 周期性轮询——中断唤醒、RTC定时
实时音视频