使用Swift的AVAudioEngine实时变桨
我正在使用Swift在OSX上开发一个音频效果应用程序,我对集成音高变换效果感兴趣 我想在实时,改变音调向上或向下的八度。目前我只收到一个干燥信号 我不确定这是否可能,我想知道这是否可能,或者任何人可能有任何帮助或建议 与问题相关的当前代码如下:使用Swift的AVAudioEngine实时变桨,swift,avfoundation,pitch,avaudioengine,pitch-shifting,Swift,Avfoundation,Pitch,Avaudioengine,Pitch Shifting,我正在使用Swift在OSX上开发一个音频效果应用程序,我对集成音高变换效果感兴趣 我想在实时,改变音调向上或向下的八度。目前我只收到一个干燥信号 我不确定这是否可能,我想知道这是否可能,或者任何人可能有任何帮助或建议 与问题相关的当前代码如下: import Cocoa import AVFoundation class ViewController: NSViewController { var engine = AVAudioEngine() var tim
import Cocoa
import AVFoundation
class ViewController: NSViewController {
var engine = AVAudioEngine()
var timePitch = AVAudioUnitTimePitch()
override func viewDidLoad() {
timePitch.pitch = 1200
// Setup engine and node instances
var mixer = engine.mainMixerNode
var input = engine.inputNode
var output = engine.outputNode
var format = input.inputFormatForBus(0)
var error:NSError?
engine.attachNode(timePitch)
engine.connect(input, to: timePitch, format: format)
engine.connect(timePitch, to: output, format: format)
engine.startAndReturnError(&error)
super.viewDidLoad()
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
检查。更多信息,请参阅教程中的示例
Swift 2.0的示例:
import UIKit
import AVFoundation
class ViewController: UIViewController {
var engine: AVAudioEngine!
var player: AVAudioPlayerNode!
var file = AVAudioFile()
override func viewDidLoad() {
super.viewDidLoad()
engine = AVAudioEngine()
player = AVAudioPlayerNode()
player.volume = 1.0
let path = NSBundle.mainBundle().pathForResource("in", ofType: "caf")!
let url = NSURL.fileURLWithPath(path)
let file = try? AVAudioFile(forReading: url)
let buffer = AVAudioPCMBuffer(PCMFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length))
do {
try file!.readIntoBuffer(buffer)
} catch _ {
}
let pitch = AVAudioUnitTimePitch()
//
pitch.pitch = -500 //Distortion
pitch.rate = 1.5 //Voice speed
//
engine.attachNode(player)
engine.attachNode(pitch)
engine.connect(player, to: pitch, format: buffer.format)
engine.connect(pitch, to: engine.mainMixerNode, format: buffer.format)
player.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Loops, completionHandler: nil)
engine.prepare()
do {
try engine.start()
} catch _ {
}
player.play()
}
}
虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决这个问题的附加上下文将提高答案的长期价值。谢谢您的建议@Donald duck。下次我会记住这一点,非常感谢分享。当我改变音高时,质量会改变。当费率发生变化时,有没有办法保持相同的质量
import UIKit
import AVFoundation
class ViewController: UIViewController {
var engine: AVAudioEngine!
var player: AVAudioPlayerNode!
var file = AVAudioFile()
override func viewDidLoad() {
super.viewDidLoad()
engine = AVAudioEngine()
player = AVAudioPlayerNode()
player.volume = 1.0
let path = NSBundle.mainBundle().pathForResource("in", ofType: "caf")!
let url = NSURL.fileURLWithPath(path)
let file = try? AVAudioFile(forReading: url)
let buffer = AVAudioPCMBuffer(PCMFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length))
do {
try file!.readIntoBuffer(buffer)
} catch _ {
}
let pitch = AVAudioUnitTimePitch()
//
pitch.pitch = -500 //Distortion
pitch.rate = 1.5 //Voice speed
//
engine.attachNode(player)
engine.attachNode(pitch)
engine.connect(player, to: pitch, format: buffer.format)
engine.connect(pitch, to: engine.mainMixerNode, format: buffer.format)
player.scheduleBuffer(buffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Loops, completionHandler: nil)
engine.prepare()
do {
try engine.start()
} catch _ {
}
player.play()
}
}
timePitch.pitch = 1000 //Filtered Voice
timePitch.rate = 1 //Normal rate