我正在 Cocoa 中编写一个具有多种缩放选项的音频波形编辑器。在最宽处,它显示了整首歌曲的波形(大约 1000 万个样本)。在最窄处,它显示了声波的像素精确表示(视图中约 1000 个样本)。我希望能够在这些缩放级别之间平滑过渡。一些像 Ableton Live 这样的商业编辑器似乎以一种非常便宜的方式来做到这一点。
我当前的实现满足了我想要的缩放范围,但效率低下且不稳定。该设计很大程度上受到这篇关于用石英绘制波形的优秀文章的启发:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
我为音频文件创建了多个 CGMutablePathRef's 在不同的减少级别。当我一直放大时,我使用已减少到每 x 千个样本一个点的路径。当我一直放大时,我使用包含每个样本的点的路径。当我处于减少级别之间时,我会水平缩放路径。这使它具有功能性,但仍然非常昂贵,并且在减少级别之间转换时会出现伪影。
关于如何降低成本的一个想法是取消抗锯齿。我的编辑器中的波形是抗锯齿的,而 Ableton 中的波形不是(参见下面的比较)。
我看不到关闭 CGMutablePathRef 的抗锯齿的方法。在 Cocoa 的世界中是否有 CGMutablePathRef 的非抗锯齿替代品?如果没有,是否有人知道一些 OpenGL 类或示例代码可能会让我更有效地绘制我的大线?
2014 年 1 月 21 日更新:现在有一个很棒的库可以完全满足我的需求:https ://github.com/syedhali/EZAudio