亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中視頻播放器的簡單封裝詳解

2020-07-26 03:07:23
字體:
來源:轉載
供稿:網友

前言

如果僅僅是播放視頻兩者的使用都非常簡單,但是相比MediaPlayer,AVPlayer對于視頻播放的可控制性更強一些,可以通過自定義的一些控件來實現視頻的播放暫停等等。因此這里使用AVPlayer的視頻播放。

視頻播放器布局

首先使用xib創建CLAVPlayerView繼承UIView用來承載播放器,這樣我們在外部使用的時候,直接在控制器View或者Cell上添加CLAVPlayerView即可,至于播放器播放或者暫停等操作交給CLAVPlayerView來管理。下面來看一下CLAVPlayerView的結構。


CLAVPlayerView的結構

CLAVPlayerView的布局很簡單,重點在于約束的添加和控件層次關系,添加約束只要自己挨個細心添加就沒有問題,需要注意控件的層次關系,從上圖中可以看出四個控件是分先后順序平行添加在CLAVPlayerView上的,要注意他們的層次關系,避免相互遮擋。

視頻播放器實現

布局完成之后,就是實現播放器功能,我們把播放器功能大致分為四部分來完成

一. 通過播放按鈕實現視頻播放。

首先CLAVPlayerView加載時需要將播放器layer添加到imageView的layer上,此時蒙版和底部工具條一定都是隱藏的,點擊中間播放按鈕,視頻開始播放并隱藏播放按鈕。因此我們需要在CLAVPlayerView的awakeFromNib方法中,在加載CLAVPlayerView時對其做一些處理。

1、初始化AVPlayer和AVPlayerLayer,并將AVPlayerLayer添加到imageView的layer上,在layoutSubviews中設置playerLayer的frame

// 初始化player 和playerLayerself.player = [[AVPlayer alloc]init];self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];// imageView上添加playerLayer[self.imageView.layer addSublayer:self.playerLayer];
-(void)layoutSubviews{ [super layoutSubviews]; self.playerLayer.frame = self.imageView.bounds;}

2、根據播放視頻的url創建AVPlayerItem

NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"];self.playerItem = [AVPlayerItem playerItemWithURL:url];

3、設置Slider原點以及最大點最小點圖片

// 設置Slider[self.progressSlider setThumbImage:[UIImage imageNamed:@"thumbImage"] forState:UIControlStateNormal];[self.progressSlider setMaximumTrackImage:[UIImage imageNamed:@"MaximumTrackImage"] forState:UIControlStateNormal];[self.progressSlider setMinimumTrackImage:[UIImage imageNamed:@"MinimumTrackImage"] forState:UIControlStateNormal];

4、給imageView添加tap手勢,點擊imageView則顯示工具欄

//imageView添加手勢UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];[self.imageView addGestureRecognizer:tap];

注意:如果使用xib給imageVIew添加手勢,則通過loadNibNamed加載xib的時候需要獲取返回數組的firstObject,得到的才是xib的View,如果獲取lastObject,得到是的tap手勢,會報錯tap手勢對象沒有View的方法。

5、其他控件顯示以及狀態的設置

// 隱藏遮蓋版self.coverView.hidden = YES;// 設置工具欄狀態self.toolView.alpha = 0;self.isShowToolView = NO;// 設置工具欄播放按鈕狀態self.playOrPauseBtn.selected = NO;

這蓋板只有播放完畢之后顯現,點擊重播之后又隱藏,因此使用hidden直接隱藏即可,而工具欄需要重復顯示,并且我們為了能讓工具欄的顯示有動畫效果,這里通過設置toolView的alpha來顯示或隱藏工具欄,并通過isShowToolView來記錄toolView的顯示或隱藏。

6、中間播放按鈕的點擊

- (IBAction)playOrPauseBigBtnClick:(UIButton *)sender { // 隱藏中間播放按鈕,工具欄播放按鈕為選中狀態 sender.hidden = YES; self.playOrPauseBtn.selected = YES; // 替換播放內容 [self.player replaceCurrentItemWithPlayerItem:self.playerItem]; [self.player play]; [self addProgressTimer];}

此時,當我們點擊中間播放按鈕播放器就可以播放視頻了。

二. 工具條的顯示與隱藏

在播放狀態時,當點擊imageView,就會彈出底部工具條,可以查看當前播放的時間,視頻總時間或進行暫停視頻、全屏播放等操作。如果沒有操作,工具欄會在5秒之后自動隱藏。而當未播放狀態時,點擊imageView和中間播放按鈕效果一樣,開始播放視頻。

1、添加定時器,5秒鐘之后隱藏底部工具條,并提供移除定時器的方法。

/** toolView顯示時開始計時,5s后隱藏toolView */-(void)addShowTime{ self.showTime = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(upDateToolView) userInfo:nil repeats:NO]; [[NSRunLoop mainRunLoop]addTimer:self.showTime forMode:NSRunLoopCommonModes];}/** 將toolView隱藏 */-(void)upDateToolView{ self.isShowToolView = !self.isShowToolView; [UIView animateWithDuration:0.5 animations:^{  self.toolView.alpha = 0; }];}/**移除定時器*/-(void)removeShowTime{ [self.showTime invalidate]; self.showTime = nil;}

2、imageView的tap手勢點擊方法實現,這里分為幾種情況,當視頻未播放的時候,點擊imageView不會顯示工具欄,而是與點擊中間播放按鈕相同,開始播放視頻,播放過程中點擊imageView會顯示工具欄,而如果此時點擊了工具欄中的暫停按鈕,播放暫停,則此時工具欄不會消失,重新開始播放視頻,工具欄在5秒內消失。

/** imageView的tap手勢方法 */-(void)tapAction:(UITapGestureRecognizer *)tap{ // 當未播放狀態,點擊imageView等同于點擊中間播放按鈕,開始播放視頻 if (self.player.status == AVPlayerStatusUnknown) {  [self playOrPauseBigBtnClick:self.playOrPauseBigBtn];  return; } // 記錄底部工具欄顯示或隱藏的狀態 self.isShowToolView = !self.isShowToolView; // 如果需要工具欄顯示,添加動畫顯示 if (self.isShowToolView){  [UIView animateWithDuration:0.5 animations:^{   self.toolView.alpha = 1;  }];  // 工具欄的播放按鈕為播放狀態的時候,添加計時器,5秒鐘之后工具欄隱藏  if (self.playOrPauseBtn.selected) {   [self addShowTime];  } // 如果需要隱藏工具欄,移除計時器,并將工具欄隱藏 }else{  [self removeShowTime];  [UIView animateWithDuration:0.5 animations:^{   self.toolView.alpha = 0;  }]; }}

3、工具欄中播放/暫停按鈕的點擊也需要做一些處理,當處于暫停狀態時,工具欄alpha值設為1,并將定時器移除,重新開始播放視頻時,則重新添加定時器開始計時,5秒鐘之后讓工具欄消失。具體代碼會在播放時間、Slider與視頻播放的同步中詳細貼出。

三. 播放時間、Slider與視頻播放的同步

底部工具條中播放時間、視頻總時間以及Slider的滑動需要與視頻播放時間進行同步。

1、添加視頻播放和Slider的定時器,每1秒鐘重復調用更新時間label和Slider滑塊

 /** slider定時器添加 */ -(void)addProgressTimer {  self.progressTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateProgressInfo) userInfo:nil repeats:YES];  [[NSRunLoop mainRunLoop]addTimer:self.progressTimer forMode:NSRunLoopCommonModes]; } /** 移除slider定時器 */ -(void)removeProgressTimer {  [self.progressTimer invalidate];  self.progressTimer = nil; } /** 更新slider和timeLabel */ - (void)updateProgressInfo { NSTimeInterval currentTime = CMTimeGetSeconds(self.player.currentTime);  NSTimeInterval durationTime = CMTimeGetSeconds(self.player.currentItem.duration);  self.timeLabel.text = [self timeToStringWithTimeInterval:currentTime];  self.allTimeLabel.text = [self timeToStringWithTimeInterval:durationTime];  self.progressSlider.value = CMTimeGetSeconds(self.player.currentTime) / CMTimeGetSeconds(self.player.currentItem.duration);  if (self.progressSlider.value == 1) {   [self removeProgressTimer];   self.coverView.hidden = NO;  }  }

獲取到的當前播放時間和總時間是CMTime類型的,需要將他們轉化為NSTimeInterval并將秒轉化為分鐘和時間,將轉化方法提出來

/** 轉換播放時間和總時間的方法 */-(NSString *)timeToStringWithTimeInterval:(NSTimeInterval)interval;{ NSInteger Min = interval / 60; NSInteger Sec = (NSInteger)interval % 60; NSString *intervalString = [NSString stringWithFormat:@"%02ld:%02ld",Min,Sec]; return intervalString;}

2、當點擊中間播放按鈕開始播放的時候添加定時器,同步更新播放時間和Slider,當播放途中點擊工具欄暫停按鈕暫停播放,需要將視頻暫停,并移除定時器,重新開始播放時在添加定時器,并開始播放

/** toolView上暫停按鈕的點擊事件 */- (IBAction)playOrPauseBtnClick:(UIButton *)sender { // 播放狀態按鈕selected為YES,暫停狀態selected為NO。 sender.selected = !sender.selected; if (!sender.selected) {  self.toolView.alpha = 1;  [self removeShowTime];  [self.player pause];  [self removeProgressTimer]; }else{  [self addShowTime];  [self.player play];  [self addProgressTimer]; }}

3、Slider的拖動跳躍播放視頻

根據Slider滑動拖動滑動位置播放視頻需要監聽Slider的按下,拖動(數據改變),松開三個階段。按下時移除定時器,拖動時根據拖動的值即時的計算當前播放時間并顯示在label上,松開時計算當前播放時間,并跳轉到當前播放時間進行播放。

/** slider拖動和點擊事件 */- (IBAction)touchDownSlider:(UISlider *)sender { // 按下去 移除監聽器 [self removeProgressTimer]; [self removeShowTime];}- (IBAction)valueChangedSlider:(UISlider *)sender { // 計算slider拖動的點對應的播放時間 NSTimeInterval currentTime = CMTimeGetSeconds(self.player.currentItem.duration) * sender.value; self.timeLabel.text = [self timeToStringWithTimeInterval:currentTime];}- (IBAction)touchUpInside:(UISlider *)sender { [self addProgressTimer]; //計算當前slider拖動對應的播放時間 NSTimeInterval currentTime = CMTimeGetSeconds(self.player.currentItem.duration) * sender.value; // seekToTime:播放跳轉到當前播放時間 [self.player seekToTime:CMTimeMakeWithSeconds(currentTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; [self addShowTime];}

四. 重播按鈕和全屏播放按鈕的實現

1、在定時器每秒調用的更新Slider的方法中判斷當視頻播放完畢之后,顯示遮蓋View,而重播按鈕的實現,其實就是將Slider的value置為0并重新調用點擊Slider松開時的方法,將當前播放時間置為0,重新隱藏遮蓋View,并調用中間播放按鈕開始播放。

/** 重播按鈕點擊 */- (IBAction)repeatBtnClick:(UIButton *)sender { self.progressSlider.value = 0; [self touchUpInside:self.progressSlider]; self.coverView.hidden = YES; [self playOrPauseBigBtnClick:self.playOrPauseBigBtn];}

2、全屏播放的實現

全屏播放需要控制器Moda出一個全屏播放的控制器進行全屏播放,創建全屏播放控制器CLFullViewController,并使其支持左右方向的旋轉,Moda出CLFullViewController控制器,并將CLAVPlayerView添加到CLFullViewController的View上并設置frame即可,當退出全屏時,dismiss掉CLFullViewController然后將CLAVPlayerView的frame設置為原來的值。
CLFullViewController中設置可以旋轉和旋轉方向

- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape;}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ return YES;}

全屏播放按鈕點擊事件

/** 全屏按鈕點擊事件 */- (IBAction)fullViewBtnClick:(UIButton *)sender { sender.selected = !sender.selected; [self videoplayViewSwitchOrientation:sender.selected];}/** 彈出全屏播放器 */- (void)videoplayViewSwitchOrientation:(BOOL)isFull{ if (isFull) {  [self.contrainerViewController presentViewController:self.fullVc animated:NO completion:^{   [self.fullVc.view addSubview:self];   self.center = self.fullVc.view.center;   [UIView animateWithDuration:0.15 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{    self.frame = self.fullVc.view.bounds;   } completion:nil];  }]; } else {  [self.fullVc dismissViewControllerAnimated:NO completion:^{   [self.contrainerViewController.view addSubview:self];   [UIView animateWithDuration:0.15 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^{    self.frame = CGRectMake(0, 200, self.contrainerViewController.view.bounds.size.width, self.contrainerViewController.view.bounds.size.width * 9 / 16);   } completion:nil];  }]; }}

注意:這里需要拿到外面控制器來Moda出全屏播放控制器,所以給CLAVPlayerView添加contrainerViewController屬性來拿到控制器。

簡單封裝

此時已經實現了播放器基本的功能,接下來考慮如何封裝能使我們使用起來更加方便,其實我們已經將大部分封裝完成,接下來需要做的就是提供簡單易用的接口,使外部可以輕松調用實現播放器。

1、提供類方法快速創建播放器

+ (instancetype)videoPlayView{ return [[[NSBundle mainBundle]loadNibNamed:@"CLAVPlayerView" owner:nil options:nil]lastObject];}

2、播放視頻的資源應該由外部決定,因此我們提供urlString屬性用來接收視頻的資源,然后通過重寫其set方法來播放視頻
/** 需要播放的視頻資源set方法 */

-(void)setUrlString:(NSString *)urlString{ _urlString = urlString; NSURL *url = [NSURL URLWithString:urlString]; self.playerItem = [AVPlayerItem playerItemWithURL:url];}

此時我們在外部使用播放器就非常簡單了,無需考慮內部邏輯,只需快速創建CLAVPlayerView,添加到控制器View,設置其frame,然后指定其播放視頻資源就可以了。

- (void)viewDidLoad { [super viewDidLoad]; [self setUpVideoPlayView];  self.playView.urlString = @"http://120.25.226.186:32812/resources/videos/minion_02.mp4";}-(void)setUpVideoPlayView{ self.playView = [CLAVPlayerView videoPlayView]; self.playView.frame = CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.width * 9 / 16); self.playView.contrainerViewController = self; [self.view addSubview:self.playView];}

最后,視頻播放器大致這個樣子

總結

其中還有許多需要完善的地方,一些功能也沒有實現,例如兩個占位的Button,將來可以用來下載視頻和控制彈幕的開關,播放結束之后分享按鈕也沒有實現。以后實現后給大家繼續分享,以上就是這篇文章的全部內容了,希望本文的內容對大家能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
奇米4444一区二区三区| 日韩有码在线播放| 欧美做受高潮1| 国产一区二区三区视频| 日韩在线观看免费网站| 狠狠操狠狠色综合网| 亚洲第一免费网站| 亚洲人成伊人成综合网久久久| 在线观看亚洲视频| 亚洲va欧美va国产综合剧情| 91香蕉电影院| 国产精品久久久亚洲| 国产一区二区三区在线免费观看| 国产午夜精品一区理论片飘花| 性欧美暴力猛交69hd| 欧美午夜影院在线视频| 青青久久aⅴ北条麻妃| 91福利视频在线观看| 久久精品国产电影| 国产精品免费福利| 欧美午夜影院在线视频| 日韩av中文在线| 欧美日韩亚洲精品一区二区三区| 欧美黄色三级网站| 国产精品美女呻吟| 色婷婷**av毛片一区| 91国内在线视频| 国产午夜一区二区| 日韩免费观看视频| 91av在线播放视频| 亚洲欧洲国产一区| 亚洲色图综合网| 亚洲国产精品字幕| 国产精品久久不能| 欧美天堂在线观看| 成人免费在线视频网址| 久久久久久久电影一区| 亚洲欧美国产视频| 亚洲天堂av图片| 亚洲国产第一页| 国产精品男人的天堂| 久久精品久久久久久国产 免费| 免费91麻豆精品国产自产在线观看| 亚洲精品一区在线观看香蕉| 久久久99久久精品女同性| 欧亚精品在线观看| 国产免费一区视频观看免费| 日韩精品在线视频观看| 久久久久www| 2019中文字幕在线观看| 57pao成人永久免费视频| 2021国产精品视频| 日韩中文字幕在线免费观看| 国产一区二区在线免费视频| 欧美亚洲另类在线| 国产999精品久久久| www.日韩视频| 色黄久久久久久| 欧美高清理论片| 成人做爰www免费看视频网站| 夜夜嗨av色综合久久久综合网| 97精品国产91久久久久久| 欧美夫妻性生活xx| 清纯唯美亚洲综合| 久久免费高清视频| 日本精品久久久| 亚洲国产精品久久久久秋霞蜜臀| 亚洲精品自在久久| 欧美疯狂性受xxxxx另类| 久久久成人的性感天堂| 欧美极品少妇xxxxⅹ喷水| 国产精品中文字幕在线| 国产精品美女av| 国产精品久久综合av爱欲tv| 国模精品系列视频| 亚洲欧美激情一区| 久久精品视频中文字幕| 亚洲国产天堂久久综合| 国产精品自产拍高潮在线观看| 91天堂在线观看| 在线国产精品播放| 日韩黄色在线免费观看| 久久久精品久久久久| 一本一道久久a久久精品逆3p| 欧洲美女7788成人免费视频| 亚洲第一免费播放区| 色综合91久久精品中文字幕| 国产精品第8页| 国产综合福利在线| 亚洲第一福利网站| 精品呦交小u女在线| 日韩女优人人人人射在线视频| 欧美黄色免费网站| 浅井舞香一区二区| 成人av色在线观看| 精品国偷自产在线视频| 欧美一级黄色网| 亚洲欧美日韩精品| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品久久久久久av福利| 91人人爽人人爽人人精88v| 97国产suv精品一区二区62| 91九色综合久久| www.日本久久久久com.| 欧美日韩国产丝袜另类| 国产精品视频资源| 亚洲人精品午夜在线观看| 热99精品只有里视频精品| 日韩电影在线观看免费| 中文字幕欧美精品日韩中文字幕| 国产精品白丝av嫩草影院| 久久99精品久久久久久青青91| 欧美老女人bb| 2019精品视频| 久久精品国产久精国产思思| 亚洲视频在线观看| 久久精品国产精品| 这里只有精品视频| 欧日韩不卡在线视频| 久久久久久国产精品三级玉女聊斋| 国内精品久久久久久中文字幕| 亚洲国产成人久久| 亚洲国产精品免费| 中文字幕在线精品| 亚洲成人av片在线观看| 精品女同一区二区三区在线播放| 日本在线精品视频| 中文字幕欧美国内| 久久伊人精品一区二区三区| 日韩av影视在线| 日本久久久久久久久| 日本高清+成人网在线观看| 日韩中文字幕在线视频播放| 欧美精品第一页在线播放| 久久久精品中文字幕| 国产欧洲精品视频| 亚洲男子天堂网| 欧美床上激情在线观看| 亚洲激情视频在线| 亚洲第一色在线| 日韩最新中文字幕电影免费看| 精品亚洲国产成av人片传媒| 欧美激情精品久久久久久变态| 中国日韩欧美久久久久久久久| 亚洲在线观看视频网站| 欧美午夜精品在线| 亚洲精品一区久久久久久| 久久精品成人欧美大片古装| 国产在线精品自拍| 亚洲日本欧美日韩高观看| 91精品久久久久久久久久久久久| 91香蕉亚洲精品| 日韩动漫免费观看电视剧高清| 国产剧情日韩欧美| 成人免费视频在线观看超级碰| 精品久久香蕉国产线看观看gif| 国产在线观看一区二区三区| 久久久久久久影视| 亚洲人成五月天| 亚洲色图五月天| 这里只有精品丝袜| 亚洲第一网站免费视频| 国产精品大陆在线观看| 国产精品视频1区|