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 播放多个声音(一个接一个)
同时使用 AVAudioRecorder 和 AVAudioPlayer (或另一种收听和播放声音的方式)
同步Iphone中两个或多个AVAudioPlayer的播放