我正在开发一个非常简单的OSX应用程序,它允许我播放歌曲或歌曲文件夹。 我可以选择一首歌并播放它,一切都很好。我可以选择一个文件夹并创建一系列歌曲,然后...播放最后一个。
var currentSong: NSURL?
var album: [NSURL] = []
var audioPlayer = AVAudioPlayer()
我的演奏功能是
func playCurrent(){
do {
try audioPlayer = AVAudioPlayer(contentsOfURL: currentSong!)
} catch {
print("Ignoring errors for now")
}
audioPlayer.play()
}
每当我将currentSong设置为NSURL时,这都可以正常工作。我选择了一首歌,它会播放它。
我的相册功能如下:
@IBAction func chooseAlbumAndPlay(sender: AnyObject) {
album = albumFromFile()
for song in album {
currentSong = song
playCurrent()
}
}
在这里我遇到了问题。 albumFromFile打开一个NSOpenPanel,让我选择一个文件夹,并将可播放项目的路径转储到NSURL数组中。这个部分有效,我已经验证了,所以我真的有一个12或20或任何正确,可播放的URL的数组。如果我按原样运行,只播放任何专辑中的最后一首歌。如果我在playCurrent()函数中设置一个断点,我可以听到它实际上会播放一个小片段 - 在大多数情况下不是一个音符 - 除了最后一首之外的所有歌曲。 根据文档,play()返回一个布尔值 - 它会很高兴地报告它已经完成了在这个循环中播放每首歌曲。
我 - 人类 - 的意见是,当我听到所有歌曲时,一首歌才播放完毕。
如果我查询当前AVAudioPlayer的持续时间,它们都会报告完全合理的声音值。
我完全被这里难住了。 PlayCurrent似乎完全无法将自己断言为运行函数。预期的行为是,在play()完成播放之前它不会退出;观察到的行为是,它会在最短的时间内触摸每首歌曲,然后去那里。并返回封闭循环。
如何在退出playCurrent()函数之前强制AVAudioPlayer播放整个文件?我在哪里可以找到这些信息? (类文档没有用,上面提到的音频指南不存在 - 现在,开发人员库没有提到OSX的任何基本音频指南。
答案 0 :(得分:0)
答案是,一旦你解决它,确实非常明显。不幸的是,文档确实没有任何帮助。理论上,我可以通过查看AVFoundationFramework参考中的AVAudioPlayer条目找到解决方案,但我没有。 (我通过疯狂的铸造和机会提到它找到了它)。
似乎没有工作的OSX示例; Apple的iOS示例使用了OSX上没有的MediaPlayer框架。
解决方案如下:
AVAudioPlayer
播放单个声音。
如果你想播放多个声音,你需要一个AVQueuePlayer
,它也可以从一个URL或AVPlayerItem
的队列中播放一个声音(这个类有一个init(URL :)方法) 。
如果有人知道为什么AVAudioPlayer会像它那样表现,我仍然有兴趣听到它。