我已将音频文件添加到我的 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()
的按钮,-- 应用程序会在该行崩溃,我认为这是由于 queuePlayer
没有任何项目可以播放。
但是,为什么当我在手机上运行它时,queuePlayer
无法从 playerItemsArray 获取项目?
...我能够打印出fullSongPaths
数组以及 playerItemsArray
的内容,但queuePlayer不会播放它们...
最佳答案
问题是这一行:
let fullSongPath = ("/Users/username/Desktop/Xcode Projects Folder/LocalAudioPlayer/LocalAudioPlayer/" + songName)
当您使用手机时,您无法播放计算机桌面上的歌曲文件。
令我惊讶的是这在模拟器上有效,事实上它确实可以被合理地认为是一个错误。
这些文件需要在app bundle本身中(这样当你在那里构建和运行它时,它们会作为应用程序的一部分复制到手机上),并且您需要通过它们的 URL 将它们作为应用程序包中的资源引用(也就是说,纯粹相对于应用程序包,因为它的 URL 并不重要并且可以更改)。
关于ios - AvQueuePlayer 不在 iPhone 上播放音频,只能在模拟器上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34885878/