您的位置:首页 > 其它

AVPlayer介绍

2015-11-06 16:48 148 查看
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:若有误 欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: