swift2 AVAudioEngine和AVAudioPlayerNode使用了类似AVAudioPlayer的结束方法

pdtvr36n  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(174)

有没有可能识别AVAudioEngine是否完成了它播放的声音?在过去我使用AVAudioPlayer的函数:

func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
    // Code after finished the played sound
}

现在我需要一些效果,但是没有提供AVAudioEnginge的函数来标识播放声音的结束。
我搜索了很多,但不幸的是,我在AVAudioEngine的文档中只找到了这个函数:

var running: Bool { get }

我目前的解决方案是检查“running”布尔值,如果它是false,那么玩家就不再玩游戏了。有人知道AVAudioEngine的更好的解决方案吗?非常感谢!

bfnvny8b

bfnvny8b1#

我将AVAudioPlayerNode附加到引擎

player = AVAudioPlayerNode()

    let file = try! AVAudioFile(forReading: url)
    let buffer = AVAudioPCMBuffer(PCMFormat: file.processingFormat, frameCapacity: AVAudioFrameCount(file.length))

    do {
        print("read")
        try file.readIntoBuffer(buffer)
    } catch _ {
    }

engine.attachNode(player)
engine.connect(player, to: engine.mainMixerNode, format: nil)

self.player.scheduleBuffer(buffer, completionHandler: {
    print("Complete")
})

        engine.prepare()
    do {
        try engine.start()
    } catch _ {
        print("Play session Error")
    }

    player.play()

我希望这对你有帮助!

kg7wmglp

kg7wmglp2#

我还使用了一个NSTimer,因为我还没有找到任何其他的解决方案/委托。但是它只触发一次,并且在音频文件结束后立即启动(这意味着,第一个参数“seconds”的值为音频文件的持续时间)。选择器是我的“自定义委托”函数。

bgtovc5b

bgtovc5b3#

已接受的答案似乎在SCHEDULING完成时就调用completionHandler,而不是在音频文件播放完成时调用。
根据iOS 11.0及以上版本/ macOS 10.13及以上用途:

self.player.scheduleBuffer(buffer, completionCallbackType: .dataPlayedBack completionHandler: {
    print("Complete")
})

相关问题