我已将音频文件添加到我的Xcode项目中,以便我可以使用AvQueuePlayer
(AVPlayer
的子类)在本地播放它们。为了做到这一点,我必须创建一个[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上运行它没有音频出来。这首歌永远不会开始播放。并且,当在iPhone上运行时,如果我点击一行 - 然后等待几秒钟 - 然后点击一个调用queuePlayer.currentItem.currentTime()
的按钮, - 该应用程序在该行崩溃,我相信这是由于{ {1}}没有任何项目可以玩。
但是,为什么当我在手机上运行时,queuePlayer
无法从queuePlayer
获取项目...我可以将playerItemsArray?
数组的内容打印为以及fullSongPaths
的内容,但是queuePlayer不会播放它们......
答案 0 :(得分:1)
问题在于这一行:
let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)
当您手机上时,您无法播放计算机桌面上的歌曲文件。
我很惊讶这种情况在模拟器上起作用,事实上它可以合理地被认为是一个错误。
应用程序包中的文件需要 (这样当你在那里构建并运行它们时,它们会作为应用程序的一部分被复制到手机上),并且你需要通过他们的URL 引用作为应用程序包中的资源(也就是说,相对纯粹是应用程序包,因为它的URL不重要且可以更改)。