ios9之前一般使用 MPMoviePlayerController囱修,MPMoviePlayerViewController里面包含了一個(gè)MPMoviePlayerController,具體的視頻操作可以通過(guò)屬性設(shè)置。使用的時(shí)候需要添加MediaPlayer.framework璃谨。
MPMoviePlayerController使用更簡(jiǎn)單,功能卻不如AVPlayer強(qiáng)大檀蹋,走在技術(shù)的前沿猾编,所以今天著重分析AVPlayerViewController的應(yīng)用,官方文檔介紹可參考舌胶!(https://developer.apple.com/reference/avfoundation/avplayer)
要完整的展現(xiàn)出一個(gè)視頻播放器捆蜀,以下的這幾個(gè)類是必須的:
1.首先需要導(dǎo)入依賴庫(kù)AVFoundation.framework.
var myPlayer = AVPlayer ();//播放器
var item = AVPlayerItem();//播放單元
var playerLayer = AVPlayerLayer ;//播放界面(layer)
建立一個(gè)基本的視頻播放器只需要這幾步:
第一步:找一個(gè)要播放的視頻的url網(wǎng)址
let mediaUrl = URL.init(string: "http://wvideo.spriteapp.cn/video/2016/0817/57b3bc156c6ef_wpd.mp4")
第二步:初始化一個(gè)播放單元
let item = AVPlayerItem.init(url: mediaUrl)
第三步:初始化一個(gè)播放器對(duì)象
let myPlayer= AVPlayer.init(playerItem: item)
第四步:初始化一個(gè)播放器的player
let playerLayer= AVPlayerLayer.init(player: myPlayer)
playerLayer.frame = CGRectMake(0, 0, self.view.bounds.size.width, 500);
self.layer.addSublayer(playerLayer)
第五步:開啟播放器
self.myPlayer.play()
就是這么簡(jiǎn)單的開始播放視頻了。當(dāng)然播放視頻不能簡(jiǎn)單地能播放幔嫂,我們要對(duì)自己要求高點(diǎn)??辆它,我要讓它實(shí)現(xiàn)基本的停止播放,開始播放,快進(jìn),倒退等?履恩,所以我們接著看锰茉。
其實(shí)系統(tǒng)的player自帶暫停播放按鈕以及加載進(jìn)度和播放進(jìn)度,在創(chuàng)建player的時(shí)候只需要設(shè)置allowsExternalPlayback屬性為true
自定義播放器
根據(jù)不同的要求系統(tǒng)的播放器的格式可能就不能滿足需求切心,這時(shí)候我們就需要自定義播放器播放和進(jìn)度等控件的排版飒筑。
處理進(jìn)度
進(jìn)度條我們使用UISlider + UIProgressView的方式。
首先在ZZPlayerView添加一個(gè)UISlider绽昏。聲明變量var slider:UISlider!协屡。
awakeFromNib 中加入以下代碼
slider = UISlider()
self.addSubview(slider)
slider.snp_makeConstraints { (make) in
make.bottom.equalTo(self).inset(5)
make.left.equalTo(self).offset(50)
make.right.equalTo(self).inset(100)
make.height.equalTo(15)
}
slider.minimumValue = 0
slider.maximumValue = 1
slider.value = 0
// 從最大值滑向最小值時(shí)桿的顏色
slider.maximumTrackTintColor = UIColor.clearColor()
// 從最小值滑向最大值時(shí)桿的顏色
slider.minimumTrackTintColor = UIColor.whiteColor()
顯示當(dāng)前播放時(shí)長(zhǎng),總時(shí)長(zhǎng)全谤,更新進(jìn)度的代碼
這下要提到CMTime(播放進(jìn)度的時(shí)間類)肤晓,它的Value屬性是對(duì)應(yīng)的當(dāng)前播放節(jié)點(diǎn)視頻的幀數(shù),timescale指的是每秒多少幀认然,value/timescale = 視頻的總時(shí)長(zhǎng)(秒)
/// 當(dāng)前時(shí)間
private func currentTimeString() -> String {
let currentTime: Float64 = CMTimeGetSeconds(player.currentTime())
let minute = currentTime / 60
let second = currentTime % 60
// 這里有一個(gè) bug补憾,就是 minute 和 second 不能轉(zhuǎn)成 Int 類型的,程序會(huì)崩潰
return String(format: "%02d:%02d", minute, second)
}
/// 總時(shí)長(zhǎng)
private func durationTimeString() -> String {
let duration = CMTimeGetSeconds(player.currentItem!.duration)
let minute = duration / 60
let second = duration % 60
return String(format: "%02d:%02d", minute, second)
}
//添加定時(shí)器
private func addProgressTimer() {
progressTimer = NSTimer(timeInterval: 1.0, target: self, selector: #selector(updateProgressInfo), userInfo: nil, repeats: true)
// 必須加到主循環(huán)隊(duì)列
NSRunLoop.mainRunLoop().addTimer(progressTimer!, forMode: NSRunLoopCommonModes)
}
//更新時(shí)間和進(jìn)度
func updateProgressInfo() {
currentTimeLabel.text = currentTimeString()
totalTimeLabel.text = durationTimeString()
slider.value = Float(CMTimeGetSeconds(player.currentTime()) / CMTimeGetSeconds(player.currentItem!.duration))
}
暫停和播放:
只需要調(diào)用play(播放)和pause(暫停)方法就可以實(shí)現(xiàn)卷员。
注意停止播放時(shí)移除定時(shí)器
視頻加載狀態(tài)
在這里需要監(jiān)聽到視頻播放的狀態(tài)盈匾,所以需要給AVPlayerItem添加一個(gè)監(jiān)聽。
status有三種狀態(tài):
AVPlayerStatusUnknown,
AVPlayerStatusReadyToPlay,
AVPlayerStatusFailed
當(dāng)status等于AVPlayerStatusReadyToPlay時(shí)代表視頻已經(jīng)可以播放了毕骡,我們就可以調(diào)用play方法播放了削饵。
player.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.new, context: nil)
監(jiān)聽回調(diào)方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if ([keyPath isEqualToString:@"status"]) {
if ([playerItem status] == AVPlayerStatusReadyToPlay) {
print("開始播放")
} else if ([playerItem status] == AVPlayerStatusFailed) {
print("暫停播放")
}
}
}
視頻的播放和暫停只需要調(diào)用兩個(gè)簡(jiǎn)單的方法:
myPlayer.play() //播放
myPlayer.pause() //暫停
在不需要用的時(shí)候一定要記得移除岩瘦,可以調(diào)用removeAllItems方法。