我正在使用Cocoa编写一款音频波形编辑器,具有广泛的缩放选项。在最宽的范围内,它显示了整首歌曲的波形(在视图中大约有10百万个样本)。在最窄的范围内,它显示了声波的像素精确表示(在视图中有大约1千个样本)。我想能够在这些缩放级别之间平滑地转换。一些商业编辑器(如Ableton Live)似乎以非常低廉的价格做到了这一点。
我的当前实现满足了我所需的缩放范围,但效率低下且不流畅。这个设计很大程度上受到了这篇关于使用Quartz绘制波形的优秀文章的启发:
http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/
我为各种缩减级别的音频文件创建了多个CGMutablePathRef。当我缩放到最小时,我使用已经减少到每x千个样本一个点的路径。当我缩放到最大时,我使用包含每个样本的点的路径。当我处于缩减级别之间时,我水平缩放路径。这使其功能正常,但仍然相当昂贵且在缩减级别之间转换时会出现伪影。
有一个想法是如何使这个过程更加便宜,那就是去掉反锯齿。我的编辑器中的波形是反锯齿的,而Ableton的不是(请参见下面的比较)。
我没有看到在CGMutablePathRef中关闭反锯齿的方法。在Cocoa世界中是否有非反锯齿的CGMutablePathRef替代品?如果没有,有人知道一些OpenGL类或示例代码可以帮助我更有效地绘制大型线条吗?
更新于2014年1月21日:现在有一个非常好的库可以完全满足我的需求:https://github.com/syedhali/EZAudio