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

Posted

技术标签:

【中文标题】何时以及如何正确停用您的音频会话?【英文标题】:When and How properly deactivate your audio session? 【发布时间】:2014-08-14 18:43:10 【问题描述】:

我对 AVFoundation 有点迷茫,你是我最后的希望!

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

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

我不知道如何实现!因为我不太确定停用音频会话的方法,所以我的第一个想法是使用“while”。

这是我的 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 应该重新激活音频会话... 所以我不知道停用音频会话的正确方法是什么,什么时候做,如果有人可以帮助我:)

【问题讨论】:

【参考方案1】:

while 循环应该做什么?

你最好听听播放器完成播放,然后停用会话。

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

【讨论】:

以上是关于何时以及如何正确停用您的音频会话?的主要内容,如果未能解决你的问题,请参考以下文章

何时以及如何使用休眠二级缓存?

如何以及何时使用 Ember.Application 注册和注入方法?

如何正确处理 UnsafeMutablePointer

何时以及为啥要使用 Java 同步? [复制]

如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean

何时以及为何调用 updateConstraints?