我对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方法应该重新激活音频会话... 所以我不知道什么是停用音频会话的正确方法,什么时候做,如果有人可以帮我这个:)
答案 0 :(得分:0)
while循环应该做什么?
最好先听一下播放器播放完毕,然后停用会话。
[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(finishedPlaying:)
name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
答案 1 :(得分:-1)
当解雇ViewController
时,您必须暂停/释放audioSession
。 pause
audioSession
种方法