介绍
- 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去创建播放器 不需使用item
2、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 <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interface ViewController (){
AVPlayer *player;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100, 120, 100);
[button setTitle:@"AVPlayer播放" forState:UIControlStateNormal];
[button addTarget:self action:@selector(demo1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
button1.frame = CGRectMake(240, 100, 100, 100);
[button1 setTitle:@"控制器播放" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(demo2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: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 = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://down.treney.com/mov/test.mp4"]];
//2、创建播放器
player = [AVPlayer playerWithPlayerItem:playerItem];
//3、创建视频显示的图层
AVPlayerLayer *showVodioLayer = [AVPlayerLayer playerLayerWithPlayer:player];
showVodioLayer.frame = self.view.frame;
[self.view.layer addSublayer:showVodioLayer];
//4、播放视频
[player play];
//获得播放结束的状态 -> 通过发送通知的形式获得 ->AVPlayerItemDidPlayToEndTimeNotification
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(itemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
//只要可以获得到当前视频元素准备好的状态 就可以得到总时长
//采取KVO的形式获得视频总时长
//通过监视status 判断是否准备好 -> 获得
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}
//当status的值改变的时候会调用这个方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%@",change[@"new"]);
AVPlayerItemStatus status = [change[@"new"] integerValue];
switch (status) {
case AVPlayerItemStatusUnknown: {
NSLog(@"未知状态");
break;
}
case AVPlayerItemStatusReadyToPlay: {
NSLog(@"视频的总时长%f", CMTimeGetSeconds(player.currentItem.duration));
break;
}
case AVPlayerItemStatusFailed: {
NSLog(@"加载失败");
break;
}
}
}
//快进
-(void)touchesMoved:(NSSet<UITouch *> *)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 = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://down.treney.com/mov/test.mp4"]];
//2、创建视频播放视图的控制器
AVPlayerViewController *playerVC = [[AVPlayerViewController alloc]init];
//3、将创建的AVPlayer赋值给控制器自带的player
playerVC.player = player1;
//4、跳转到控制器播放
[self presentViewController:playerVC animated:YES completion:nil];
[playerVC.player play];
}
@end
出来的效果应该是这样的:
AVPlayer播放:
控制器播放: