2010-06-16 91 views
1

我正在尝试使用AVAudioPlayer快速连续播放一些声音。当我不太频繁地调用声音播放功能,以便在函数再次调用之前声音完全播放时,应用程序运行良好。但是,如果我快速连续调用该函数(以便在播放前一个声音时播放声音),则应用程序在调用〜20个函数后最终崩溃,并显示“EXC_BAD_ACCESS”消息。下面是从功能代码:在iPhone上使用AVAudioPlayer时崩溃

NSString *nsWavPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:wavFileName]; 

AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:nsWavPath] error:NULL]; 
theAudio.delegate = self; 

[theAudio play]; 

正如在另一个线程中提到,我采取了以下委托功能:

- (void) audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    if(!flag) 
     NSLog(@"audio did NOT finish successfully\n"); 
    [player release]; 
} 

,但应用程序依然围绕后20〜迅速调用该函数崩溃。任何想法我做错了什么?

回答

1

首先:确保你没有尝试第二次播放声音,已经通过[player release];发布如果你是,你会立即得到这个错误信息。一旦您释放与特定声音关联的播放器,就不能再播放文件,就像您在此显示的那样。尝试注释掉这行代码,看看它是否仍然发生。

我也遇到了一个问题,其中AVAudioPlayer每次创建一个新的player分配32kb,如果你有足够的声音,你可以用尽内存并得到崩溃。我非常怀疑这是你的问题,但它通常不会抛出错误代码。

EXC_BAD_ACCESS通常是由试图访问不再存在的指针(如您的player对象)的大部分我已经看到了这个论坛

+0

感谢罗布!事实证明,我在某些情况下释放了视图本身,因此导致EXC_BAD_ACCESS,因为声音仍在播放,但其代表已被释放。我立即调用[theAudio播放],然后调用 [自发布] 在audioPlayerDidFinishPlaying后[播放器发布]之前修复它通过添加 [自我保留] 。那就摆脱了崩溃。 – mindthief 2010-06-16 08:30:17

1

我找到了一个更好的解决这个问题的案件。 你只需要激活/停用你的AVAudioSession。

例如:在您viewDidLoad方法把这个:

... some awesome code ... 
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; 
[self.audioPlayer setDelegate:self]; 
[self.audioPlayer setVolume: 0.7f]; 
[self.audioPlayer setNumberOfLoops:0]; 
if ([self.audioPlayer prepareToPlay]) { 
    [self.audioPlayer play];    
} 
.... 

最后,(没有问题,如果声音是:

NSError *activationError = nil; 
[[AVAudioSession sharedInstance] setActive:YES error:&activationError]; 

然后,您可以在任何方法这样播放声音完成播放),当你完成了声音,然后只是这样做:

// I've made it on the view's callback 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    [self.audioPlayer stop]; 
    [self setAudioPlayer:nil]; 
    NSError *activationError = nil; 
    [[AVAudioSession sharedInstance] setActive:NO 
             error:&activationError]; 
    .... etc, etc... 
} 

而这就是所有:) 您的应用永远不会因EXC_BAD_ACCESS而再次崩溃。

希望这有助于你避免哈克[自我保留]/[自发行]

从苹果公司的音频会话编程指南: https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/ConfiguringanAudioSession/ConfiguringanAudioSession.html

+0

感谢堆。为我节省了数天的调试时间。必须阅读Apple音频会话编程指南中的“为什么默认音频会话通常不是您想要的” – Amarsh 2016-02-03 05:19:47