何时以及如何正确停用您的音频会话?
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 注册和注入方法?