我正在制作一个简单的音频播放应用。它有大约10个音频文件,每个文件的正常播放速度为每分钟100次。用户能够在调用play()函数之前输入一个速度变量(介于70和140 b.p.m.之间),该变量被赋予(tempo / 100)到AVAudioPlayer rate var ...
@IBAction func playPause(sender: AnyObject) {
if !isPlaying {
let audioPath = NSBundle.mainBundle().pathForResource(selectedTrack, ofType: "mp3")
do {
try player = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath!))
player.enableRate = true
player.rate = Float(tempo) / 100
player.play()
isPlaying = !isPlaying
} catch {
print ("play error")
}
}
}
以音频的正常速度(100b.p.m)播放效果非常好。然而,通过甚至单个bpm单位改变速度,回放听起来确实很差。速度转换听起来很准确(即降低速度变化导致音频减慢,反之亦然),并且音高听起来就像它保持一样(尽管在持续音符中有点“颤抖”),但声音的质量似乎在很大程度上受到了负面影响。我可能期望这会有更极端的费率变化(费率<50%或费率> 200%),但即使在99%和101%也是如此。
我使用44k / 16bit .wav,然后尝试.mp3(各种品质),都具有相同的结果。我也看过这个,看起来有点相似(尽管查询从未解决)...... AVAudioPlayer rate change introduces artifacts/distortion
使用其他软件(DAW和虚拟DJ软件)更改这些文件的播放速度不会产生相同的异常,因此我的假设是,在波形上插入额外数据点的算法可能不够强大我的目的。
但如果有人能给我一个解决方案,那我就完全被激怒了。