AVPlayer是一个控制器对象,用于管理媒体资源。AVPlayer基于本地文件或远程文件媒体播放。AVPlayer用于一次播放单个媒体资源,可以使用replaceCurrentItem(with:)
方法重用播放器实例来播放气体媒体资源,但同一个时刻只能管理一个媒体资源,使用AVQueuePlayer来创建和管理媒体播放的队列。
AVPlayer是一个动态变化的对象,有两种方式来观察播放器实例的状态:
addPeriodicTimeObserver(forInterval:queue:using:) addBoundaryTimeObserver(forTimes:queue:using:)
分别定期、按边界观察时间变化。发生更改时,调用方法提供的闭包或者回调块,可以采取播放器用户界面的更新。AVPlayer和AVPlayerItem都是非可视对象,意味着无法直接在屏幕上显示媒体视频,有两种方法可以在屏幕上显示视频:
view.layer.addSublayer(AVPlayerLayer)
中。与AVPlayerView和AVPlayerViewController不同,播放器层不显示任何播放控件,仅仅在屏幕上显示视觉内容。你可以自行构建播放传输控件,以播放,暂停和搜索媒体。AVPlayerItem提供了AVPlayer播放需要的媒体文件,时间、状态、文件大小等信息,是AVPlayer媒体文件的模型对象。
实现类似Spotify的视频背景界面的效果。
import UIKit
import AVFoundation
import AVKit
class ViewController: UIViewController {
lazy var player: AVPlayer = {
let string = Bundle.main.path(forResource: "moments", ofType: "mp4")
let url = URL(fileURLWithPath: string!)
let player = AVPlayer(url: url)
return player
}()
lazy var playerLayer: AVPlayerLayer = {
let playerLayer = AVPlayerLayer(player: self.player)
playerLayer.frame = UIScreen.main.bounds
playerLayer.player?.play()
return playerLayer
}()
override func viewDidLoad() {
super.viewDidLoad()
setupView()
}
func setupView() {
self.view.layer.addSublayer(playerLayer)
//通知监听
NotificationCenter.default.addObserver(self, selector: #selector(didFinishedPlay(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
}
//实现循环播放
@objc func didFinishedPlay(notification: Notification) {
if let playerItem = notification.object as? AVPlayerItem {
//改变AVPlayerItem状态模型对象的时间
playerItem.seek(to: CMTime.zero, completionHandler: nil)
player.play()
}
}
}