AVPlayer系統(tǒng)或自定義實(shí)現(xiàn)視頻播放

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方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葵孤,一起剝皮案震驚了整個(gè)濱河市担钮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尤仍,老刑警劉巖箫津,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宰啦,居然都是意外死亡苏遥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門赡模,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)田炭,“玉大人,你說(shuō)我怎么就攤上這事漓柑〗塘颍” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵辆布,是天一觀的道長(zhǎng)瞬矩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锋玲,這世上最難降的妖魔是什么景用? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮惭蹂,結(jié)果婚禮上伞插,老公的妹妹穿的比我還像新娘。我一直安慰自己盾碗,他們只是感情好媚污,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廷雅,像睡著了一般杠步。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上榜轿,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音朵锣,去河邊找鬼谬盐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诚些,可吹牛的內(nèi)容都是我干的飞傀。 我是一名探鬼主播皇型,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砸烦!你這毒婦竟也來(lái)了弃鸦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幢痘,失蹤者是張志新(化名)和其女友劉穎唬格,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颜说,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡购岗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了门粪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喊积。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖玄妈,靈堂內(nèi)的尸體忽然破棺而出乾吻,到底是詐尸還是另有隱情,我是刑警寧澤拟蜻,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布绎签,位于F島的核電站,受9級(jí)特大地震影響瞭郑,放射性物質(zhì)發(fā)生泄漏辜御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一屈张、第九天 我趴在偏房一處隱蔽的房頂上張望擒权。 院中可真熱鬧,春花似錦阁谆、人聲如沸碳抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剖效。三九已至,卻和暖如春焰盗,著一層夾襖步出監(jiān)牢的瞬間璧尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工熬拒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爷光,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓澎粟,卻偏偏與公主長(zhǎng)得像蛀序,于是被迫代替她去往敵國(guó)和親欢瞪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容