AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer

Posted

技术标签:

【中文标题】AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer【英文标题】:AVAudioEngine & AVAudioPlayerNode didFinish method like AVAudioPlayer 【发布时间】:2015-12-12 09:46:07 【问题描述】:

是否有可能确定AVAudioEngine 是否完成了播放声音?过去我使用AVAudioPlayer的函数:

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

现在我需要一些效果,但没有 AVAudioEnginge 的函数来标识播放声音的结束。

查了很多,可惜在AVAudioEngine的文档中只找到了这个func:

var running: Bool  get 

我当前的解决方案是检查“正在运行”布尔值,如果它为假,则播放器不再播放。有人知道AVAudioEngine 的更好解决方案吗?非常感谢!

【问题讨论】:

我目前的解决方案:我有一个 NSTimer,每毫秒触发一个事件。如果 AVAudioEngine 达到其结束时间,我会手动触发我自己的 didFinish 函数......如果有人有更好的解决方案,请随时在这里分享。谢谢。 【参考方案1】:

我将一个 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()

希望对你有帮助!

【讨论】:

乐于助人!如果这对您有用,请将其标记为答案。【参考方案2】:

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

【讨论】:

以上是关于AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioEngine & AVAudioPlayerNode didFinish 方法,如 AVAudioPlayer

匹配 AVAudioEngine 的输入和输出硬件设置

AvaudioEngine - 以特定采样率录制语音 AvaudioEngine for Analysis

在 iOS 上使用 avaudioengine 会破坏 avplayer

使用 AVAudioEngine 进行电平测量

设置 AVAudioEngine 输入和输出设备