AvQueuePlayer 无法在 iPhone 上播放音频,只能在模拟器上运行

AvQueuePlayer not playing audio on iPhone, only working on simulator

我已将音频文件添加到我的 Xcode 项目中,以便我可以使用 AvQueuePlayerAVPlayer 的子类)在本地播放它们。为此,我必须创建一个 [AVPlayerItems] 数组,然后将其提供给 AVQueuePlayer 以按顺序播放...这是我的代码 ...

override func viewDidLoad() {

//fills songNameArray with the appropriate part of file name, example: print(songNameArray[0]) -> prints -> "SongName.mp3"
   let path = NSBundle.mainBundle().resourcePath!
  let songFiles = try! NSFileManager.defaultManager().contentsOfDirectoryAtPath(path)
    for item in songFiles {
        if item.hasSuffix("mp3") {
            songNameArray.append(item)
            print("appended to songNameArray \(item)")
        }
    }

 //iterates thru songNameArray and uses combineStrings method to form fullSongPath//
    for i in 0...songNameArray.count - 1 {
        fullSongPaths.append(combineStrings(songNameArray[i]))
        print("here are the full song paths \(fullSongPaths[i])")
    }

 func combineStrings(songName: String) -> String {
    let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)
    return fullSongPath
    }
}

然后,这是我的 didSelectRowAtIndexPath,用户点击一首歌曲开始播放...

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

      makePlayerItemsArray()

      queuePlayer = AVQueuePlayer(items: playerItemsArray)
      queuePlayer?.play()
  }

这里是 makePlayerItemsArray 函数 ...

    func makePlayerItemsArray () {
       playerItemsArray.removeAll()

       var createdURL = NSURL()
       var createdItem = AVPlayerItem(URL: createdURL)

       for i in 0...fullSongPaths.count - 1 {
           createdURL = NSURL.fileURLWithPath(fullSongPaths[i])
           createdItem = AVPlayerItem(URL: createdURL)
           playerItemsArray.append(createdItem)
       }
   }

这一切在电脑上都能完美运行,点击一行后几乎立即开始播放音频。问题是当我 运行 在我的 iPhone 上没有音频出来。这首歌永远不会开始播放。而且,当 运行ning 在 iPhone 上时,如果我点击一行——然后等待几秒钟——然后点击一个调用 queuePlayer.currentItem.currentTime() 的按钮——应用程序会在该行崩溃,我认为这是由于 queuePlayer 没有任何项目可玩。

但是为什么,当我 运行 它在我的 phone 上时 queuePlayer 没有从 playerItemsArray? 中获取项目...我能够打印出fullSongPaths 数组的内容以及 playerItemsArray 的内容,但 queuePlayer 不会播放它们...

问题出在这一行:

let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)

当您在 phone 上时,您无法播放 计算机 桌面上的歌曲文件。

我很惊讶这在模拟器上有效,而且它确实可以合理地被认为是一个错误。

文件需要 app bundle 本身中(以便它们作为一部分复制到 phone当你构建应用程序时 运行 它在那里),你需要通过他们的 URL 作为应用程序包中的资源 引用 作为资源(即,纯粹相对于应用程序包,因为它 URL 不重要并且可以更改)。