本篇主要介绍如何使用苹果自带的控件播放视频,一种是iOS9.0之前的:苹果提供了两个控制器,一个是带有界面的(可以模态弹出,也可以自定义view的frame),一个是不带界面的(需要自定义frame);另一种是iOS9.0之后的,这个弹出方式同第一种的第一个。
先介绍iOS9.0之前的:
注意:最好把DT版本调成9.0之前的(要不然会提示已过期,但是也不影响使用):
dt.png第一种:带有界面的播放器的控制器-MPMoviePlayerViewController
步骤:
1.导入MediaPlayer框架,创建MPMoviePlayerViewController
2.传入要播放的资源的URL
3.模态弹出此控制器
4.模态视图需要在当前视图加载完成之后再弹出
新建一个target:
ViewController.m
- (IBAction)didClickButtonPlay:(id)sender {
NSURL *url = [[NSBundle mainBundle]URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil];
MPMoviePlayerViewController *mp = [[MPMoviePlayerViewController alloc]initWithContentURL:url];
[self presentViewController:mp animated:YES completion:nil];
//mp.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, 200);//也可自定义mp.view的frame
// [self.view addSubview:mp.view];
}```
*这段代码写到viewDidLoad中,运行后,音乐会播放但是没有画面,此外控制台也会同时输出:*
2016-05-06 11:51:05.715 视频播放[7150:3663976] Warning: Attempt to present <MPMoviePlayerViewController: 0x7fe8914b1920> on <ViewController: 0x7fe8914a6eb0> whose view is not in the window hierarchy!*
(大的视图刚加载完成,就模态弹出另一个控制器,会有问题)
####第二种:不带界面的播放器的控制器-MPMoviePlayerController。
新建一个taget:
``ViewController.m``
import "ViewController.h"
import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()
//一定要强引用,否则,下面代码块里的mpc指针变量出了代码块就直接销毁
@property(nonatomic,strong) MPMoviePlayerController *mpc;
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[NSBundle mainBundle]URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil];
//注意:因为此控制器没有view,所以不能用模态方式弹出,此外,还需要强引用属性;还需要设置此控制器的view的frame(当没有控制器不自带view的时候,view得frame是空的);还需要将此控制器起的添加到外部控制器的view上;还需要主动调用播放;
self.mpc= [[MPMoviePlayerController alloc]initWithContentURL:url];// self.mpc.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200);
self.mpc.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, 200);[self.view addSubview:self.mpc.view];
//规范写法,(最好写上),如果不写的话也可以,因为调用play方法时候会自动调用此方法
[self.mpc prepareToPlay];[self.mpc play];
//控制模式自己可以根据需求设置上看看效果
/**
MPMovieControlStyleNone, // No controls
MPMovieControlStyleEmbedded, // Controls for an embedded view(默认)
MPMovieControlStyleFullscreen, // Controls for fullscreen playback
*/
self.mpc.controlStyle = MPMovieControlStyleEmbedded;
}
@end```
注意:
第一种方式视频播放完成后,view会自动回收,播放页面自动消失;
第二种方式视频播放完成后,view不会回收,就是说页面还在。此种方式适合播放下一个视频的需求,这时就需要检测视频播放的状态,在MPMoviePlayerController这个类里提供的是代理而是通知。
ViewController.m
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interface ViewController ()
@property(nonatomic,strong) MPMoviePlayerController *mpc;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//注册通知监测视频播放完毕
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackDidFinishNotification:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
}
#pragma mark 通知绑定的方法
- (void)moviePlayerPlaybackDidFinishNotification:(NSNotification *)notification
{
/**
MPMovieFinishReasonPlaybackEnded, 播放结束
MPMovieFinishReasonPlaybackError, 播放错误
MPMovieFinishReasonUserExited 退出播放
*/
//1. 获取通知结束的状态
NSInteger movieFinishKey = [notification.userInfo[MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
//2. 根据状态不同来自行填写逻辑代码
switch (movieFinishKey) {
case MPMovieFinishReasonPlaybackEnded:
NSLog(@"播放结束");
// 进行视频切换 需要两步
//1. 要想换视频, 就需要更换地址
self.mpc.contentURL = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
[self.mpc play];
break;
case MPMovieFinishReasonPlaybackError:
NSLog(@"播放错误");
break;
case MPMovieFinishReasonUserExited:
NSLog(@"退出播放");
// 如果是不带view的播放器, 那么播放完毕(退出/错误/结束)都应该退出
[self.mpc.view removeFromSuperview];
break;
default:
break;
}
}
- (IBAction)moviePlayerController:(id)sender{
NSURL *url = [[NSBundle mainBundle]URLForResource:@"Alizee_La_Isla_Bonita.mp4" withExtension:nil];
self.mpc= [[MPMoviePlayerController alloc]initWithContentURL:url];
// self.mpc.view.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200);
self.mpc.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, 200);
[self.view addSubview:self.mpc.view];
//规范写法,(最好写上),如果不写的话也可以,因为调用play方法时候会自动调用此方法
[self.mpc prepareToPlay];
[self.mpc play];
//控制模式自己可以根据需求设置上看看效果
/**
MPMovieControlStyleNone, // No controls
MPMovieControlStyleEmbedded, // Controls for an embedded view(默认)
MPMovieControlStyleFullscreen, // Controls for fullscreen playback
*/
self.mpc.controlStyle = MPMovieControlStyleEmbedded;
}
下面的是iOS9.0的其中一个视频播放的新特性:
一定要导入AVKit和AVFoundation框架
新建一个target
ViewController.m
#import "ViewController.h"
#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)playerViewController {
//1. 获取URL地址
NSURL *url = [[NSBundle mainBundle] URLForResource:@"Cupid_高清.mp4" withExtension:nil];
//2. AV播放视图控制器
AVPlayerViewController *pVC = [AVPlayerViewController new];
//3. 创建player --> 设置时需要传入网址
pVC.player = [AVPlayer playerWithURL:url];
//4. 开始播放
[pVC.player play];
//5. 模态弹出
//[self presentViewController:pVC animated:YES completion:nil];
//5. 如果想要自定义播放器的大小,应该自定义 --> 设置frame / 添加到视图中
// pVC.view.frame = CGRectMake(-150, 150, self.view.bounds.size.height, self.view.bounds.size.width);
// CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);
//
// pVC.view.transform=rotation;
pVC.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
[self.view addSubview:pVC.view];
}
@end