文章目录
一、AVPlayer
1、简介
2、视频播放的解决方案
二、AVPlayer中的MVC
1、v层 :AVPlayerLayer
2、m层 :AVPlayerItem
3、c层 :AVPlayer
三、实现简单的播放、暂停功能
1、播放
2、暂停
3、视频播放暂停实现
一、AVPlayer
1、简介
OC 提供了三种视频播放解决方案,分别是
(1)MediaPlayer.framework 框架下的 MPMoviePlayerController,它支持本地视频和网络视频播放。
(2) MediaPlayer.framework 框架下的 MPMoviePlayerViewController,它支持本地视频和网络视频播放。
(3) AVFoundation 框架下的AVPlayer 。
MPMoviePlayerViewController
继承 UIViewcontroller
,其实是对 MPMoviePlayerController的封装,即 MPMoviePlayerViewController.view = MPMoviePlayerController
MPMoviePlayerController足够强大,几乎不用写几行代码
就能完成一个播放器,但是正是由于它的高度封装使得要自定义这个播放器
变得很复杂,甚至是不可能完成。例如有些时候需要自定义播放器的样式,
那么如果要使用MPMoviePlayerController就不合适了,
如果要对视频有自由的控制则可以使用AVPlayer。
AVPlayer存在于AVFoundation中,它更加接近于底层
,所以灵活性也更强。
二、AVPlayer中的MVC
1、view层:对应 AVPlayerLayer 。AVPlayer本身并不能显示视频,而且它也不像MPMoviePlayerController有一个view属性。如果AVPlayer要显示必须创建一个播放器层AVPlayerLayer用于展示,播放器层继承于CALayer,有了AVPlayerLayer之添加到控制器视图的layer中即可。
2、model层 : 对应AVPlayerItem 。我们在它的便利构造器方法中可以看到他需要我们传入一个AVPlayerItem也就是播放单元,所谓的播放单元就是给播放器提供了一个数据的来源。
3、controller层 :对应AVPlayer。 创建AVPlayerLayer的时候,我们需要先有一个AVPlayer,它用MVC来分类的话就相当于MVC中的C层,负责播放单元和播放界面的协调工作。
三、实现简单的播放、暂停功能
注意:AVPlayer对应着两个方法play、pause来实现。
但是关键问题是如何判断当前视频是否在播放,在前面的内容中
无论是音频播放器还是视频播放器都有对应的状态来判断,
但是AVPlayer却没有这样的状态属性,通常情况下可以
通过判断播放器的播放速度来获得播放状态。
如果rate为0说明是停止状态,1是则是正常播放状态。
1、播放(play)
- (void)play
{
if (self.avplayer.rate == 0)
{
[self.avplayer play];
}
}// 播放
2、暂停(pause)
- (void)pause
{
if (self.avplayer.rate != 0)
{
[self.avplayer pause];
}
}//暂停
3、视频播放暂停实现
//
// MainViewController.m
// 5.视频播放
//
// Created by cherish on 2018/4/17.
// Copyright © 2018年 Cherish. All rights reserved.
//
#import "MainViewController.h"
#import
#define KScreemWidth [UIScreen mainScreen].bounds.size.width
#define KScreemHeight [UIScreen mainScreen].bounds.size.height
@interface MainViewController ()
//视频播放器
@property (nonatomic,strong) AVPlayer *avplayer;
@end
@implementation MainViewController
#pragma mark - ViewController Life
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"视频播放";
[self setUI];
}//视频加载
#pragma mark - Private Methods
- (void)setUI
{
//初始化视频播放地址
NSURL *mediaUrl = [NSURL URLWithString:@"http://tdqc-v3.oss-cn-shenzhen.aliyuncs.com/Formal/user/comments/2018/04/07/evenvirmentProtected.mp4"];
// 初始化播放单元
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:mediaUrl];
//初始化播放器对象
self.avplayer = [[AVPlayer alloc]initWithPlayerItem:item];
//显示画面
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.avplayer];
//视频填充模式
layer.videoGravity = AVLayerVideoGravityResizeAspect;
//设置画布frame
layer.frame = CGRectMake(0, KScreemHeight/2-250/2, KScreemWidth, 250);
//添加到当前视图
[self.view.layer addSublayer:layer];
//设置播放暂停按钮
NSArray *titles = @[@"播放",@"暂停"];
CGFloat gap = (KScreemWidth-120)/3.0f;
for (int i = 0; i < 2; i++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:titles[i] forState:UIControlStateNormal];
btn.backgroundColor = [UIColor redColor];
btn.tag = 555+i;
btn.frame = CGRectMake(gap+i*(gap+60), KScreemHeight-100, 60, 40);
btn.titleLabel.textAlignment = NSTextAlignmentCenter;
btn.titleLabel.font = [UIFont systemFontOfSize:16.0f];
[btn addTarget:self action:@selector(targetAction:) forControlEvents:UIControlEventTouchUpInside];
[btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[self.view addSubview:btn];
}
}//绘制UI
#pragma mark - Action Methods
- (void)targetAction:(UIButton*)sender
{
switch (sender.tag) {
case 555: //播放
[self play];
break;
case 556: //暂停
[self pause];
break;
default:
break;
}
}
- (void)play
{
if (self.avplayer.rate == 0) {
[self.avplayer play];
}
}// 播放
- (void)pause
{
if (self.avplayer.rate != 0)
{
[self.avplayer pause];
}
}//暂停
@end
视频播放暂停demo