1

我必须在我的应用程序中为音频文件 (CMK.mp3) 绘制波形。为此,我尝试了此解决方案

由于此解决方案使用的是 AVAssetreader,因此显示波形需要花费两个时间。

谁能帮忙,有没有其他方法可以快速显示波形?谢谢

4

1 回答 1

0

AVAssetReader 是读取 AVAsset 的唯一方法,因此无法解决。您将需要调整代码以处理它,而不会产生不必要的开销。我还没有尝试过该代码,但我打算用它来构建一个示例项目,以便在我有时间时在 GitHub 上共享,希望很快。

我调整它的方法是执行以下操作:

  1. 消除所有 Objective-C 方法调用并仅使用 C
  2. 将所有工作移至主队列之外的辅助队列,并使用块回调完成的工作

渲染波形的一个障碍是一次不能运行多个 AVAssetReader,至少在我上次尝试时是这样。(可能随着 iOS 6 的变化而改变)一个新的阅读器取消另一个并中断播放,所以你需要按顺序完成你的工作。我用队列做到这一点。

在我构建的音频应用程序中,它将 CMSampleBufferRef 读取到可以容纳多个样本缓冲区的 CMBufferQueueRef 中。(请参阅 AVAssetReader 上的 copyNextSampleBuffer)您可以配置队列以在 AVAssetReader 完成读取资产后为您提供足够的时间来处理波形,以便当前播放不会在您开始读取更多缓冲区之前耗尽 CMBufferQueueRef 的内容下一首曲目。当我尝试时,这将是我的方法。我只需要注意不要通过使缓冲区太大或使缓冲区太大而导致播放问题来使用太多内存。我只是不知道处理波形需要多长时间,我会在我的旧 iPod 和 iPhone 4 上对其进行测试,然后再在我的 iPhone 5 上进行测试,看看它们是否都表现良好。

一定要尽可能靠近 C。在此处理期间对 Objective-C 资源的调用将导致潜在的线程切换和其他运行时开销成本,这些开销非常大,足以引起注意。你会想要避免这种情况。我可以做的是设置 Key-Value Observing (KVO) 来触发 AVAssetReader 快速启动下一个任务,这样我就可以保持音轨之间的无间隙播放。

一旦我开始我的音频实验,我会将它们放在 GitHub 上。我创建了一个存储库,我将在其中完成这项工作。如果你有兴趣,你可以“观看”那个 repo,这样你就会知道我什么时候开始提交更新。

https://github.com/brennanMKE/Audio

于 2013-01-07T16:21:56.717 回答