iPhone中任何音频的波形表示

时间:2012-06-21 18:07:47

标签: iphone objective-c waveform

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

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

任何人都可以帮忙,有没有其他方法可以快速显示波形? 感谢

1 个答案:

答案 0 :(得分:0)

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

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

  1. 取消所有Objective-C方法调用并仅使用C
  2. 将所有工作移至主队列的辅助队列,并使用块来回调一个已完成的
  3. 渲染波形的一个障碍是你不能一次运行多个AVAssetReader,至少我上次尝试过。 (它可能已经改变了iOS 6)新的阅读器取消了另一个并且中断了播放,所以你需要按顺序完成你的工作。我是用队列做的。

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

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

    一旦我开始我的音频实验,我会将它们放在GitHub上。我已经创建了一个存储库,我将完成这项工作。如果您感兴趣,可以“观察”该回购,以便在我开始提交更新时知道。

    https://github.com/brennanMKE/Audio