我正在尝试创建play
单个声音文件和一个button
stops
所有当前正在播放的声音的按钮。如果用户在短时间内单击多个按钮或相同的button
,应用程序应该同时播放所有声音。我使用iOS的System Sound Services毫不费力地完成了这项工作。但是,系统声音服务通过volume
振铃设置的iPhone's
播放声音。我现在正在尝试使用AVAudioPlayer
,以便用户可以通过媒体卷play
发出声音。这是我目前(但未成功)使用播放声音的代码:
-(IBAction)playSound:(id)sender
{
AVAudioPlayer *audioPlayer;
NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Hello" ofType:@"wav"];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundFile] error:nil];
[audioPlayer prepareToPlay];
[audioPlayer play];
}
每当我在iPhone模拟器中运行此代码时,它都不会播放声音,但会显示大量输出。当我在iPhone上运行时,声音根本无法播放。在做了一些研究和测试之后,我发现自动引用计数正在释放audioPlayer
变量。此外,当audioPlayer变量被定义为我的接口文件中的实例变量和属性时,此代码有效,但它不允许我一次播放多个声音。
首先是第一件事:如何使用AVAudioPlayer
一次播放无限数量的声音并坚持使用自动参考计数?另外:当播放这些声音时,如何实现第二种IBAction
方法来停止播放所有这些声音?
答案 0 :(得分:16)
首先,将audioplayer
的声明和alloc / init放在同一行。此外,您每AVAudioPlayer
只能播放一首声音,但您可以同时制作任意数量的声音。然后停止所有声音,也许使用NSMutableArray
,将所有播放器添加到其中,然后迭代并[audioplayer stop];
//Add this to the top of your file
NSMutableArray *soundsArray;
//Add this to viewDidLoad
soundsArray = [NSMutableArray new]
//Add this to your stop method
for (AVAudioPlayer *a in soundsArray) [a stop];
//Modified playSound method
-(IBAction)playSound:(id)sender
{
NSString *soundFile = [[NSBundle mainBundle] pathForResource:@"Hello" ofType:@"wav"];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundFile] error:nil];
[soundsArray addObject:audioPlayer];
[audioPlayer prepareToPlay];
[audioPlayer play];
}
那应该做你需要的。