Как заставить играть следующий трек после выбора из массива с помощью AVPlayer

Я хочу создать аудиоплеер. Я получаю треки из локальной директории устройства и помещаю их в массив playerQueue с типом [AVPlayerItem]. TableView был создан с рядами дорожек. Я хочу нажать на любую строку, и трек должен воспроизводиться - это работает. После окончания текущего трека автоматически должно начаться воспроизведение следующего трека. Но я не могу этого сделать. Также у меня не получается сделать это с помощью AVQueuePlayer — плейлист начинает проигрываться с самого начала. Теперь мой код выглядит так:

class TableViewController: UITableViewController {
...
    var player: AVPlayer!
    var playerQueue: [AVPlayerItem] = []
...
//Creating playerQueue from directory
private func createPlayerQueue(with content: [String], from directory: String?) -> [AVPlayerItem] {
        var playerQueue: [AVPlayerItem] = []
        content.forEach { (url) in
            let fileUrl = directory! + "/" + url
            let asset = AVAsset(url: URL(fileURLWithPath: fileUrl))
            let item = AVPlayerItem(asset: asset)
            playerQueue.append(item)
        }
        return playerQueue
    }
....
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let fullPath: String = currentDirectory! + "/" + content[indexPath.row]

                playerQueue = createPlayerQueue(with: content, from: currentDirectory)
                let currentItem = playerQueue[indexPath.row]
                player = AVPlayer(playerItem: currentItem)
                player.play()
    }

person VyacheslavB    schedule 16.07.2020    source источник


Ответы (1)


Вы можете использовать Key-Value Observer или Центр уведомлений для управления playerItem, например: Volume, Duration time, Seeking, ...

Пример:

 NotificationCenter.default.addObserver(self, selector: #selector(itemDidPlayToEndTime), name: .AVPlayerItemDidPlayToEndTime, object: playerItem)

@objc func itemDidPlayToEndTime(notification: Notification) {
        if (notification.object as? AVPlayerItem) == self.player.currentItem {
            // Play next item in your queue
        }
    }
person HHumorous    schedule 16.07.2020
comment
Извините, но это не работает, если я использую let player:AVPlayer = { let avPlayer = AVPlayer() avPlayer.automaticallyWaitsToMinimizeStalling = false return avPlayer }() player.replaceCurrentItem(with: playerItem) // playerItem - это AVPlayerItem Может быть, вы знаете, как почини это? - person VyacheslavB; 31.07.2020
comment
Попробуйте этот исходный код https://github.com/oCanKhacNguyen/videoPlayerDemo. Это может быть полезно для вас - person HHumorous; 03.08.2020