让AVAudioEngine重复一个声音

时间:2014-11-10 20:49:22

标签: ios swift

我一直无法使下面的代码一遍又一遍地重复audioURL的声音。现在它只是在视图打开时播放一次,然后停止。

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)
        myPlayer.play()


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

谢谢!

1 个答案:

答案 0 :(得分:9)

经过数小时和数小时的搜索,这样做了:

class aboutViewController: UIViewController {


        var audioEngine: AVAudioEngine = AVAudioEngine()
        var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode()

        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.


            let filePath: String = NSBundle.mainBundle().pathForResource("chimes", ofType: "wav")!
            println("\(filePath)")
            let fileURL: NSURL = NSURL(fileURLWithPath: filePath)!
            let audioFile = AVAudioFile(forReading: fileURL, error: nil)
            let audioFormat = audioFile.processingFormat
            let audioFrameCount = UInt32(audioFile.length)
            let audioFileBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: audioFrameCount)
            audioFile.readIntoBuffer(audioFileBuffer, error: nil)

            var mainMixer = audioEngine.mainMixerNode
            audioEngine.attachNode(audioFilePlayer)
            audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioFileBuffer.format)
            audioEngine.startAndReturnError(nil)

            audioFilePlayer.play()
            audioFilePlayer.scheduleBuffer(audioFileBuffer, atTime: nil, options:.Loops, completionHandler: nil)
        }