使用AVPlayer自定義支持全屏的播放器(三)

前言

前段時間封裝了一個視頻播放器使用AVPlayer自定義支持全屏的播放器(二)蚤假,還有很多沒有完善的功能,最近花時間完善了一下吧兔,修復(fù)了很多bug磷仰,也增加了一些功能,最主要的還是使用Masonry重構(gòu)了播放器的工具條境蔼,將工具條單獨封裝出來灶平,方便大家自己修改。本篇文章主要講新增加的功能箍土。

新增功能

新增加了視頻卡頓監(jiān)聽逢享,加載視頻失敗處理,增加了視頻拉伸方式吴藻。

1.視頻卡頓監(jiān)聽

很多時候播放視頻并不是那么理想的網(wǎng)絡(luò)環(huán)境瞒爬,這時候為了優(yōu)化用戶體驗,我們就需要增加卡頓時候的邏輯沟堡,主要思路是增加一個播放器的狀態(tài)屬性侧但,再通過監(jiān)聽播放器的status,loadedTimeRanges,playbackBufferEmpty,playbackLikelyToKeepUp這幾個屬性來調(diào)用狀態(tài)屬性的set方法,在set方法中集中處理各種不同狀態(tài)航罗。這里主要借鑒參考了ZFPlayer

監(jiān)聽代碼

#pragma mark - 監(jiān)聽
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    if ([keyPath isEqualToString:@"status"]) {
        
        if (self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
            self.state = CLPlayerStatePlaying;
        }
        else if (self.player.currentItem.status == AVPlayerItemStatusFailed) {
            self.state = CLPlayerStateFailed;
        }
    } else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
        
        // 計算緩沖進度
        NSTimeInterval timeInterval = [self availableDuration];
        CMTime duration             = self.playerItem.duration;
        CGFloat totalDuration       = CMTimeGetSeconds(duration);
        [self.maskView.progress setProgress:timeInterval / totalDuration animated:NO];

    } else if ([keyPath isEqualToString:@"playbackBufferEmpty"]) {
        
        // 當(dāng)緩沖是空的時候
        if (self.playerItem.playbackBufferEmpty) {
            self.state = CLPlayerStateBuffering;
            [self bufferingSomeSecond];
        }
        
    } else if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"]) {
        
        // 當(dāng)緩沖好的時候
        if (self.playerItem.playbackLikelyToKeepUp && self.state == CLPlayerStateBuffering){
            self.state = CLPlayerStatePlaying;
        }
        
    }
}

狀態(tài)的set方法

- (void)setState:(CLPlayerState)state{
    _state = state;
    if (state == CLPlayerStateBuffering) {
        [self.maskView.activity startAnimating];
    }else if (state == CLPlayerStateFailed){
        [self.maskView.activity stopAnimating];
        NSLog(@"加載失敗");
        self.maskView.failButton.hidden = NO;
    }else{
        [self.maskView.activity stopAnimating];
        [self playVideo];
    }
}

2.視頻加載失敗處理

和卡頓類似禀横,也是通過監(jiān)聽視頻播放狀態(tài)來實現(xiàn),在視頻加載失敗的時候顯示一個提示按鈕伤哺,點擊按鈕重新加載視頻url即可燕侠。

加載失敗按鈕點擊事件

#pragma mark - 播放失敗按鈕點擊事件
-(void)cl_failButtonAction:(UIButton *)button{
     //重置url
    [self setUrl:_url];
    //刷新UI
    [self setNeedsLayout];
    [self layoutIfNeeded];
}

3.視頻拉伸方式

AVPlayer的API中就有一個視頻拉伸方式,這里只是給了一個初始值簡單封裝了一下立莉。

封裝后的拉伸方式

typedef NS_ENUM(NSInteger,VideoFillMode){
    Resize = 0,          //拉伸占滿整個播放器绢彤,不按原比例拉伸
    ResizeAspect,        //按原視頻比例顯示,是豎屏的就顯示出豎屏的蜓耻,兩邊留黑
    ResizeAspectFill,    //按照原比例拉伸占滿整個播放器茫舶,但視頻內(nèi)容超出部分會被剪切
};

播放器效果圖

效果圖1.gif
效果圖2.gif
效果圖3.gif

總結(jié)

其實主要的還是完善了很多細節(jié)戈二,修改了許多bug腕柜,具體請在github下載CLPlayer 彩郊, 如果喜歡毒坛,歡迎star。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疹启,一起剝皮案震驚了整個濱河市古程,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喊崖,老刑警劉巖挣磨,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荤懂,居然都是意外死亡茁裙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門节仿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晤锥,“玉大人,你說我怎么就攤上這事廊宪》” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵挤忙,是天一觀的道長霜威。 經(jīng)常有香客問我谈喳,道長册烈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任婿禽,我火速辦了婚禮赏僧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扭倾。我一直安慰自己淀零,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布膛壹。 她就那樣靜靜地躺著驾中,像睡著了一般。 火紅的嫁衣襯著肌膚如雪模聋。 梳的紋絲不亂的頭發(fā)上肩民,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音链方,去河邊找鬼持痰。 笑死,一個胖子當(dāng)著我的面吹牛祟蚀,可吹牛的內(nèi)容都是我干的工窍。 我是一名探鬼主播割卖,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼患雏!你這毒婦竟也來了鹏溯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤淹仑,失蹤者是張志新(化名)和其女友劉穎剿涮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攻人,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡取试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀吻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞬浓。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓬坡,靈堂內(nèi)的尸體忽然破棺而出猿棉,到底是詐尸還是另有隱情,我是刑警寧澤屑咳,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布萨赁,位于F島的核電站,受9級特大地震影響兆龙,放射性物質(zhì)發(fā)生泄漏杖爽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一紫皇、第九天 我趴在偏房一處隱蔽的房頂上張望慰安。 院中可真熱鬧,春花似錦聪铺、人聲如沸化焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒桨。三九已至,卻和暖如春键兜,著一層夾襖步出監(jiān)牢的瞬間凤类,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工蝶押, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踱蠢,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像茎截,于是被迫代替她去往敵國和親苇侵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫企锌、插件榆浓、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評論 4 62
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,780評論 25 707
  • 一 雨打青石板陡鹃,淅瀝瀝,滴滴答抖坪,聽一曲梵音萍鲸,將浮塵關(guān)在窗外。 陽臺上的花一大部分屬于菊科擦俐,沒到菊開的季節(jié)脊阴,可能是這...
    芳心伴暖閱讀 275評論 0 5
  • 01 讓自己過得不好,這是最讓人遺憾的不幸蚯瞧。幸福需要充分動用“五感”去享受它嘿期。 我們說過有信仰的人更容易感受到幸福...
    鹿雯立love閱讀 2,353評論 1 1