【问题标题】:iPhone: Change playback speed with Audio UnitsiPhone:使用音频单元更改播放速度
【发布时间】:2011-03-20 13:38:49
【问题描述】:
当使用音频单元时,有哪些不同的方法可以改变 iPhone 上音频的播放速度?每种解决方案的优缺点是什么?
我有一个混音器单元和一个 IO 单元。我需要添加另一个单元(例如转换器单元)吗?我应该在哪个(输入或输出)总线上设置哪些音频单元参数?
我目前的设置:
------------------------- -------------------------
| mixer unit | -----------> | IO unit |
------------------------- -------------------------
【问题讨论】:
标签:
iphone
audio
core-audio
audiounit
【解决方案1】:
以下所有解决方案都会改变音频的音高(以及播放速度)。要在播放速度更改后更正音频的音高,您需要使用第 3 方音频库(例如 SoundTouch,它具有 LGPL许可证,因此您可以在您的应用程序中使用它,而无需使其开源,或DiracLE 或免费的smbPitchShift)。有一个音频单元 (AUPitch),可以改变音频的音高,但它不适用于 iPhone;仅适用于 Mac。
以下所有解决方案都经过测试,并且可以正常工作...
解决方案 #1 [最佳解决方案]
3D 混合器单元:使用 3D 混合器单元代替多通道混合器单元并在输入范围上设置 k3DMixerParam_PlaybackRate。
优点: k3DMixerParam_PlaybackRate 可以在播放音频时实时设置,没有任何剪辑声音或其他副作用。一旦你有音频单元,它也很容易实现。
缺点:会影响音频的音高,但如果您只需要将播放速率更改 +/- 8%,音高的差异就不会很明显。
解决方案 #2
更改采样率:更改混音器单元输出总线上的采样率。更改采样率的工作方式与添加和删除样本非常相似。
优点:如果您想将播放速度乘以整数的分数(例如 1.2x),效果很好。
缺点:改变混频器输出的采样率不能即时设置;仅在初始化混音器单元时。会影响音频的音高,但如果您只需将播放速率更改 +/- 8%,音高差异就不会真正明显。
audioDescriptionMixerOutput.mSampleRate = 1.2*kGraphSampleRate;
解决方案 #3
添加/删除样本:在渲染回调函数中仅将每秒、第三...音频样本传递到音频单元(在我的情况下为混合器单元)的输入。
优点:如果您想将音频播放速度加快或减慢 2x、3x、4x 等,效果很好。它也很容易实现。
缺点:播放速度只能乘以整数倍。例如,通过添加或删除样本无法将音频播放速度提高 1.2 倍。影响音频的音高。