AvQueuePlayer 无法在 iPhone 上播放音频,只能在模拟器上运行
AvQueuePlayer not playing audio on iPhone, only working on simulator
我已将音频文件添加到我的 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 上没有音频出来。这首歌永远不会开始播放。而且,当 运行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 不重要并且可以更改)。
我已将音频文件添加到我的 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 上没有音频出来。这首歌永远不会开始播放。而且,当 运行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 不重要并且可以更改)。