我正在制作播客应用。这会使用AVAudioSessionCategoryPlayback
会话类型播放音频。这几乎可以完成我想要它做的所有事情。它会暂停其他播放的音乐,当有来电时它会被打断,并且通常可以按照我想要的方式正常工作。
使用一个例外。当播放更高优先级的音频时(例如,当运行转弯导航应用程序时),我的应用程序中的音频会在音量上下降但继续运行。这造成了两种不希望的声音的可怕混合。我宁愿选择我的应用程序中的音频在过度播放的声音中暂停,然后在完成后再次继续。
我尝试更改不同的AVAudioSession属性,例如AVAudioSessionCategoryOptionMixWithOthers
,但这些只会改变低优先级声音与我的应用程序混合的方式。它们不会改变我的如何与更高优先级的声音混合。我还尝试观察otherAudioPlaying
的{{1}}属性,但是当我将这些短片段叠加时,这并未触发更改。
有没有办法检测我的应用程序中的音频何时被躲避,以便我可以暂停它?或者,为了防止我的应用程序的音频被躲避,以便将其他声音视为中断?
感谢。
答案 0 :(得分:1)
在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);
}
希望这对你有用....
答案 1 :(得分:1)
我写信给Apple DTS关于这个问题。这是我得到的:
感谢您与Apple开发者技术支持(DTS)联系。我们的 工程师已经审查了您的请求并得出结论 没有支持的方法来实现所需的功能 目前正在发货系统配置。
如果您希望Apple将来考虑添加支持 允许/通知后台应用程序停止播放音频时 前台应用程序选择躲避其他音频,然后启用后台 应用程序在完成后再次启动音频,请提交 通过Bug Reporter工具的增强请求 http://bugreport.apple.com
现在不幸的是,这似乎是不可能的。
答案 2 :(得分:1)
此功能已在iOS 9中添加,可以通过将音频会话模式设置为AVAudioSessionModeSpokenAudio来启用。其他使用导航应用程序的应用程序会中断您的音频而不是躲避。
请参阅:https://developer.apple.com/documentation/avfoundation/avaudiosessionmodespokenaudio
答案 3 :(得分:0)
我从来没有这样做,但我想你可以使用AudioSession服务C函数 audioSessionAddPropertyListener 来注册kAudioSessionProperty_OtherAudioIsPlaying的回调。
请注意,“FLATDACTED”文档和Apple DevForums中存在一些混淆,即“未来”所有或部分AudioSession C函数被弃用的可能性。
答案 4 :(得分: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
}
}
希望它有所帮助。
答案 5 :(得分:0)
我不相信kAudioSessionProperty_OtherAudioIsPlaying应该以任何方式回调 - 可能是你必须定期轮询这个值。
当在设备上播放其他音频时,它应返回非零值。这可能并不表示您本身就“被躲避”,但这表明其他音频正在与您的音频混合。据说,如果另一个应用程序设置了他们的音频会话的kAudioSessionProperty_OtherMixableAudioShouldDuck属性,那么你只会被躲避。
关于民意调查 - 是的,它可能不如回调那么优雅,但有时候这是必要的,我怀疑轮询这个值是次要的。
希望这有帮助。