2015-06-05 3 views
-1

Я знаю, что этот вопрос во всем переполнении стека, но все же, большинство из них старые и не связаны с тем, что я собираюсь задать здесь.«AVPlayerItem не может быть связан с несколькими экземплярами AVPlayer»

Итак, у меня есть массив с AVPlayerItems и AVQueuePlayer. Сначала я поставил AVQueuePlayer воспроизведение элементов массива:

func mediaPicker(mediaPicker: MPMediaPickerController!, didPickMediaItems mediaItemCollection: MPMediaItemCollection!) { 

    mediaItems = mediaItemCollection.items 

    for thisItem in mediaItems as [MPMediaItem] { 

     var itemUrl = thisItem.valueForProperty(MPMediaItemPropertyAssetURL) as? NSURL 
     var playerItem = AVPlayerItem(URL: itemUrl) 
     mediaArray.append(playerItem)   

    } 

    updateMetadata() 

    audioPlayer = AVQueuePlayer(items: mediaArray) 


    self.dismissViewControllerAnimated(true, completion: nil) 

} 

Но, когда пользователь, например, добавляет новый элемент или удалить один, я попробуйте обновить плеер (так же, как я поставил его в первое место), но это дает мне ошибку. Я хочу знать, есть ли что-то в этом роде или любое решение. Это как пользователь удаляет песню:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
     if editingStyle == UITableViewCellEditingStyle.Delete{ 
      mediaArray.removeAtIndex(indexPath.row) 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
      audioPlayer = AVQueuePlayer(items: mediaArray) //here gives the error 
     } 
    } 

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

+0

Необходимо указать код. – rdelmar

+0

извините, там –

+0

Этого недостаточно кода. Вам нужно показать целые методы, а не только отдельные строки. Покажите также, что вы делаете, когда пользователь добавляет или удаляет элемент. – rdelmar

ответ

1

Apple documentation От:

Перед добавить пункт:

canInsertItem(_:afterItem:)

Возвращает логическое значение, указывающее, ли данный элемент игрок может быть вставлен в очередь игрока.

func canInsertItem(_ item: AVPlayerItem!, afterItem afterItem: AVPlayerItem!) -> Bool 

Добавление элемента:

insertItem(_:afterItem:) 

мест данного элемента игрок после определенного элемента в очереди.

func insertItem(_ item: AVPlayerItem!, afterItem afterItem: AVPlayerItem!) 

Удаление товара:

removeItem(_:)

Удаляет данный игрок элемент из очереди.

func removeItem(_ item: AVPlayerItem!)

+0

Да, я знаю это, но если я попытаюсь добавить элемент, который уже был воспроизведен, он дает ошибку, например –

+0

Вам нужно проверить, можете ли вы вставить до этого, я добавьте его в ответ. Надеюсь, он вам поможет. – Icaro

+0

Я уже знал, что это похоже на неразрешимую проблему благодаря Apple. Но спасибо в любом случае –

3

Проблема заключается в том, что вы создаете новый объект игрока при обновлении массива элементов с этой линией (в Tableview: commitEditingStyle: forRowAtIndexPath :),

audioPlayer = AVQueuePlayer(items: mediaArray) 

Кажется, что элементы игрока по-прежнему связаны с оригинальным игроком, когда вы это делаете. Вы должны уметь удалить эту строку, чтобы она работала правильно. Вставка или удаление элементов из mediaArray должна быть достаточной, чтобы делать то, что вы хотите; вам не нужно создавать нового игрока.

+0

, но * к сожалению * это не так, кажется, что когда вы впервые ассоциируете массив с игроком, независимо от того, что происходит с массивом, игрок все равно будет играть первый заданный массив. Самое смешное, что если mediaPicker вызывается снова и выбираются одни и те же музыкальные композиции, он играет отлично. Мне было интересно, почему Apple это делает, это просто не кажется необходимым. В любом случае, я думаю, мне придется изменить свой подход, спасибо за помощь –