首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAudioEngine & AVAudioPlayerNode didFinish方法与AVAudioPlayer

AVAudioEngine & AVAudioPlayerNode didFinish方法与AVAudioPlayer
EN

Stack Overflow用户
提问于 2015-12-12 09:46:07
回答 3查看 2.7K关注 0票数 4

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

代码语言:javascript
复制
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
    // Code after finished the played sound
}

现在我需要一些效果,但没有功能的AVAudioEnginge,如果识别的结束播放的声音。

我搜索了很多,但不幸的是我只在AVAudioEngine的文档中找到了这个功能。

代码语言:javascript
复制
var running: Bool { get }

我目前的解决方案将是检查“运行”布尔值,如果它是假的,玩家不再玩。有人知道更好的AVAudioEngine解决方案吗?非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-29 21:18:08

我在引擎上附加了一个AVAudioPlayerNode

代码语言:javascript
复制
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()

我希望这能帮上忙!

票数 3
EN

Stack Overflow用户

发布于 2015-12-24 14:14:20

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

票数 2
EN

Stack Overflow用户

发布于 2022-05-05 11:54:23

所接受的答案似乎是在调度完成后立即调用completionHandler,而不是在播放完音频文件之后立即调用。

根据iOS 11.0+ / macOS 10.13+使用:

代码语言:javascript
复制
self.player.scheduleBuffer(buffer, completionCallbackType: .dataPlayedBack completionHandler: {
    print("Complete")
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34238432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档