正确使用AVAudioPlayer

时间:2015-05-26 07:06:17

标签: ios objective-c avaudioplayer

我构建的应用程序本质上是一个带有十个按钮的工具,每个按钮链接到一个单独的AVAudioPlayer。当我尝试在ViewDidLoad方法中为每个AVAudioPlayer分配和初始化内存时,我没有得到任何错误,但是每个按钮的响应性都滞后,并且在再次触发/听到相同的按钮之前有相当大的延迟时间。我已经通过实施下面的代码来纠正这种情况,但是我并不相信它是处理内存的正确方法,特别是因为我有10种这样的方法。

    - (IBAction)note1:(id)sender {
           url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];
    unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];
    [unit1 play];
}

3 个答案:

答案 0 :(得分:0)

你可以尝试一件事,

在播放该文件之前调用prepareToPlay AVAudioPlayer方法。

答案 1 :(得分:0)

您当前代码的问题在于,每次拨打AVAudioPlayer时都要创建-note1:的新实例。您可以尝试这种改进:

- (IBAction)note1:(id)sender {
    if (!url1)
       url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];

    if (!unit1)
       unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];

    [unit1 play];
}

但最好的方法是在加载AVAudioPlayers时在一个地方初始化UIViewController

- (void) initializePlayers {
    url1 = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"note1" ofType:@"wav"]];
    unit1 = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:nil];
}

- (void) viewDidLoad {
    [self initializePlayers];
}

- (IBAction)note1:(id)sender {
    [unit1 play];
}

答案 2 :(得分:0)

加载视图后进行任何其他设置,通常是从笔尖。

NSURL* url = [[NSBundle mainBundle] URLForResource:@"Rondo_Alla_Turka_Short" withExtension:@"aiff"];
NSAssert(url, @"URL is valid."); 
NSError* error = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if(!self.player)
{
    NSLog(@"Error creating player: %@", error);
}