4

我正在尝试创建play单个声音文件的按钮和当前正在播放的所有声音的button按钮。如果用户在短时间内stops单击多个按钮或相同的按钮,则应用程序应该同时播放所有声音。button使用 iOS 的系统声音服务,我很容易做到这一点。但是,系统声音服务会通过铃声设置来播放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方法来停止播放所有这些声音?

4

1 回答 1

17

首先,将声明和 alloc/initaudioplayer放在同一行。此外,您只能播放一种声音,AVAudioPlayer但您可以同时制作任意数量的声音。然后停止所有声音,也许使用 a 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];
  }

那应该做你需要的。

于 2012-06-25T18:35:31.660 回答