AVPlayer介绍
AVPlayer通常用来播放音乐,其内部已封装了流媒体功能 ,拿到网络url可以做到边缓存边播放的功能。
顺便提一下:AVAudioPlayer只能用本地的 url 来播放音乐
用 data 也需要把歌曲全部缓存后才可播放 做不到 边缓存边播放的效果
// AVAudioPlayer两种方式
AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//注意:一个AVAudioPlayer只能播放一个url
AVAudioPlayer *player=[[AVAudioPlayeralloc]initWithData:mydata error:nil];
iOS 开发中,播放视频通常有两种方式,一种是 AVPlayer,另一种是MPMoviePlayerController 不过后者需要导入MediaPlayer.Framework。
在 ios9之后苹果已推荐播放视频也使用 AVPlayer
先讲使用 AVPlayer播放音乐
//创建一个AVPlayer播放类
@property (nonatomic, strong) AVPlayer *player;
//AVPlayerItem(多媒体资源)
@property (nonatomic, strong) AVPlayerItem *playerItem;
//AVAsset(音视频当中单个资源,例如声道)
//@property (nonatomic, strong) AVAsset
需要导入 AVFoundation框架
xcode7之后 只需要导入头文件
一般我们需要播放音乐都需要创建 AVPlayer 及 AVPlayerItem
AVPlayerItem是管理资源的对象
self.player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@""]]];
[self.player play];
[self.player pause];
一般播放音乐只需要以上代码即可 去掉 playerItem 也可实现
若是需要做到网上音乐播放器的功能 建议写一个工具类专门用来播放音乐 //有空写一个贴出
若使用一个 AVPlayer 对象播放音乐 建议每次将item当中的所有资源替换成最新的
[self.player replaceCurrentItemWithPlayerItem:self.playerItem];
在音乐播放前最好先确认音乐资源是否缓冲成功
AVPlayer 的 status 属性有三种状态
AVPlayerStatusUnknown,
AVPlayerStatusReadyToPlay,
AVPlayerStatusFailed
当status等于AVPlayerStatusReadyToPlay时代表音乐已经可以播放了,即可调用 play方法。
另外介绍几个属性方法,可用作制作播放器
duration 音乐或视频总时间
loadedTimeRange属性代表已经缓冲的进度
currentTime 已经播放的时间
//把现在播放的时间给 slider需要这样用
slider.value = self.player.currentTime.value / self.player.currentTime.timescale;
seekToTime
有时候seekToTime:(CMTime)time不行可以使用
- (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter;
实现快进快退
播放器需要多次用到 KVO 观察者
以后补充
另外说一下歌词如何做的思路
首先我们要拿到歌曲的 lrc文件
去掉一些字符串 只剩下时间和歌词 需要一个时间的数组
每个时间对应一段歌词
将现在的时间去时间数组中遍历 拿到歌词
将此歌词所在的 cell 高亮现实 并将此 cell 置中
4种播放模式 后台播放 锁屏后的展示 工具类写好再一一讲解
快速利用系统自带播放视频
//引入 AVKit
self.playerItem = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"视频 url"]];
AVPlayerViewController *vc = [[AVPlayerViewController alloc]init];
vc.player = [AVPlayer playerWithPlayerItem:self.playerItem];
[self presentViewController:vc animated:YES completion:nil];
建议还是创建 controller 好好写 不然应该实现不了播放视频后自动横屏功能
下面贴两段分别用 AVPlayer 和 MediaPlayer 播放视频代码
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"movieName" ofType:@"movie"];
NSURL *movieURL = [NSURL fileURLWithPath:filePath];
AVAsset *movieAsset = [AVURLAsset URLAssetWithURL:movieURL options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.layer.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.view.layer addSublayer:playerLayer];
[player play];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"movie"];
NSURL *movieURL = [NSURL fileURLWithPath:filePath];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
moviePlayer.view.frame=CGRectMake(0, 0, 1024, 768);
moviePlayer.controlStyle=MPMovieControlStyleNone;
[self.view addSubview:moviePlayer.view];
注意:AVPlayer影片是放在AVPlayerLayer里面,AVPlayerLayer是CALayer的子类,MediaPlayer是放在UIView 里面。
//AVPlayer也能用于直播 今后补充
//有空帖整个播放器的详细代码
ps:若有误 欢迎指正