【发布时间】:2011-07-06 10:17:54
【问题描述】:
我有 6 个按钮,每个按钮都播放 .caf 文件中的音频样本。如果我按下一个按钮,声音会正常播放,如果我等待它结束并再次按下它会正常播放,但如果我快速按下按钮,那么声音会在播放前弹出并单击。
我最初在每次单击按钮时仅分配 AVAudioPlayer 时没有出现此弹出问题,但这会导致多次分配的内存泄漏。所以我为每个按钮创建了 6 个 AVAudioPlayers 并重新使用它,这消除了内存泄漏,但现在样本在被覆盖时单击/弹出。
我尝试了很多不同的方法来阻止这种情况的发生,包括将音量设置为 0、在播放下一个样本之前停止 AVAudioPlayer 实例等,但找不到正确的方法来通过快速按钮重复播放相同的样本声音并停止爆裂声。
我确实在 .h 中保留了 AVAudioPlayer 属性,并在 alloc 语句中使用了 autorelease。
有什么帮助吗?
** 编辑:找到了一个解决方案,它不漂亮,但它有效。
基本上我创建了 10 个自动释放的 AVAudioPlayer,如果有一个 [myPlayer1 isPlaying] 则我使用下一个。
例如
BOOL done = NO;
if(![self.audioPlayer0 isPlaying] && done == NO) {
self.audioPlayer0 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer0 play];
done = YES;
}
if(![self.audioPlayer1 isPlaying] && done == NO) {
self.audioPlayer1 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer1 play];
done = YES;
}
if(![self.audioPlayer2 isPlaying] && done == NO) {
self.audioPlayer2 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer2 play];
done = YES;
}
if(![self.audioPlayer3 isPlaying] && done == NO) {
self.audioPlayer3 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer3 play];
done = YES;
}
if(![self.audioPlayer4 isPlaying] && done == NO) {
self.audioPlayer4 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer4 play];
done = YES;
}
if(![self.audioPlayer5 isPlaying] && done == NO) {
self.audioPlayer5 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer5 play];
done = YES;
}
if(![self.audioPlayer6 isPlaying] && done == NO) {
self.audioPlayer6 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer6 play];
done = YES;
}
if(![self.audioPlayer7 isPlaying] && done == NO) {
self.audioPlayer7 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer7 play];
done = YES;
}
if(![self.audioPlayer8 isPlaying] && done == NO) {
self.audioPlayer8 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer8 play];
done = YES;
}
if(![self.audioPlayer9 isPlaying] && done == NO) {
self.audioPlayer9 = [ [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil] autorelease ];
[audioPlayer9 play];
}
【问题讨论】:
标签: ios cocoa-touch avaudioplayer openal