如何确切地知道为啥声音开始播放?

Posted

技术标签:

【中文标题】如何确切地知道为啥声音开始播放?【英文标题】:How to know EXACTLY why a sound starts playing?如何确切地知道为什么声音开始播放? 【发布时间】:2011-02-18 22:10:07 【问题描述】:

我需要播放 mp3 格式的音频剪辑,并将我的应用程序中的某些内容与正在播放的音频同步。我应该使用 iPhone SDK 中的哪些音频工具来准确知道所选声音何时开始播放?

有时在使用 AVAudioPlayer 时,我注意到当声音开始播放时,从我命令播放器播放到我真正听到声音(我猜它在那段时间加载声音)之间会有一点延迟。我找不到 AVAudioPlayer 的“准备播放”委托方法。

任何建议/指针表示赞赏。

【问题讨论】:

【参考方案1】:

如果您想尽量减少任何潜在的延迟,您应该在需要声音之前使用AVAudioPlayer 类prepareToPlay 方法(如果您还没有这样做),然后在需要声音时调用play您想开始播放。

【讨论】:

我知道准备玩了,我担心它可能会由于某种未知原因而延迟并最终不同步。如果有一种方法可以验证音频是否准备好播放或在播放时通过时间戳进行指示,那就太好了。音频队列显然是这样做的(正如我使用的另一张海报所建议的那样)。【参考方案2】:

您需要多紧密的同步?对于 mp3,总是存在一些解码不确定性,因此您需要提前 prepareToPlay 以消除其中的一些不确定性。

但更好的方法是将原始 PCM 样本提供给 Audio Unit RemoteIO API,这通常可以使您的延迟低于 60 Hz 视频帧。

【讨论】:

【参考方案3】:

要准确同步音频播放,您需要使用音频队列服务。它是一个 C 接口,提供更细粒度的音频控制。我无法准确告诉您如何同步,因为我没有这方面的经验,也许其他人可以提供帮助。但是,如果您希望查看文档,这将引导您朝着正确的方向前进。

【讨论】:

这是我所需要的,但显然要实施更多的工作并且记录不充分。新书形式的 safari 正在制作中,但尚未发布。谢谢。 当然。我不确定同步部分,但 AudioQueueServices 的播放部分并不像看起来那么难。不过还是很难:) Audio Queue 不会像 Audio Unit RemoteIO API 那样为您提供那么短的启动延迟(低延迟)。音频队列的启动延迟通常足够大,足以让用户注意到。

以上是关于如何确切地知道为啥声音开始播放?的主要内容,如果未能解决你的问题,请参考以下文章

为啥播放视频文件只有声音没有图像

为啥 PyGame 不播放声音

我如何知道声音是不是在 android 中播放完毕?

如何简单地预加载声音并在 Java 中播放?

添加到声音的延迟

为啥我的 Java 应用程序没有在每个循环中播放声音?