AVAudioSession中断问题

12

在我的应用中,在iOS 6上运行时,一切似乎都可以正常使用音频。我使用了旧的C API格式通过回调来捕获中断;通过这种方式进行设置:AudioSessionInitialize(NULL, NULL, interruptionListenerCallback, (__bridge void *)self)非常好用。然而,在使用iOS 7 SDK时,当设备接收到电话或者闹钟响起时,我的中断回调似乎从未被调用。

经过一些查找,我得知旧的C API已经被弃用,你应该转向使用更新的AVAudioSession函数。更多的阅读揭示,AVAudioSession的委托已经被弃用,你应该使用NSNotification来接收AVAudioSessionInterruptionNotification通知并处理必要的中断操作。

对我来说,似乎这个通知从未真正触发,因此我从未被正确地中断,这之后所有的音频就会出现问题。

我像这样注册通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AudioInterruption:) name:AVAudioSessionInterruptionNotification object:nil];

目前,AudioInterruption:函数只是记录了它被触发的事实。日志和任何断点都没有触发。

需要明确的是,初始时音频播放和录制都正常工作。当出现中断(例如来电或闹钟)时,不会触发任何中断通知。如果需要更多周围代码,请告诉我。


只是一个提示,如果我手动发布 AVAudioSessionInterruptionNotification,那么我的观察者会触发,所以这是有效的。仍然不知道为什么系统本身没有发布通知。 - Doc
你设置了AVAudioSession模式并调用了setActive吗? - imihaly
是的,否则音频最初不会播放,但它确实可以。 [session setMode:AVAudioSessionModeVoiceChat error:&error][[AVAudioSession sharedInstance] setActive:YES error:&activationError]。我在添加观察者之前设置了模式,并在之后设置了活动状态,尽管这似乎并不重要(?)。 - Doc
你为你的音频分类设置了什么? - H.Rabiee
我使用 AVAudioSessionCategoryPlayAndRecord。尝试不同的选项实验并没有产生任何变化。 - Doc
3个回答

9

你的应用程序中是否有一个 AVCaptureSession 实例?
如果是这样,我建议您尝试与我的链接问题相同的答案:
尝试将 usesApplicationAudioSession 属性设置为 NO,该属性自 iOS 7 起可用。在之前的 iOS 版本中,每个 AVCaptureSession 都使用了一个私有的 AVAudioSession。自 iOS 7 以来,捕获会话使用共享应用程序的 AVAudioSession。
usesApplicationAudioSession 属性默认启用,因此如果要保留旧行为,则必须将其禁用,方法是将其设置为 NO

我希望这对您也有帮助。


我会在周一尝试它(如果我在周末有机会,我会冲进办公室尽早尝试)。祈求好运~ - Doc
1
这解决了我的问题!非常感谢您的帮助(并在得到自己的答案后记得将答案传递给我)! - Doc
4
如果我没有 AVCaptureSession,那怎么办?如果我创建一个没有添加输入/输出的虚拟 AVCaptureSession 对象,这样会起作用吗? - Marek R

2

在您的addObserver调用中,您没有将AVAudioSession实例作为最后一个参数传递。

请尝试以下操作:

AVAudioSession *session = [AVAudioSession sharedInstance];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(AudioInterruption:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:session];

7
通过会话(session)并非必须,其只是防止观察者接收到其他对象的通知。为了以防万一,我编辑了我的代码,将nil替换为传入会话(session),但这并没有起到帮助作用。感谢您的建议。 - Doc
实际上这正是我在iOS 14上没有收到任何通知的确切原因。此外,苹果的文档指出,您应该传递一个共享实例:https://developer.apple.com/documentation/avfaudio/avaudiosession/responding_to_audio_session_interruptions - Michael

-1

对我来说,当用户实际点击播放按钮时激活音频会话并添加观察者已解决了这个问题;通知被触发。我认为苹果文档在这里有相关说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接