iOS 与第三方声音播放交互声音小(无声)问题梳理

由于 iOS 的某些系统行为,可能会导致某些场景下出现第三方声音播放与语音通话声音小的问题,此贴将对过往的案例进行总结和梳理,并分享对应案例的解决方案。


AVAudioSession 相关资料参考:https://www.jianshu.com/p/3e0a399380df

joinChannel 后,AVPlayer 播放声音变小。

情形1:

joinChannel 后,AVPlayer 播放声音变小

原因:

AVPlayer 默认使用的 audio session 是 AVAudioSessionCategoryPlayback ,加入频道,AE 引擎重启,并把 Category 设置为 AVAudioSessionCategoryPlayAndRecord(自带回声消除等信号处理的模式),这样就会导致 AVPlayer 的声音变小。

解法:

自 v2.2 及之后版本,在调用 joinChannel API 前,调用以下接口(每次调用 joinChannel 前,都需要设置一下这个参数),确保离开频道时不会把 AVPlayer 给停掉:

[self.agoraKit setParameters: @ "{\"che.audio.keep.audiosession\": true}" ];

如果设置之后,还是觉得声音太小,可以在 AVPlayer 出声音后 ,立即调用以下两个接口:

agoraKit.setEnableSpeakerphone(false)
agoraKit.setEnableSpeakerphone(true)

情形2:

joinChannel 后,用 webview 加载 http://music.baidu.com",然后发现音乐声很小。

原因:

同情形1。

解法:

同情形1。

joinChannel 后,后台播放 QQ、网易云音乐等声音停止。

解法:

自 v2.2 及之后版本,如果需要这种应用场景(在使用 Agora SDK 语音通话的同时播放 QQ 或网易云等第三方平台的音乐),需要设置以下 API:

  1. setAudioProfile 设置使用 AgoraAudioScenarioGameStreaming 模式;
  2. 在初始化成功后,joinChannel 前,调用:
    setParameters( "{\"che.audio.mixable.option\":true}" )

Note: 在这种使用场景下,第三方的音乐会传到对端,因为 SDK 无法获取它的信号做回声消除。

joinChannel 后,ffmepg,ffplay 等播放 rtmp 流声音小

情形:

先用播放器播放 rtmp 流,再 joinChannel,此时播放器声音会变小。

原因:

因为播放器走的是媒体音量,sdk 连麦走的是通话音量。

解法:

在加入频道成功后,判断外放的情况后,调用以下接口:
[self.agoraKit setEnableSpeakerphone:YES];

游戏前后台切换时,外放声音小

情形:

前后台切换外放声音小。

原因:

在 App 切换前后台的过程中,如果去主动 Active AVAudioSession,改变 Category,则可能会导致这个问题。

解法:

iOS 在切换到后台时,系统会自己设置 AVAudioSessionCategory。App 不需要主动设置。

加入语音频道,用户自己做的播放器(使用 AuGraph、AudioUnit 播放声音)声音小

情形:

使用 ijkplayer 播放从 rtmp 流中获取的音频。其中,ijkplayer 播放音频使用 AudioQueues,使用的 category 不是 playAndRecord.

原因:

ijkplayer 播放音频使用的 category 是 playback,当声网 SDK 引擎启动时发现 category 不是 playAndRecord 时,会重启引擎。

解法:

将 ijkplayer 播放音频时使用的 category 改为 playAndRecord

iOS Demo 在某个手机上声音小

情形:

语音通话 demo,外放音量小。

原因:

  1. 手机硬件问题。
  2. 用户没有分清声音是走了听筒还是外放。

解法:

  1. 找几个硬件型号和系统型号一致的手机,用同样的 Demo 做一下对比。如果都有问题,说明极有可能是硬件问题。
  2. 通信模式下的纯音频场景是默认走听筒的。 可以在 joinChannel 前设置:
    setDefaultAudioRouteToSpeakerphone:YES

leavechannel 后 App 背景声音小、无声

情形:

游戏和直播中有非 SDK 播放的音效,离开频道后音效声音变小/无声。

原因:

游戏和直播中有非 SDK 播放的音效,一般起始是走的媒体音量,SDK 连麦后走的是通话音量。
leavechannel 后一般 AVaudioSession 会被 deactive,切回通话音量系统,但是 AVaudioSession 的category 等并没有改回原来的值。

解法:

  1. leaveChannel 成功的回调里,把 AVAudioSession 的 category 和 mode 设置成 joinChannel 之前的值。
  2. joinChannel 前设置如下接口:
    setParameters("{\"che.audio.keep.audiosession\":true}")

游戏 H5 页面,加入频道后声音变小

情形:

游戏 H5 页面,声音用 layabox 自带的引擎播放 WebAudio 或 H5Audio,但是只要加入 Agora 频道,游戏里面的声音就基本小的听不见了。只有 iOS 存在这个问题,Android 正常。

原因:

WKWebView 加载的 H5 是另外一个进程通过 AVAudioSession 去播放声音的,不是通过 SDK 播放的。

解法:

  1. 调用如下接口:
[self.agoraKit setAudioProfile(AUDIO_PROFILE_DEFAULT, AUDIO_SCENARIO_GAME_STREAMING)];
[self.agoraKit setParameters: @"{\"che.audio.enable.aec\": true}"];
  1. 如果有回声问题,是无法规避的,因为 H5 的声音不是通过 SDK 播放的,所以 SDK 这边无法做回声消除。

频道内 AudioServicesPlaySystemSound 声音音量小

情形:

AudioServicesPlaySystemSound 在 playAndRecord & ModeDefault 下,基本无声。

在 chatRoom scenario 下,其音量基本正常。

原因:

系统行为。

解法:

在 App call AudioServicesPlaySystemSound 前,调用以下代码:

AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord) 
AVAudioSession.sharedInstance().setMode(AVAudioSession.Mode.voiceChat)

Note:

  1. 推荐使用 chatRoom Scenario。
  2. 推荐使用 SDK 的 playEffect 接口播放音效文件。

这两步如果是使用的NativeSDK里面的C++接口,应该怎么调用呢?好像只有RtcEngineParameters这个类有setParameters接口,但是不太清楚怎么使用,有没有具体的文档?

你说的是哪两个接口呢?

C++ setParameters 调用示例:

nRet = m_lpAgoraEngine->setParameters("{\"che.audio.enable.aec\": true}");

就是这两步,我没有在IRtcEngine这个类里面找到setParameters方法,只在RtcEngineParameters这个类里找到了,现在是用的从互动游戏那个页面下载的Android、iOS 2.2版本的SDK。

这个版本的 SDK 目前已经不维护了,建议直接使用视频互动直播 SDK:
https://docs.agora.io/cn/Interactive%20Broadcast/downloads

功能会更丰富。

好的

@Zzh 你好
我们的客户端使用 flash air for ios ,接入sdk,现在出现游戏音效跟sdk冲突的问题。

  1. 我先播放游戏音频, 在播放的过程中我加入或者退出频道,我们的游戏音频就无声了。
  2. 我这边发现,当调用加入或者离开频道代码后播放游戏音频则会出现音频播放不完整的情况,如果调用加入或者离开频道代码后延迟几秒钟,再播放游戏音频则可以完整播放。

再加入频道前已经调用 tAudioProfile 设置使用 AgoraAudioScenarioGameStreaming 模式。
上述问题我们如何处理。

app里面有些SVG资源里面包含声音,但是在房间里面可能会导致svg声音没法播放

加入频道后, AVAudioSession被sdk 占用,
建议使用声网的接口来播放
playeffect或者startaudiomixing

1赞