所以我一直在努力让AVAudioEngine为我重复一个声音。我需要它一遍又一遍地播放曲目(约26秒)。它需要使用AVAudioEngine,而不是AVAudioPlayer,因为我需要能够改变它的音调。我找到了改变音调和强制声音重复的例子,但仅限于正弦波,下面的链接。
我的旧代码(在尝试实现问题之前)如下所示。按下按钮时,它会播放一次声音,但不会再次播放声音。
import UIKit
import AVFoundation
class aboutViewController: UIViewController {
var audioUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("chimes", ofType: "wav")!)
var audioEngine = AVAudioEngine()
var myPlayer = AVAudioPlayerNode()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
audioEngine.attachNode(myPlayer)
var audioFile = AVAudioFile(forReading: audioUrl, error: nil)
var audioError: NSError?
audioEngine.connect(myPlayer, to: audioEngine.mainMixerNode, format: audioFile.processingFormat)
myPlayer.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
audioEngine.startAndReturnError(&audioError)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func toggleSideMenu(sender: AnyObject) {
toggleSideMenuView()
}
@IBAction func testSound(sender: AnyObject) {
myPlayer.play()
}
}
我的代码尝试在下面执行重复操作,但这并没有做任何事情(不会崩溃)。
import UIKit
import AVFoundation
class aboutViewController: UIViewController {
var audioUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("chimes", ofType: "wav")!)
var audioEngine = AVAudioEngine()
var myPlayer = AVAudioPlayerNode()
var audioError: NSError?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
audioEngine.attachNode(myPlayer)
var buffer = AVAudioPCMBuffer(PCMFormat: myPlayer.outputFormatForBus(0),frameCapacity:100)
buffer.frameLength = 100
var mixer = audioEngine.mainMixerNode
var audioFile = AVAudioFile(forReading: audioUrl, error: nil)
audioEngine.connect(myPlayer, to: audioEngine.mainMixerNode, format: audioFile.processingFormat)
audioEngine.startAndReturnError(&audioError)
myPlayer.play()
myPlayer.scheduleBuffer(buffer, atTime: nil, options:.Loops , completionHandler: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func testSound(sender: AnyObject) {
}
}
所以我要问的是:你能把一个反复播放音频文件的例子放在一起,并在顶部有一个变量(例如:let tone:Int = 100) ,设置音频文件将重复播放的音调。
感谢您的帮助!
链接:
重复正弦波示例:http://www.tmroyal.com/playing-sounds-in-swift-audioengine.html