iOS在播放完成前播放相同的音效

Posted

技术标签:

【中文标题】iOS在播放完成前播放相同的音效【英文标题】:iOS play same sound effect before done playing 【发布时间】:2014-05-05 07:57:42 【问题描述】:

我正在为 ios 7 创建一个 iPhone 游戏。我有一个名为 sharedResources 的类,其中包含在游戏中反复使用的某些数据的副本,包括 4 秒长的音效。

所以我正在创建这样的音效:

    filePathTD = [[NSBundle mainBundle]
                 pathForResource:@"towerDamage" ofType:@"aiff"];
    fileURLTD = [NSURL fileURLWithPath:filePathTD];

    towerDamge = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURLTD
                                                    error:&error];
    if (error)
        NSLog(@"Error: %@", [error localizedDescription]);

然后像这样在其他地方调用它:

[towerDamage play];

我的问题是与我想调用它的速度相比,声音效果很长。因此,当我在它已经在播放时调用它时,它不会同时播放,因为它已经在使用并且我只有一个副本。

所以我问:在不占用太多内存的情况下同时播放多个音效的最佳方式是什么?

我知道我可以制作多个副本,但如果我为每个需要它的角色制作一个副本,我可能只需要最多 5 个副本,而我可能有 30 个副本。我的想法是只制作 5 个副本,并且只使用当前未使用的副本。但是由于我是 iOS 开发的新手,我不确定除了这个 hack 是否有更好的方法来完成这项任务?

【问题讨论】:

预分配AVAudioPlayer 并不意味着文件正在加载到内存中。我很确定它会在播放过程中加载它认为合适的波形。所以我想我并不完全是通过预先分配它而获得的。为什么不按需分配? 谢谢!这似乎是合理的。我只是认为可能有一些库或函数会询问我做了什么,但这似乎可以正常工作。 【参考方案1】:

在 AVAudioPlayer 实例上使用 prepareToPlay 将预加载声音文件。也许您可以将一些合理数量的它们加载到一个数组中,然后根据需要循环它们。如果您需要的数量超过分配的数量,那么您当时选择将一个新的加载到内存中,或者重新开始播放列表中的第一个。更复杂的系统可以根据因素或应用程序中发生的情况在数组中存储或多或少的声音。

也许是这样的? (为了简洁起见,我省略了错误检查和什么)

  //setup the managing class to be
//<AVAudioPlayerDelegate>

///--- instance variables or properties
int nextIndexToPlayInArrayOfSounds = 0;
NSMutableArray *arrayOfSounds = [NSMutableArray array];
int numberOfSoundsNeeded = 10;


//make a method to setup the sounds
for (int i = 0; i < numberOfSoundsNeeded; i++) 

    AVAudioPlayer *mySound = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"soundNameOnDisk"] withExtension:@"aiff"] error:NULL];
    mySound.delegate = self;
    [arrayOfSounds addObject:mySound];
    [mySound prepareToPlay];




//make a method to play a sound
//and then play the next sound in the list, or if past the end of the array, or play the first one
AVAudioPlayer *nextSoundToPlay;

if (numberOfSoundsNeeded > nextIndexToPlayInArrayOfSounds) 
    nextIndexToPlayInArrayOfSounds++;
else
    nextIndexToPlayInArrayOfSounds = 0;


//obviously I'm skipping error checking and nil pointers, etc
nextSoundToPlay = [arrayOfSounds objectAtIndex:nextIndexToPlayInArrayOfSounds ];
[nextSoundToPlay playAtTime:0];

【讨论】:

谢谢,这和我想的差不多!但我做了别人做的事,每次使用时都加载音效。我认为这没什么大不了的,因为效果是一秒钟之久。我停止了该项目的工作,但其他人可能会觉得这很有用,所以赞!

以上是关于iOS在播放完成前播放相同的音效的主要内容,如果未能解决你的问题,请参考以下文章

IOS中录音后无法播放游戏音效

iOS,swift:无延迟播放背景音乐和音效

iOS学习笔记23-音效与音乐

iOS开发之音频播放录音

iOS 播放系统音效

iOS 播放系统音效