AVAudioEngine & AVAudioPlayerNode didFinish 方法类似于 AVAudioPlayer
AVAudioEngine & AVAudioPlayerNode didFinish method like AVAudioPlayer
是否有可能确定 AVAudioEngine
是否完成了播放的声音?以前我用过AVAudioPlayer
的函数:
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
// Code after finished the played sound
}
现在我需要一些效果,但没有 AVAudioEnginge
提供的功能来标识播放声音的结束。
找了很多,可惜在AVAudioEngine
的文档里只找到了这个函数:
var running: Bool { get }
我目前的解决方案是检查 "running" 布尔值,如果它为假,则玩家不再玩了。有人知道 AVAudioEngine
的更好解决方案吗?非常感谢!
我还使用了 NSTimer,因为我还没有找到任何其他 solution/delegate。但它只触发一次并在音频文件结束后立即开始(这意味着第一个参数 "seconds" 具有音频文件持续时间的值)。选择器是我的 "custom delegate" 函数。
我将 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()
希望对您有所帮助!
接受的答案似乎是在 SCHEDULING 完成后立即调用 completionHandler,而不是在音频文件播放完成后立即调用。
根据 iOS 11.0+ / macOS 10.13+ 使用:
self.player.scheduleBuffer(buffer, completionCallbackType: .dataPlayedBack completionHandler: {
print("Complete")
})
是否有可能确定 AVAudioEngine
是否完成了播放的声音?以前我用过AVAudioPlayer
的函数:
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
// Code after finished the played sound
}
现在我需要一些效果,但没有 AVAudioEnginge
提供的功能来标识播放声音的结束。
找了很多,可惜在AVAudioEngine
的文档里只找到了这个函数:
var running: Bool { get }
我目前的解决方案是检查 "running" 布尔值,如果它为假,则玩家不再玩了。有人知道 AVAudioEngine
的更好解决方案吗?非常感谢!
我还使用了 NSTimer,因为我还没有找到任何其他 solution/delegate。但它只触发一次并在音频文件结束后立即开始(这意味着第一个参数 "seconds" 具有音频文件持续时间的值)。选择器是我的 "custom delegate" 函数。
我将 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()
希望对您有所帮助!
接受的答案似乎是在 SCHEDULING 完成后立即调用 completionHandler,而不是在音频文件播放完成后立即调用。
根据 iOS 11.0+ / macOS 10.13+ 使用:
self.player.scheduleBuffer(buffer, completionCallbackType: .dataPlayedBack completionHandler: {
print("Complete")
})