AVPlayer -【播放音频.mp3】 学习 笔记

基础功能:
暂停 [_player pause];
播放 [_player play];

注意:下一曲,上一曲时,一定要移除kvo不然会报错!!!

初始化:
@property (nonatomic,strong) AVPlayer * player;
-(AVPlayer *)player{

if (_player == nil) {
    _player = [[AVPlayer alloc] init];
    _player.volume = 1.0; // 默认最大音量
}
return _player;

}

播放URL 的方法,传入URL

  • (void)P_musicPlayerWithURL:(NSURL *)playerItemURL{
    // 移除监听
    // [self p_currentItemRemoveObserver];
    // 创建要播放的资源
    AVPlayerItem *playerItem = [[AVPlayerItem alloc]initWithURL:playerItemURL];
    // 播放当前资源
    [self.player replaceCurrentItemWithPlayerItem:playerItem];
    // 添加观察者
    // [self p_currentItemAddObserver];
    }

// 播放 本地音频,将本地文件 转成 url 传入
NSString * audioPath = [[NSBundle mainBundle]pathForResource:@"小苹果" ofType:@".mp3"];
[self p_musicPlayerWithURL:[NSURL fileURLWithPath:audioPath]];

进度条跟随播放时间 改变进度 方法:

  1.创建一个 全局的 定时器 timer ,重复调用定时器

self.avTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timer) userInfo:nil repeats:YES];
2.在定时器调用方法里设置滑块的值

  • (void)timer{
    _progress.value = CMTimeGetSeconds(self.player.currentItem.currentTime) / CMTimeGetSeconds(self.player.currentItem.duration);
    // 显示播放时间的Label
    _timeLabel_Play.text = [self changeTimeToCurrentDate:CMTimeGetSeconds(self.player.currentItem.currentTime)];
    //显示歌曲总长度的Label
    _timeLabel_End.text = [self changeTimeToCurrentDate:CMTimeGetSeconds(self.player.currentItem.duration)];
    }

拖动滑块,改变 播放进度

/滑块滑动方法

  • (void) sliderValueChanged:(UISlider*)sender{
    //暂停定时器
    [_avTimer setFireDate:[NSDate distantFuture]];
    // 拖动改变音乐播放进度
    if (_player.status == AVPlayerItemStatusReadyToPlay) {
    // 总秒数
    CGFloat total = (CGFloat)_playerItem.duration.value / _playerItem.duration.timescale;
    // 已经拖动到了现在的秒数了。
    NSInteger dragedSeconds = floorf(total * sender.value);
    //转换成CMTime才能给player来控制播放进度---这个类用来控制时间的。
    CMTime dragedCMTime = CMTimeMake(dragedSeconds, 1);
    [_player pause];
    //改变显示时间方法
    _timeLabel_Play.text = [self changeTimeToCurrentDate:dragedSeconds];
    [_player seekToTime:dragedCMTime completionHandler:^(BOOL finished) {

          [_player play];
          
      }];
    

    }

    NSLog(@"滑块拖动调用这个方法");
    }

推荐阅读更多精彩内容