IOS9.0的改变
弃用MPMoviePlayerViewController(导入的是MediaPlayer框架)
使用AVPlayerViewController(导入的是AVKit框架)
AVPlayer 是专门用来播放音视频的类
AVPlayer的一些常用属性
play
pause
跳转进度 seekToTime:
currentItem 当前播放的视频元素
volume 调节音量
externalPlaybackVideoGravity 视频显示的播放样式
AVLayerVideoGravityResizeAspect 普通的
AVLayerVideoGravityResizeAspectFill充满的
currentTime获得当前时间 -> CMTime ->CMTimeGetSeconds()通过CMTime获得当前播放时间(单位是秒)
CMTime专门用来表示视频的播放进度的
value(进度)
timeScale(帧率)
kCMTimeZero 表示初始进度
seekToTime:可以跳转到某一个进度
AVPlayerItem 要播放的音视频的对象
duration 是CMTime类型 总时长
status 加载的状态
AVPlayerItemStatusUnknown, 未知状态
AVPlayerItemStatusReadyToPlay, 准备播放状态
AVPlayerItemStatusFailed 失败状态
时间控制的一个类目
currentTime 获得当前播放时间
forwardPlaybackEndTime 跳到结束位置
reversePlaybackEndTime 跳到开始位置
seekToTime:
AVPlayerLayer 播放显示音视频的图层界面
AVPlayerViewController 视图控制器 可以显示视频并且有调节控件
使用
AVPlayer直接播放
创建AVPlayerItem 视频内容相关
创建方式
1、playerItemWithURL:类方法 通过URL地址创建要播放的对象(可以播放本地的内容也可以播放在线的内容)
2、initWithURL:构造方法
3、playerItemWithAsset:通过设备相册里面的内容创建一个对象
4、initWithAsset:
5、playerItemWithAsset:automaticallyLoadedAssetKeys自动根据要求的Key去加载相册里面的内容
6、initWithAsset:automaticallyLoadedAssetKeys:
创建AVPlayer
<1>创建方式 视频操作相关
1、playerWithURL:根据URL去创建播放器 不需使用item2、initWithURL:3、playerWithPlayerItem:需要传入一个视频播放内容4、initWithPlayerItem:5、获得播放结束的状态6、seekToTime跳转到某个进度7、CMTime:结构体 value(进度) timeScale(帧率)
创建AVPlayerLayer 添加到父视图
<1>根据播放器去创建一个可以显示视频的图层playerLayerWithPlayer:->类方法<2>设置它的位置frame是没有动画效果的<3>把视频图层添加到父图层
播放 播放器 play
控制器播放
1、创建AVPlayer
2、创建视频播放视图的控制器
3、将创建的AVPlayer赋值给控制器自带的player
4、跳转到控制器播放
注意:使用控制器播放需要再导入一个AVKit框架
代码示例
#import"ViewController.h"#import#import@interfaceViewController(){AVPlayer*player;}@end@implementationViewController- (void)viewDidLoad { [superviewDidLoad];UIButton*button = [UIButtonbuttonWithType:UIButtonTypeCustom]; button.frame=CGRectMake(100,100,120,100); [button setTitle:@"AVPlayer播放"forState:UIControlStateNormal]; [button addTarget:selfaction:@selector(demo1) forControlEvents:UIControlEventTouchUpInside]; [self.viewaddSubview:button];UIButton*button1 = [UIButtonbuttonWithType:UIButtonTypeCustom]; button1.frame=CGRectMake(240,100,100,100); [button1 setTitle:@"控制器播放"forState:UIControlStateNormal]; [button1 addTarget:selfaction:@selector(demo2) forControlEvents:UIControlEventTouchUpInside]; [self.viewaddSubview:button1];}#pragma mark ------AVPlayer播放-(void)demo1{/*
视频播放需要AVPlayer、AVPlayerItem、AVPlayerLayer
三者的关系及作用:
AVPlayer(视频播放器) 去播放 -> AVPlayerItem(视频播放的元素) -> AVPlayerLayer(展示播放的视图)
*///1、创建要播放的元素/*
本地的一个视频
NSString *path = [[NSBundle mainBundle]pathForResource:@"1" ofType:@"m4v"];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:path]];
*/AVPlayerItem*playerItem = [AVPlayerItemplayerItemWithURL:[NSURLURLWithString:@"http://down.treney.com/mov/test.mp4"]];//2、创建播放器player = [AVPlayerplayerWithPlayerItem:playerItem];//3、创建视频显示的图层AVPlayerLayer*showVodioLayer = [AVPlayerLayerplayerLayerWithPlayer:player]; showVodioLayer.frame=self.view.frame; [self.view.layeraddSublayer:showVodioLayer];//4、播放视频[player play];//获得播放结束的状态 -> 通过发送通知的形式获得 ->AVPlayerItemDidPlayToEndTimeNotification[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(itemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];//只要可以获得到当前视频元素准备好的状态 就可以得到总时长//采取KVO的形式获得视频总时长//通过监视status 判断是否准备好 -> 获得[playerItem addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];}//当status的值改变的时候会调用这个方法-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{NSLog(@"%@",change[@"new"]);AVPlayerItemStatusstatus = [change[@"new"] integerValue];switch(status) {caseAVPlayerItemStatusUnknown: {NSLog(@"未知状态");break; }caseAVPlayerItemStatusReadyToPlay: {NSLog(@"视频的总时长%f", CMTimeGetSeconds(player.currentItem.duration));break; }caseAVPlayerItemStatusFailed: {NSLog(@"加载失败");break; } }}//快进-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event{//快进//跳到某一个进度的方法:seekToTime://得到当前的时间 + 快进的时间//获得当前播放的时间 (秒)Float64 cur = CMTimeGetSeconds(player.currentTime); cur ++; [player seekToTime:CMTimeMake(cur,1)];}-(void)itemDidPlayToEndTime:(NSNotification*)not{NSLog(@"播放结束"); [player seekToTime:kCMTimeZero];}#pragma mark -----控制器播放-(void)demo2{//1、创建AVPlayer/*
本地视频
NSURL *url = [[NSBundle mainBundle]URLForResource:@"IMG_9638.m4v" withExtension:nil];
AVPlayer *player = [AVPlayer playerWithURL:url];
*///网页视频AVPlayer*player1 = [AVPlayerplayerWithURL:[NSURLURLWithString:@"http://down.treney.com/mov/test.mp4"]];//2、创建视频播放视图的控制器AVPlayerViewController*playerVC = [[AVPlayerViewControlleralloc]init];//3、将创建的AVPlayer赋值给控制器自带的playerplayerVC.player= player1;//4、跳转到控制器播放[selfpresentViewController:playerVC animated:YEScompletion:nil]; [playerVC.playerplay];}@end