iOS中视频播放器的简单封装详解

2020-01-18 16:55:21王振洲


/** 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;
}