AVAudioPlayer 在我的 iPhone 上播放短音?

Posted

技术标签:

【中文标题】AVAudioPlayer 在我的 iPhone 上播放短音?【英文标题】:AVAudioPlayer to play short sounds on my iPhone? 【发布时间】:2009-07-27 05:41:48 【问题描述】:

我想用 AVAudioPlayer 播放短音...因为我比系统声音有更多的控制权。

我有几个按钮连接起来播放几种不同的短音。 每个声音文件大约 1.5 - 2.0 秒。

一切正常...除了 ...我必须等待声音停止,然后才能按下按钮,声音会再次播放。

目前,单个 AVAudioPlayers 是在 viewDidLoad 上创建的......并且在按下按钮时会调用声音来播放

我尝试在按下按钮时创建播放器...这解决了上述问题...但一段时间后应用程序崩溃...所有声音停止工作。

有什么想法吗? 谢谢 乔纳森

【问题讨论】:

【参考方案1】:

如果 AVAudioPlayer 停止播放声音,通常是因为创建的播放器实例太多,通常是泄漏。你应该确保在完成后释放一些。

【讨论】:

【参考方案2】:

播放前需要将播放器的currentTime设置为0。在播放时调用 [player play] 无效。

player.currentTime = 0;
[player play];

【讨论】:

【参考方案3】:

创建新的很好,但请确保您的标题声明并执行此操作:

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) completed 
    [player release];                           

根据 mahboudz 的建议,如果您的应用程序很简单,那么将释放不再需要的任何已完成操作的内存。

这可能无法完全防止崩溃,具体取决于您的声音文件大小以及您是否解除了场景的分配。您可能需要添加

if (self.view.superview)  //release 

什么的。

这都是内存处理。您可能想复习一下指针,以了解如何处理您的播放器对象,实际上是在任何函数中,并且仍然可以轻松地将 release 放置在 dealloc 或 didFinish: 委托函数中,并知道为什么它不属于另一个。

iPhone随时可能被打断、停止、乱七八糟,所以你必须知道如何处理内存,以及当它发生时如何处理。我刚刚经历了一次类似性质的崩溃,上面的一切都适用于它。在不知道指针的情况下,NSXML 代表将是一场噩梦……对于 AVAudioPlayer 也是如此

【讨论】:

【参考方案4】:

如果您打算使用大量短音,您可能需要考虑切换到 OpenAL。 它并没有更复杂,您以后在更复杂的音频设置中会省去一些麻烦。

有一个教程和一些有用的代码可用here (archived here)。

【讨论】:

链接暂时无法访问。 没错,只需搜索“iphone-programming-part-6-multiple-sounds-with-openal”并查看谷歌缓存。【参考方案5】:

这可能是因为您在 viewDidLoad() 中创建了 AVAudioPlayers。我记得我有同样的问题。只需在类中初始化它们,但不在类中。希望它有效!

编辑: 好的,我看到了日期... 2009...

【讨论】:

以上是关于AVAudioPlayer 在我的 iPhone 上播放短音?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:AVAudioPlayer 是不是支持 .wav 格式?

iphone-AVAudioPlayer 重叠

iPhone - AVAudioPlayer、kAudioSessionCategory_AmbientSound 和 iPod 音乐

AVAudioPlayer 无法在某些设备上播放

静音按钮不会静音 AVAudioPlayer

带有 iOS 6 AVAudioPlayer 的 iPhone 4S 工作正常,但没有声音