在 ios 上混合音频
Posted
技术标签:
【中文标题】在 ios 上混合音频【英文标题】:Mixing Audio on ios 【发布时间】:2020-07-03 04:41:31 【问题描述】:我正在尝试混合音频源,以便没有音频闪避。我试图解决的用例是在后台进行音频通话,同时播放音乐和/或收听应用程序音频,没有任何音频闪避。音频闪避是指音频被降低并略微失真以帮助收听另一个音频会话。我可以不加掩饰的音频和音频混合(或 ios)吗?
我已经尝试了以下代码。我也尝试将它包装在 DispatchQueue.main.async 闭包中,但仍然没有运气。
// I have also tried this code with this block uncommented
// do
// try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
//
// catch let activationError
// print(activationError)
// print(activationError.localizedDescription)
//
let audioSession = AVAudioSession.sharedInstance()
do
try audioSession.setCategory(
AVAudioSession.Category.playAndRecord,
mode: AVAudioSession.Mode.voiceChat,
options: [.allowBluetoothA2DP, .allowBluetooth, .mixWithOthers, .allowAirPlay]
)
catch let setCategoryError
print(setCategoryError)
print(setCategoryError.localizedDescription)
do
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
catch let activationError
print(activationError)
print(activationError.localizedDescription)
【问题讨论】:
这个问题也适用于其他 WebRTC 调用,而不仅仅是 Agora。例如使用 OpenVidu。 【参考方案1】:答案似乎是AVAudioSession.Mode
在后台自动设置了一些选项。 Apple 似乎做出了设计决定,即.voiceChat
模式应该始终避开其他模式以获得最佳体验。在 .videoChat
模式中也是如此,这两种模式都是用于 Agora 调用的明显模式。使用这些模式似乎会自动设置.duckOthers
标志。
我可以通过将模式设置为.videoRecording
来解决此问题,该模式专为录制音频和视频的应用程序而设计,因此不会自动设置.duckOthers
。因为这实际上不是您正在做的事情,所以这绝对是一种解决方法,并且可能会产生其他副作用。
鉴于您对 AVAudioSession 所做的事情,您可能还希望阻止 Agora 从您的下方更改它。您可以致电agoraKit.setAudioSessionOperationRestriction(.all)
以防止 Agora 在未经您许可的情况下更改全局 AVAudioSession,这可能是完成这项工作所必需的。
【讨论】:
如果您将其从.voiceChat
或.videoChat
更改为离开,您还将无法访问Apple 的内置硬件回声消除,这将导致反馈循环。
host-in 场景中使用 .videoRecording 是否存在回声问题?宗坦费拉
恕我直言,最好不要远离.videoChat
,因为它会禁用回声消除。在我的场景中,环境游戏听起来和用户的声音一样重要,但我决定放弃它们。此外,使用耳机时,回避的环境声音实际上处于良好的水平(但使用扬声器时,几乎听不见)以上是关于在 ios 上混合音频的主要内容,如果未能解决你的问题,请参考以下文章