【问题标题】:AVAudioSession InterruptionsAVAudioSession 中断
【发布时间】:2013-11-07 18:39:02
【问题描述】:

所以在我的应用程序中,在 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,那么我的观察者就会触发,这样就可以了。仍然不知道为什么系统没有自己发布通知。
  • 你设置了AVAudioSession模式并调用了setActive
  • 是的,否则音频最初不会播放,它会播放。 [session setMode:AVAudioSessionModeVoiceChat error:&error][[AVAudioSession sharedInstance] setActive:YES error:&activationError]。我在添加观察者之前设置了模式,然后设置了活动,尽管这无关紧要(?)。
  • 您为音频类别设置了什么?
  • 我使用AVAudioSessionCategoryPlayAndRecord。无论选择如何,对选项进行试验都不会产生任何变化。

标签: ios audio avaudiosession interruption


【解决方案1】:

您的应用程序中有 AVCaptureSession 实例吗?
如果是这种情况,我会建议与我收到的链接问题相同的答案:
尝试将 NO 设置为 AVCaptureSession 实例的 usesApplicationAudioSession 属性。
它是自 iOS 7 以来可用的属性。在以前的 iOS 版本中,每个 AVCaptureSession 都使用私有 AVAudioSession。从 iOS 7 开始,Capture Sessions 使用共享应用程序的 AVAudioSession。
usesApplicationAudioSession 属性默认是启用的,所以如果你想保持旧的行为你必须禁用它,通过设置 NO

我希望这也对你有用。

【讨论】:

  • 我会在星期一试一试(或者如果我周末有机会,我会尽快跑到办公室试一试)。十指相扣~
  • 这解决了我的问题!非常感谢您的帮助(记得在得到自己的答案后把答案扔在这里)!
  • 如果I don't haveAVCaptureSession怎么办?如果我创建 AVCaptureSession 的虚拟对象(不添加输入/输出),这会起作用吗?
【解决方案2】:

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

试试这个:

AVAudioSession *session = [AVAudioSession sharedInstance];

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

【讨论】:

  • 不需要传递会话,它只是防止观察者从其他对象获取通知。以防万一,我编辑了我的代码以传递会话而不是 nil,但没有帮助。不过感谢您的建议。
  • 实际上这就是我在 iOS 14 上没有收到任何通知的确切原因。Apple 的文档还指出您应该传递一个共享实例:developer.apple.com/documentation/avfaudio/avaudiosession/…
【解决方案3】:

对我来说,当用户实际按下播放按钮时激活音频会话并添加观察者已经解决了这个问题;通知被解雇了。我认为苹果文档对 here 说了什么。

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2018-05-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多