Macos 无法使用AVAudioPlayer播放相册

Macos 无法使用AVAudioPlayer播放相册,macos,swift,cocoa,avaudioplayer,Macos,Swift,Cocoa,Avaudioplayer,我正在开发一个非常简单的OSX应用程序,它允许我播放一首歌曲或一个歌曲文件夹。 我可以选择一首歌并播放,一切都很好。我可以选择一个文件夹,创建一组歌曲和。。。播放最后一个 var currentSong: NSURL? var album: [NSURL] = [] var audioPlayer = AVAudioPlayer() 我的游戏功能是 func playCurrent(){ do { try audioPlayer = AVAudioPlayer(

我正在开发一个非常简单的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似乎完全无法将自己作为一个正在运行的函数。预期的行为是,在游戏结束之前,它不会退出;观察到的行为是,它将在最短的时间内触碰每首歌曲,进入“去过那里”并返回到封闭的循环


在退出playCurrent功能之前,如何强制AVAudioPlayer播放整个文件?我在哪里可以找到这些信息?课程文档没有帮助,提到的音频指南不存在-现在,开发人员库没有提到OSX的任何基本音频指南。

答案是,一旦你了解它,确实非常明显。不幸的是,这些文档实际上毫无帮助。理论上,我可以通过查看AVFoundationFramework参考中的AVAudioPlayer条目找到解决方案,但我没有。我是通过疯狂地四处寻找和一次偶然的提及才发现它的

似乎没有工作的OSX示例;苹果的iOS示例使用了OSX上没有的MediaPlayer框架

解决办法如下: AVAudioPlayer只播放一个声音。 如果要播放多个声音,需要一个AVQueuePlayer,它还可以播放URL或AVPlayerItems队列中的单个声音。此类有一个initURL:方法。
如果有人知道为什么AVAudioPlayer会这样做,我还是很想听听

检查iOS示例代码,了解如何正确执行。对不起,没有Swift代码嗨,马瑞克,第一个链接只显示如何播放一个声音,我可以做到这一点;第二个链接是不在OSX10.11/Xcode 7.2b下编译的手动内存管理的iOS代码;考虑到它已经有六年的历史了,我对它的普遍可行性表示怀疑。它还使用MediaPlayer框架的setQueueWithItemCollection方法;这在OSX上不可用。歌曲结束后通知您的代理如何。还有谷歌一个有点AVxxx的网站:github.com。这可能会有帮助。