17

我正在开发一个 Podcast 应用程序。AVAudioSessionCategoryPlayback这使用会话类型播放音频。这几乎可以完成我想要它做的所有事情。它会暂停其他播放音乐,当有来电时它会被打断,并且通常完全按照我的意愿工作。

除了一个例外。当播放更高优先级的音频时(例如,运行逐向导航应用程序时),我的应用程序中的音频音量会降低,但会继续运行。这会造成两种不想要的声音的可怕混合。相反,我希望我的应用程序中的音频在过度播放的声音期间暂停,然后在完成后再次继续。

我尝试更改不同的 AVAudioSession 属性,例如AVAudioSessionCategoryOptionMixWithOthers,但这些只会更改较低优先级的声音与我的应用程序混合的方式。它们不会改变我的声音与更高优先级声音的混合方式。我也尝试观察 的otherAudioPlaying属性,sharedSession但是当我覆盖这些短片时,这并没有触发更改。

有什么方法可以检测我的应用程序中的音频何时被闪避,以便我可以暂停它?或者是为了防止我的应用程序的音频被闪避,以便它将这些其他声音视为中断?

谢谢。

4

6 回答 6

5

此功能是在 iOS 9 中添加的,可以通过将音频会话模式设置为 AVAudioSessionModeSpokenAudio 来启用。其他会说话的应用程序(例如导航应用程序)会打断您的音频而不是闪避。

请参阅: https ://developer.apple.com/documentation/avfoundation/avaudiosessionmodespokenaudio

于 2018-04-25T16:11:33.120 回答
1

我就这个问题写信给 Apple DTS。这是我回来的:

感谢您联系 Apple 开发者技术支持 (DTS)。我们的工程师已经审查了您的请求,并得出结论认为,鉴于当前发货的系统配置,没有支持的方式来实现所需的功能。

如果您希望 Apple 考虑在未来添加支持以允许/通知后台应用程序在前台应用程序选择闪避其他音频时停止播放音频,然后在闪避完成后启用后台应用程序再次启动音频,请提交通过http://bugreport.apple.com上的 Bug Reporter 工具提出增强请求 。

不幸的是,目前看来这是不可能的。

于 2014-10-18T10:08:59.973 回答
0

您可能想要查看中断,并在中断时简单地丢弃您的音频会话,然后在中断结束时恢复它,如下所示:

在您的 ViewDidLoad 中:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

if ([self canBecomeFirstResponder]) {
    [self becomeFirstResponder];
}

处理通知:

static NSInteger audioSessionActiveCounter = 0;

- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification
{
    AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];

    if (AVAudioSessionInterruptionTypeBegan == interruptionType)
    {
       DDLogVerbose(@"Session interrupted: --- Begin Interruption ---");
       // stop your session here with a setActive:NO

    }
    else if (AVAudioSessionInterruptionTypeEnded == interruptionType)
    {
        DDLogVerbose(@"Session interrupted: --- End Interruption ---");
       // resume your session here with a setActive:YES
    }
}

希望能帮助到你。

于 2014-01-30T18:22:30.283 回答
0

我从来没有这样做过,但我想你可以使用 AudioSession 服务 C 函数audioSessionAddPropertyListener来注册你的回调 kAudioSessionProperty_OtherAudioIsPlaying。

请注意,“FLATDACTED”文档和 Apple DevForums 中存在一些混淆,即“将来”可能会弃用所有或部分 AudioSession C 函数。

于 2013-08-07T15:17:14.570 回答
0

我不相信 kAudioSessionProperty_OtherAudioIsPlaying 应该以任何方式回调 - 可能是您必须定期轮询此值。

当设备上播放其他音频时,它应该返回一个非零值。这可能并不表明您本身被“躲避”,但它表明其他音频正在与您的音频混合。假设只有当其他应用程序设置其音频会话的 kAudioSessionProperty_OtherMixableAudioShouldDuck 属性时,您才会被躲避。

关于轮询 - 是的,它可能不如回调那么优雅,但有时​​它是必要的,我怀疑轮询这个值是一个小问题。

希望这可以帮助。

于 2014-03-16T20:48:49.747 回答
0

在您AppDelegate.m的班级和didFinishLaunchingWithOptions功能中,收听以下通知

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

在应用程序启动方法之外,将选择器实现为

- (void)audioSessionInterruption:(NSNotification *)notif{
    NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo);
}

希望这对你有用....

于 2014-04-29T11:27:45.970 回答