В настоящее время я работаю над киоск-приложением. Ядром этой функциональности является единый контроллер представления проигрывателя фильмов. Приложение будет циклически просматривать различные файлы фильмов, а также отображать элементы пользовательского интерфейса в различных местах в зависимости от того, какой фильм воспроизводится в данный момент.
Здесь я настроил avPlayer
контроллера представления:
func initPlayer() {
setAvPlayerItem()
avPlayerItem = AVPlayerItem(asset: avAsset)
avPlayer = AVPlayer(playerItem: avPlayerItem)
avPlayerLayer = AVPlayerLayer(player: avPlayer)
avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
avPlayerLayer.frame = UIScreen.main.bounds
movieView.layer.addSublayer(avPlayerLayer)
notificationCenter.removeObserver(self,
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
notificationCenter.addObserver(self,
selector: #selector(avPlayerDidPlayToEndTime),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
avPlayer.seek(to: kCMTimeZero)
avPlayer.volume = 0.0
avPlayer.play()
}
Вот где я играю текущий фильм:
func playCurrentMovie() {
setAvPlayerItem()
avPlayer.replaceCurrentItem(with: avPlayerItem)
notificationCenter.removeObserver(self,
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
notificationCenter.addObserver(self,
selector: #selector(avPlayerDidPlayToEndTime),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
avPlayer.seek(to: kCMTimeZero)
avPlayer.volume = 0.0
avPlayer.play()
}
... и здесь я устанавливаю, какой avPlayerAsset
следует использовать:
func setAvPlayerItem() {
let resource = moviesCollection[currentMovie]["Movie"] as! String?
guard let moviePath = Bundle.main.path(forResource: resource,
ofType:"mp4") else {
debugPrint("video not found")
return
}
movieURL = URL(fileURLWithPath: moviePath)
avAsset = AVAsset(url: movieURL)
avPlayerItem = AVPlayerItem(asset: avAsset)
}
Это отлично работает на Симуляторе. При работе на устройстве (iPad Pro 12,9") каждый раз, когда я перехожу к воспроизведению нового видеоресурса, на экране появляется черное мерцание.
Кто-нибудь знает, почему может происходить это черное мерцание?
AVQueuePlayer
и предварительно загрузить всеplayerItems
и поставить их в очередь, циклически перебирая их в соответствии с тем, что вы хотите воспроизвести. Я не проверял производительность этого, но логично, что вам не следует этого делать, если у вас есть возможность просмотреть много видео. - person   schedule 08.02.2017AVQueuePlayer
может предварительно загрузить? - person narner   schedule 08.02.2017