AVAudioPlayer 帮助:同时播放多个声音,一次停止所有声音,并解决自动引用计数

Posted

技术标签:

【中文标题】AVAudioPlayer 帮助:同时播放多个声音,一次停止所有声音,并解决自动引用计数【英文标题】:AVAudioPlayer Help: Playing multiple sounds simultaneously, stopping them all at once, and working around Automatic Reference Counting 【发布时间】:2012-06-25 18:09:43 【问题描述】:

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

【问题讨论】:

值得注意的是,在ARC下,你不能只分配AVAudioPlayer的本地实例并播放它。你必须以某种方式保留它。一个强大的属性在我的案例中起作用。 【参考方案1】:

首先,将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];
  

这应该可以满足您的需要。

【讨论】:

谢谢,这很好用。仅供参考,除了允许在 stop 方法中操作音频播放器之外,将音频播放器放入数组是否会阻止自动引用计数在 playSound 方法结束之前释放音频播放器的内存? 应该,但是 ARC 习惯于完美地工作,直到它随机不工作为止。我不会担心的。 为了避免泄漏,您希望设置 audioPlayer 的委托,并在以下委托方法中从数组中删除引用:- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player 成功:(BOOL)标志 [self.soundsArray removeObject:player];

以上是关于AVAudioPlayer 帮助:同时播放多个声音,一次停止所有声音,并解决自动引用计数的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVAudioPlayer 播放多个声音(一个接一个)

使用 AVAudioPlayer 一次播放多个声音

同时使用 AVAudioRecorder 和 AVAudioPlayer (或另一种收听和播放声音的方式)

同步Iphone中两个或多个AVAudioPlayer的播放

(iphone) 如何使用 AVAudioPlayer 顺序播放声音?

Swift 3 多个 AVAudioPlayer