在 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 上混合音频的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上混合和均衡多个压缩音频流

在 iOS 上使用音频单元混合多个信号

iOS - 混合两个音频文件

iOS - 如何将混合音频合成导出到文件大小最小的文件?

iOS 将 2 个或多个音频文件合并(混合)为 wav 格式

使用 NAudio 混合两个音频文件