【问题标题】:Cannot play album with AVAudioPlayer无法使用 AVAudioPlayer 播放专辑
【发布时间】:2015-10-08 11:42:22
【问题描述】:

我正在开发一个非常简单的 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() 函数中设置断点,我可以听到它实际上会播放除最后一首歌曲之外的所有歌曲中的一个微小的 sn-p(在大多数情况下小于一个音符)。 根据文档, play() 返回一个布尔值 - 它会很高兴地报告它已经完成了循环中的每一首歌。

我的 - 人类 - 意见是,只有当我听完一首歌时,它才会播放完毕。

如果我查询当前 AVAudioPlayer 的持续时间,它们都会报告听起来完全合理的值。

我完全被难住了。 PlayCurrent 似乎完全无法将自己断言为正在运行的函数。预期的行为是它不会退出,直到 play() 完成播放;观察到的行为是它会在最短的时间内触及每首歌曲,然后“去过那里”并返回到封闭循环。

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

【问题讨论】:

  • 检查 iOS 示例代码并了解如何正确执行它。抱歉,没有 Swift 代码 developer.apple.com/library/ios/samplecode/avTouch/Listings/… developer.apple.com/library/ios/samplecode/AddMusic/Listings/…
  • 嗨 Marek,第一个链接只显示了如何播放单个声音(我可以这样做);第二个链接是手动内存管理的 iOS 代码,在 OSX10.11/Xcode 7.2b 下无法编译;鉴于它已有六年历史,我怀疑它的总体可行性。它还使用 MediaPlayer 框架的 setQueueWithItemCollection 方法;这在 OSX 上不可用。
  • 歌曲结束后通知您的代表怎么样。并且也google了一下“AVxxx网站:github.com”。这可能会有所帮助。

标签: macos swift cocoa avaudioplayer


【解决方案1】:

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

似乎没有可用的 OSX 示例; Apple 的 iOS 示例使用了 OSX 上不可用的 MediaPlayer 框架。

解决方法如下: AVAudioPlayer 播放单个声音。 如果你想播放多个声音,你需要一个AVQueuePlayer,它也可以从一个 URL 或AVPlayerItems 的队列中播放一个声音(这个类有一个 init(URL:) 方法)。 如果有人知道为什么 AVAudioPlayer 的行为如此,我仍然有兴趣听到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多