何时以及如何正确停用音频会话?

时间:2014-08-14 18:43:10

标签: ios objective-c avfoundation avaudioplayer avaudiosession

我对AVFoundation有点失落,你是我最后的希望!

我正在编写一个锻炼应用程序,其中我有时会播放简短的提示,例如:"你踩10分钟"或者"好!"

Apple建议在播放提示之前激活音频会话,并在播放提示后始终将其停用。这不仅仅是一个推荐,这是我想要的,因为我使用了选项:AVAudioSessionCategoryOptionDuckOthers,我只想在播放提示时放弃音乐播放器,而不是之前,而不是之后。

我不知道如何实现这一目标!因为我不太确定停用音频会话的方法,我的第一个想法是使用"而#34;。

这是我的AudioController类:

#import "AudioController.h"

@interface AudioController ()


@property(strong,nonatomic)AVAudioPlayer *audioPlayerGood;

@end


@implementation AudioController

-(id)init
{
    self=[super init];
    if (self) {
        [self configureAudioSession];
        [self preparePlayers];
    }
    return self;
}

-(void)configureAudioSession
{
    self.audioSession = [AVAudioSession sharedInstance];
    NSError *setCategoryError = nil;
    [self.audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError];

}


-(void)preparePlayers
{
    NSError *initAudioPlayerError = nil;

    NSURL *urlGood = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Correct" ofType:@"caf"]];



    self.audioPlayerGood = [[AVAudioPlayer alloc] initWithContentsOfURL:urlGood error:&initAudioPlayerError];

   if (initAudioPlayerError) {
        NSLog(@"Error in audioPlayer: %@",[initAudioPlayerError localizedDescription]);
    }


    [self.audioPlayerGood prepareToPlay];
 }

-(void)playCorrect
{
    NSError *activationError = nil;
    [self.audioSession setActive:YES error:&activationError];
    [self.audioPlayerGood play];
    NSLog(@"****************Correct played***************");
    while (self.audioPlayerGood.playing) {
        break;
    }
    [self.audioSession setActive:NO error:&activationError];
 }


@end

然后我在另一个使用playCorrect方法的类中初始化一个AudioController对象:

[self.audioController playCorrect];

但是在播放声音之后,调试区域会打印出这个文本:

   AVAudioSession.mm:646: - [AVAudioSession setActive:withOptions:error:]:停用已运行I / O的音频会话。在停用音频会话之前,应停止或暂停所有I / O.

如果十秒钟后我想再次播放此声音,则无法正常工作,而playCorrect方法应该重新激活音频会话... 所以我不知道什么是停用音频会话的正确方法,什么时候做,如果有人可以帮我这个:)

2 个答案:

答案 0 :(得分:0)

while循环应该做什么?

最好先听一下播放器播放完毕,然后停用会话。

[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(finishedPlaying:) 
    name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];

答案 1 :(得分:-1)

当解雇ViewController时,您必须暂停/释放audioSessionpause

audioSession种方法