AVAudioPlayer 有时会打嗝应用程序

AVAudioPlayer hiccups the app sometimes

我正在开发一个简单的游戏,每次触摸屏幕后,一个小的 UIImageView 上就会出现一个动画,这种情况发生得非常好,应用程序 运行 流畅地使用 CADisplayLink 作为计时器。

我添加了一个 mp3 文件,每次触摸后播放 1 秒长度,因为 AVAudioPlayer 想象的声音如下:Bip

因此,我第一次触摸屏幕时发生了第一次打嗝,应用程序冻结不到一秒钟,我可以说没关系,因为这是声音第一次分配内存。

如果我早于 3 秒再次触摸屏幕,应用程序不会打嗝,但如果我等待 4 秒或更长时间,应用程序会在每次触摸后开始打嗝。

每次如果我在触摸之间的时间间隔小于 3 秒时反复触摸,应用程序不会卡顿,但在触摸间隔 4 秒后,应用程序会卡顿。

有解决打嗝的办法吗?

如果需要,这是一些代码

@property (nonatomic, strong) AVAudioPlayer *mySound;

- (void)viewDidLoad {

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"bip" ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];

self.mySound = newPlayer;

[mySound prepareToPlay];
[mySound setDelegate:self];
}

触摸发生后

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];
if (location.x < viewWidth/2) {
   [mySound play];
} else {
   [mySound play];
}
}

发出很短的无声声音。使用你的计时器每秒播放一次(与另一个声音播放器)。 ——你看这里的想法是什么;我们试图让媒体服务器保持活动状态,以便在我们需要我们的音效时准备就绪。既然你说 3 秒前没有问题,那让我认为 3 秒后媒体服务器又回到了睡眠状态。我们的目标是保持 "tickling" 它不会发生。

然而,总的来说,我的印象是 AVAudioPlayer 不是为这类事情而设计的。您可能应该使用 AVAudioEngine,它可以保留 运行 并且可以无延迟地播放声音。