Воспроизведение видео с нового URL без создания нового объекта AVPlayer

Я пытаюсь разрешить пользователям просматривать видеоролики, изменяя URL-адрес AVPlayer на лету, не обновляя представление. Тем не менее, прямо сейчас я просто создаю объекты AVPlayer каждый раз, когда воспроизводится видео (в результате звук воспроизводится один за другим), что, по моему мнению, не лучший способ сделать это. Есть ли более эффективный способ, похожий на изменение изображения в imageView?

Это код, в котором я запускаю клип:

player = AVPlayer(URL: fileURL)
playerLayer = AVPlayerLayer(player: player)
playerLayer!.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer!)
player!.play()

Ответ 1

Не используйте AVPlayer.

Вместо этого используйте AVQueuePlayer, который позволяет вставлять и удалять элементы из очереди.

//create local player in setup methods
self.localPlayer = AVQueuePlayer.init()

чтобы добавить элементы, вы можете просто использовать

//optional: clear current queue if playing straight away
self.localPlayer.removeAllItems()

//get url of track
let url : URL? = URL.init(string: "http://urlOfItem")
if url != nil {
   let playerItem = AVPlayerItem.init(url: url!)

   //you can use the after property to insert 
   //it at a specific location or leave it nil
   self.localPlayer.insert(playerItem, after: nil)
   self.localPlayer.play()
}

AVQueuePlayer поддерживает все функции AVPlayer, но имеет дополнительные функции добавления и удаления элементов из очереди.

Ответ 2

Используйте AVPlayerItem для добавления и удаления выходов в объект AVPlayer.

Вместо добавления видео в AVPlayer при его создании создайте пустой экземпляр AVPlayer и затем используйте метод addOutput для класса AVPlayerItem, чтобы добавить видео.

Чтобы удалить видео и добавить новый, используйте метод removeOutput для класса AVPlayerItem для удаления старого видео, а затем метод addOutput, чтобы вставить новый.

Пример кода можно найти на веб-сайте разработчика Apple по адресу:

https://developer.apple.com/library/prerelease/content/samplecode/AVBasicVideoOutput/Introduction/Intro.html

Он обеспечивает то же самое, что и я, если бы я сам отправлял свой код.

Ответ 3

Создайте экземпляр AVPlayer глобально, а затем переопределите его, если вы хотите воспроизвести новое видео с нового URL.

Ответ 4

Я могу выполнить то, что вы ищете, делая это...

У меня есть tableView имен песен, для которых mp3 файлы хранятся на Parse.com. В didSelectRowAtIndexPath я делаю...

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    SelectedSongNumber = indexPath.row
    grabSong()
}


   func grabSong () {

    let songQuery = PFQuery(className: "Songs")
    songQuery.getObjectInBackgroundWithId(iDArray[SelectedSongNumber], block: {
        (object: PFObject?, error : NSError?) -> Void in


        if let audioFile = object?["SongFile"] as? PFFile {
            let audioFileUrlString: String = audioFile.url!
            let audioFileUrl = NSURL(string: audioFileUrlString)!

            myAVPlayer = AVPlayer(URL: audioFileUrl)
            myAVPlayer.play()

            currentUser?.setObject(audioFileUrlString, forKey: "CurrentSongURL")
            currentUser?.saveInBackground()
        }
    }) 
 }

когда я запускаю это, я выбираю строку, и песня начинает играть. Если я подождал несколько секунд и выбрал другую строку, AVPlayer воспроизводит песню из новой ячейки, которую я выбрал, и НЕ воспроизводит одну песню поверх другой. Мой AVPlayer объявляется как общедоступная переменная для всех классов.