项目中要使用到系统的全屏播放,于是就用到了AVPlayerViewController。
在使用中遇到的几个问题,总结一下:
1. 没有全屏退出的接口
2. 不能获取到全屏退出前播放的状态(是否在播放)
3. 要求全屏时缓存进度与之前的AVPlayer同步,不在打开全屏时重新由AVPlayerViewController从头开始缓存,这样会有延迟。
3.全屏时强制横屏播放
由于定制的地方较多,所以直接继承AVPlayerViewController写了个子类:
import UIKit
import MediaPlayer
import AVKit
class CustomAVPlayerViewController: AVPlayerViewController {
var viewWillDisappearCall: (() -> Void)?
var viewDidDisappearCall: (() -> Void)?
var exitFullScreen: (() -> Void)?
var findButtonIndex = 0
var isPlaying = false
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let willDismissCall = viewWillDisappearCall {
willDismissCall()
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if let dismissCall = viewDidDisappearCall {
dismissCall()
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscapeRight
}
override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return UIInterfaceOrientation.landscapeRight
}
func sourceUrl(url: String) {
player = AVPlayer(url: URL(string:url)!)
}
func setAVPlayer(avPlayer: AVPlayer) {
//将AVPlayer的AVPlayerItem copy一份,就能获取到avPlayer的缓存
player = AVPlayer(playerItem: avPlayer.currentItem?.copy() as! AVPlayerItem?)
}
func seekToTime(time : CMTime) {
//修改播放进度
player?.seek(to: time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
}
func play() {
player?.play()
isPlaying = true
}
func pause() {
player?.pause()
isPlaying = false
}
func clickDone() {
//退出前的播放状态
if player?.rate == 0{
isPlaying = false
}else {
isPlaying = true
}
if let exit = exitFullScreen {
exit()
}
}
func findButtonOn(view: UIView, title: String) -> UIButton? {
for subView in view.subviews {
if subView.isKind(of: UIButton.self) {
let sub = subView as! UIButton
let btTitle = sub.titleLabel?.text
if btTitle == title {
return sub
}
}else if (subView.isKind(of: UIView.self)) {
if let sub = findButtonOn(view: subView, title: title) {
return sub
}
}
}
return nil
}
func findImageButton(view: UIView, index: Int) -> UIButton? {
for subView in view.subviews {
if subView.isKind(of: UIButton.self) {
let sub = subView as! UIButton
for imageView in sub.subviews {
if imageView.isKind(of: UIImageView.self) {
if findButtonIndex == index {
return sub
}
findButtonIndex += 1
}
}
}else if (subView.isKind(of: UIView.self)) {
if let sub = findImageButton(view: subView, index: index) {
return sub
}
}
}
return nil
}
func show() {
self.modalTransitionStyle = UIModalTransitionStyle.crossDissolve
UIApplication.shared.keyWindow?.rootViewController?.present(self, animated: true, completion: {
//截取完成按钮时间
var doneButton = self.findButtonOn(view:self.view, title: "完成")
if doneButton == nil {
doneButton = self.findButtonOn(view:self.view, title: "Done")
}
doneButton?.addTarget(self, action: #selector(self.clickDone), for: UIControlEvents.touchUpInside)
})
}
}