2015-11-19 86 views
3

我試圖在Swift中使用AVAudioEngine()來改變聲音的音高。這是我的代碼:AVAudioEngine()播放不工作

func setUpEngine() { 
    let fileString = NSBundle.mainBundle().pathForResource("400", ofType: "wav") 
    let url = NSURL(fileURLWithPath: fileString!) 
    do { 
     try audioFile = AVAudioFile(forReading: url) 
     print("done") 
    } 
    catch{ 

    } 
} 
var engine = AVAudioEngine() 
var audioFile = AVAudioFile() 
var audioPlayerNode = AVAudioPlayerNode() 
var changeAudioUnitTime = AVAudioUnitTimePitch() 
override func viewDidLoad() { 
    setUpEngine() 
    let defaults = NSUserDefaults.standardUserDefaults() 
    audioPlayerNode.stop() 
    engine.stop() 
    engine.reset() 
    engine.attachNode(audioPlayerNode) 
    changeAudioUnitTime.pitch = 800 
    engine.attachNode(changeAudioUnitTime) 
    engine.connect(audioPlayerNode, to: changeAudioUnitTime, format: nil) 
    engine.connect(changeAudioUnitTime, to: engine.outputNode, format: nil) 
    audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
    engine.startAndReturnError(nil) 
    audioPlayerNode.play() 

我的代碼的其餘部分在下面(我關閉括號)。 我發現大多數代碼在網上和我得到一個錯誤與線

engine.startAndReturnError(nil) 

'Value of type has no member'.

當我刪除此行中我得到以下錯誤:

'AVAudioPlayerNode.mm:333: Start: required condition is false: _engine->IsRunning() Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: _engine->IsRunning()''

任何幫助將不勝感激。我在xCode和單個視圖應用程序中使用Swift。

回答

-1

這是因爲您正在運行XCode的過時版本或iOS的不兼容版本。我有這個問題,並在最新的Swift版本沒有這樣的方法,而是他們提供.start()。

2

錯誤在於引擎沒有運行。您需要重新排列你這樣的操作...

setUpEngine() 
let defaults = NSUserDefaults.standardUserDefaults() 
engine.attachNode(audioPlayerNode) 
engine.attachNode(changeAudioUnitTime) 
engine.connect(audioPlayerNode, to: changeAudioUnitTime, format: nil) 
engine.connect(changeAudioUnitTime, to: engine.outputNode, format: nil) 
changeAudioUnitTime.pitch = 800 
engine.prepare()  
engine.start()  
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
audioPlayerNode.play() 

一段時間後...

engine.stop()