视频播放,不用多说大家都能知道是什么怎样操作,现在手机软件中有很多视频播放的软件,今天我们来学习一下用代码怎样实现视频播放。
一、介绍一下iOS9.0之后的改变
iOS9.0之后弃用MPMoviePlayerViewController这个类以及需要导入框架MediaPlayer
iOS9.0使用的AVPlayerViewController,需要导入的框架是AVFoundation
二、介绍使用到的类
AVPlayer:播放音视频
AVPlayerItem:音视频的对象
AVPLayerLayer:播放显示视频的图层界面
AVPlayerViewController:视图控制器,可以显示视频并且有调节控件
三、具体的使用
使用
1、AVPlayer:直接播放
(1)创建AVPlayerItem视频内容相关
(2)创建AVPlayer
(3)创建AVPlayerLayer添加到父视图视频操作相关
(4)播放
创建AVPlayerItem的方法
1、playerItemWithURL:类方法通过URL地址创建要播放的对象(可以是本地也可是在线)
2、initWithURL:构造方法
3、playerItemWithAsset:通过设备相册里面的内容创建一个要播放的对象
4、playerItemWithAsset:automaticallyLoadedAssetKeys自动根据要求的Key去加载相册里面的内容
5、initWithAsset:automaticallyLoadedAssetKeys:
1、playerWithURL:URL
2、initWithURL:URL
3、playerWithPlayerItem:item
4、initWithPlayerItem:item
创建AVPlayerLayer的方法
(1)根据播放器去创建一个可以显示的图层playerLayerWithPlayer:类方法
(2)设置位置frame
(3)将显示的图层添加到父图层
(4)播放器*****play开始播放
(5)获得播放状态
AVPlayerItem:音视频播放的对象
duration:总时长
status:记载状态
AVPlayerItemStatusUnknown,未知状态
AVPlayerItemStatusReadyToPlay,准备播放
AVPlayerItemStatusFailed失败
其他属性
seekToTime跳转到某一个进度
CMTime:结构体两个参数 value timeScale(帧率)
AVPlayer播放音视频
play:播放
pause:暂停
seekToTime:跳转进度
currentItem:当前播放的视频元素
volum:调节音量
externaPlaybackVideoGravity
视频显示的样式:
AVLayerVideoGravityResizeAspect:普通的
AVLayerVideoGravityResizeAspectFill:充满的
currentTime:获得当前播放的时间 CMTime类型
通过CMTime获得当前时间秒CMTimeGetSeconds(
CMTime time)
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interfaceViewController ()
{
AVPlayer *player;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100,100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorblueColor];
[button addTarget:selfaction:@selector(doit)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)doit{
/*
视频播放需要三个东西:AVPlayer、AVPlayerItem、AVPlayerLayer
AVPlayer:是一个视频播放器,去播放视频
AVPlayerItem:视频播放的元素
AVPlayerLayer:展示播放的视图
*/
// 1、创建播放的元素
NSURL *URL = [[NSBundlemainBundle]URLForResource:@"IMG_9638.m4v"withExtension:nil];
AVPlayerItem *item = [AVPlayerItemplayerItemWithURL:URL];
// 2、创建播放器
player = [AVPlayerplayerWithPlayerItem:item];
// 3、创建视频播放的图层
AVPlayerLayer *layer = [AVPlayerLayerplayerLayerWithPlayer:player];
layer.frame =self.view.frame;
// 4、添加到父视图上
[self.view.layeraddSublayer:layer];
// 5、开始播放
[playerplay];
// 获得播放结束的状态,通过发送通知的形式获得播放结束的状态->AVPlayerItemDidPlayToEndTimeNotification
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(itemDidPlayToEndTime:)name:AVPlayerItemDidPlayToEndTimeNotificationobject:nil];
// NSLog(@"获得视频总时长%f",CMTimeGetSeconds(player.currentItem.duration));
// player.currentItem.status =只要可以获得到当前视频元素准备好的状态,就可以得到总时长
// 采取KVO的形式获得总时长
// 通过监视status判断是否准备好 -->获得
[item addObserver:selfforKeyPath:@"status"options:NSKeyValueObservingOptionNewcontext:nil];
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 获得当前播放的时间
Float64 cur =CMTimeGetSeconds(player.currentTime);
cur += 1;
[playerseekToTime:CMTimeMake(cur,1)];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
// NSLog(@"status:%@",change[@"new"]);
switch ([change[@"new"]integerValue]) {
case0:
{
NSLog(@"未知状态");
}
break;
case1:
{
NSLog(@"获得视频的总时长%f",CMTimeGetSeconds(player.currentItem.duration));
}
break;
case2:
{
NSLog(@"加载失败");
}
break;
default:
break;
}
}
- (void)itemDidPlayToEndTime:(NSNotification *)not{
NSLog(@"播放结束");
// CMTime表示视频播放的进度
// value(具体的进度) timescale(帧率)
// CMTimeMake(<#int64_t value#>, <#int32_t timescale#>)
// kCMTimeZero:表示初始进度
// seekToTime:跳转到某一个进度
[playerseekToTime:kCMTimeZero];
}
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interfaceViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame =CGRectMake(100,100, 100,100);
[button setTitle:@"TICK"forState:UIControlStateNormal];
button.backgroundColor = [UIColorbrownColor];
[button addTarget:selfaction:@selector(playMovie)forControlEvents:UIControlEventTouchUpInside];
[self.viewaddSubview:button];
}
- (void)playMovie{
// 1、AVPLayer
AVPlayer *player = [AVPlayerplayerWithURL:[[NSBundlemainBundle] URLForResource:@"IMG_9638.m4v"withExtension:nil]];
// 创建视频播放视图的控制器
AVPlayerViewController *playerVC = [[AVPlayerViewControlleralloc] init];
playerVC.player = player;
playerVC.showsPlaybackControls =NO;
playerVC.view.frame =CGRectMake(100,100, 100,100);
[self.viewaddSubview:playerVC.view];
// [self presentViewController:playerVC animated:YES completion:nil];
[playerVC.playerplay];
}