Я добавил аудио файлы к моему проекту Xcode, чтобы я мог их воспроизводить локально, используя AvQueuePlayer
(подкласс AVPlayer
). Для того, чтобы сделать это, я должен создать массив [AVPlayerItems]
, который затем подается в AVQueuePlayer
для воспроизведения последовательно ... вот мой код ...AvQueuePlayer не воспроизводит звук на iPhone, работает только на симуляторе
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 path = NSBundle.mainBundle(). PathsForResourcesOfType (" mp3 ", inDirectory: nil) для i в 0 ... path.count - 1 { print (путь [i]) }' ... который возвращает массив строк, которые являются правильным путем в наборе на мобильном устройстве, ведущем к mp3-файлу, который затем я использую для создания '[NSURLs]', которые затем используются для создания '[AVPlayerItems]', который воспроизводятся через AVQueuePlayer – MikeG
Звучит здорово. Если вы используете 'URLsForResources ...', вы можете пропустить преобразование пути в URL, и это было бы лучше. – matt