AVAudioPlayer Help:同时播放多个声音,一次停止所有声音,并解决自动参考计数问题

时间:2012-06-25 18:09:43

标签: iphone objective-c ios audio avaudioplayer

我正在尝试创建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方法来停止播放所有这些声音?

1 个答案:

答案 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];
     }

那应该做你需要的。