ios - 在背景暂停音乐中播放声音提醒序列,不会被其他声音停止

标签 ios audio avaudioplayer avaudiosession

我想为iPhone编写一个应用程序,该程序可以播放音频提示序列,并与其他应用程序产生的声音很好地进行通信。

更具体地说,我想实现以下几点:
1.每10秒钟播放一次声音提醒。 (这是为了简化问题,在我的应用中有一个时间序列,用于指定何时播放提醒)
2.声音应该在后台工作。
3.如果应暂停音乐播放,我的应用程序应发出音频提示,然后恢复音乐。
4.如果其他应用程序开始使用声音,则我的提醒序列应继续起作用(例如,在我的应用程序运行后开始播放音乐或打来电话)。

使用下面的代码,我能够实现第1.点和第2点。但是我无法实现如何同时实现3.和4.点。

- (void)viewDidLoad
{
    [super viewDidLoad];
    audioSession = [AVAudioSession sharedInstance];
}

// Following function is used to start reproducing sounds and also called
// for the next sounds
- (IBAction)soundPlayShort:(id)sender
{
    NSURL * url = @"reminder sound url here";

    // soundPlayer is defined in .h file as AVAudioPlayer
    if (soundPlayer == nil) {
       // initialize soundPlayer
       soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
       soundPlayer.delegate = self;
    }
    [soundPlayer playAtTime:soundPlayer.deviceCurrentTime + 10];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];    
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
    [self soundPlayShort:self];
}

如果我按照下面的代码更新audioPlayerDidFinishPlaying,则会恢复其他声音(第3点),但是我的序列中的下一个提醒不再调用(与第2点有关)。
- (void)restoreOtherSounds
{
    [audioSession setActive:NO 
        withFlags:AVAudioSessionSetActiveFlags_NotifyOthersOnDeactivation error:nil];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{

    [self restoreOtherSounds];
    [self soundPlayShort:self];
}

而且我还没有意识到如何恢复提醒序列,例如来电后。 (第4点)

即使是部分答案也可能对我很有帮助。提前致谢。

最佳答案

与第2点相关,在soundPlayShort中初始化AVAudioPlayer之前,请尝试将音频 session 设置为 Activity 状态:
[[AVAudioSession sharedInstance] setActive:YES error:nil];

关于ios - 在背景暂停音乐中播放声音提醒序列,不会被其他声音停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12388163/

相关文章:

ios - 在后台保存音频文件

ios - 使用 AVAudioPlayer 从 URL 播放音频

ios - 平台列表在最新的 phonegap 中不起作用

ios - 将配置文件添加到现有项目的新设备

iOS Audio Streaming 并在音频播放完成后将音频文件保存到文档目录

ios - 如何防止播放多个直播音频?

iphone - 如何确定 UITapGestureRecognizer 触摸了哪个 View ?

android - 在 phonegap 应用中实现聊天

ios - 具有后台 Audio Session 的 iphone/ios 应用程序阻止用户接听来电

android - 在 Android 中使用 libusb 捕获音频