2016-01-19 4 views
0

Я добавил аудио файлы к моему проекту 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 обыкновение играть в них ...

ответ

1

проблема эта линия:

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

вы не можете воспроизвести файл песни, что на вашем компьютера рабочем столе, когда вы на телефон.

Я удивлен, что это сработало на симуляторе, и тот факт, что он это сделал, можно было бы разумно считать ошибкой.

Файлы должны быть в приложение пачке сам (так что они копируются на телефон как часть приложения, когда вы строите и запустить его там), и вам необходимо обратиться к ним через свои URL-адреса в качестве ресурсов в комплекте приложений (то есть относительно исключительно для пакета приложений, поскольку его URL-адрес не имеет значения и может измениться).

+0

Хорошо спасибо за это! Я изменил свой код на 'let path = NSBundle.mainBundle(). PathsForResourcesOfType (" mp3 ", inDirectory: nil) для i в 0 ... path.count - 1 { print (путь [i]) }' ... который возвращает массив строк, которые являются правильным путем в наборе на мобильном устройстве, ведущем к mp3-файлу, который затем я использую для создания '[NSURLs]', которые затем используются для создания '[AVPlayerItems]', который воспроизводятся через AVQueuePlayer – MikeG

+1

Звучит здорово. Если вы используете 'URLsForResources ...', вы можете пропустить преобразование пути в URL, и это было бы лучше. – matt

Смежные вопросы