Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift iOS中播放PCM文件_Ios_Swift_Audio - Fatal编程技术网

在Swift iOS中播放PCM文件

在Swift iOS中播放PCM文件,ios,swift,audio,Ios,Swift,Audio,我想在Swift 2.0中使用AVAudioEngine和AVAudioPlayerNode播放pcm文件。我是音频编程新手,不了解代码的问题: var audioEngine: AVAudioEngine = AVAudioEngine() var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode() @IBAction func playButton(sender: AnyObject) { v

我想在Swift 2.0中使用AVAudioEngine和AVAudioPlayerNode播放pcm文件。我是音频编程新手,不了解代码的问题:

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


    @IBAction func playButton(sender: AnyObject) {

    var file = "file7.pcm"
    var fileManager = NSFileManager.defaultManager()

    var wayToFile = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
    var passMusicFileURL: NSURL?

    if let documentPath: NSURL = wayToFile.first as NSURL! {
        let musicFile = documentPath.URLByAppendingPathComponent(file)

        passMusicFileURL = musicFile

        var audioFile = AVAudioFile()
        var audioBuffer = AVAudioPCMBuffer()

        do{
            audioFile = try AVAudioFile(forReading: passMusicFileURL!)
            let audioFormat = audioFile.processingFormat
            let audioFrameCount = UInt32(audioFile.length)

            audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: audioFrameCount)

        } catch {
            print("error!!! ")
        }

        do {
            try audioFile.readIntoBuffer(audioBuffer)
        } catch _{
            print("error")
        }

        var mainMixer = audioEngine.mainMixerNode
        audioEngine.attachNode(audioFilePlayer)
        audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioBuffer.format)

        do {
            try audioEngine.start()
        } catch _{

            print("error")
        }

        audioFilePlayer.play()
        audioFilePlayer.scheduleBuffer(audioBuffer, atTime: nil, options: AVAudioPlayerNodeBufferOptions.Loops, completionHandler: nil)
    }
}
我能够构建代码,但当我尝试运行它时,我得到以下错误:

错误:[0x1a1b6e000]AVAudioFile.mm:32:AVAudioFileImpl:ERROR 1954115647

我知道文件路径正确并且文件存在

有人知道我做错了什么吗?

使用Swift 4

 func playPCM(_ filefullpathstr: String) {
    do {
        let audioFile = try AVAudioFile(forReading: URL(fileURLWithPath: filefullpathstr))

        let audioFormat = audioFile.processingFormat
        let audioFrameCount = UInt32(audioFile.length)

        let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: audioFrameCount)

        try audioFile.read(into: audioFileBuffer!, frameCount: audioFrameCount)

        let mainMixer = audioEngine.mainMixerNode
        audioEngine.attach(audioFilePlayer)
        audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioFileBuffer?.format)

        try audioEngine.start()
        audioFilePlayer.play()
        audioFilePlayer.scheduleBuffer(audioFileBuffer!, at: nil, options: [], completionHandler: {

            DispatchQueue.main.async {
                //do sth ui ...
            }
        })
    } catch {
        debugPrint(#line, error)
    }
}

我忘了提到它是一个16位的线性PCM,您是否尝试过使用
scheduleFile(u:at:completionHandler:)