一: MPMoviePlayerController
在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频播放。这个类实现了MPMediaPlayback协议,因此具备一般的播放器控制功能,例如播放、暂停、停止等。但是MPMediaPlayerController自身并不是一个完整的视图控制器,如果要在UI中展示视频需要将view属性添加到界面中。下面列出了MPMoviePlayerController的常用属性和方法:
@property (nonatomic, copy) NSURL *contentURL //播放媒体URL,这个URL可以是本地路径,也可以是网络路径
@property (nonatomic, readonly) UIView *view//播放器视图,如果要显示视频必须将此视图添加到控制器视图中
@property (nonatomic, readonly) UIView *backgroundView//播放器背景视图
@property (nonatomic, readonly) MPMoviePlaybackState playbackState//媒体播放状态,枚举类型:
MPMoviePlaybackStateStopped://停止播放
MPMoviePlaybackStatePlaying://正在播放
MPMoviePlaybackStatePaused://暂停
MPMoviePlaybackStateInterrupted://中断
MPMoviePlaybackStateSeekingForward://向前定位
MPMoviePlaybackStateSeekingBackward://向后定位
@property (nonatomic, readonly) MPMovieLoadState loadState//网络媒体加载状态,枚举类型:
MPMovieLoadStateUnknown:
MPMovieLoadStatePlayable:
MPMovieLoadStatePlaythroughOK://这种状态如果shouldAutoPlay为YES将自动播放
MPMovieLoadStateStalled://停滞状态
@property (nonatomic) MPMovieControlStyle controlStyle//控制面板风格,枚举类型:
MPMovieControlStyleNone://无控制面板
MPMovieControlStyleEmbedded://嵌入视频风格
MPMovieControlStyleFullscreen://全屏
MPMovieControlStyleDefault://默认风格
@property (nonatomic) MPMovieRepeatMode repeatMode;//重复播放模式,枚举类型:
MPMovieRepeatModeNone://不重复,默认值
MPMovieRepeatModeOne://重复播放
@property (nonatomic)BOOL shouldAutoplay//当网络媒体缓存到一定数据时是否自动播放,默认为YES
@property (nonatomic, getter=isFullscreen)BOOL fullscreen//是否全屏展示,默认为NO,注意如果要通过此属性设置全屏必须在视图显示完成后设置,否则无效
@property (nonatomic) MPMovieScalingMode scalingMode//视频缩放填充模式,枚举类型:
MPMovieScalingModeNone://不进行任何缩放
MPMovieScalingModeAspectFit://固定缩放比例并且尽量全部展示视频,不会裁切视频
MPMovieScalingModeAspectFill://固定缩放比例并填充满整个视图展示,可能会裁切视频
MPMovieScalingModeFill://不固定缩放比例压缩填充整个视图,视频不会被裁切但是比例失衡
@property (nonatomic, readonly)BOOL readyForDisplay//是否有相关媒体被播放
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes//媒体类别,枚举类型:
MPMovieMediaTypeMaskNone://未知类型
MPMovieMediaTypeMaskVideo://视频
MPMovieMediaTypeMaskAudio://音频
@property(nonatomic, readonly)BOOL isPreparedToPlay//是否准备好播放
@property(nonatomic) NSTimeInterval currentPlaybackTime//当前播放时间,单位:秒
@property(nonatomic)float currentPlaybackRate//当前播放速度,如果暂停则为0,正常速度为1.0,非0数据表示倍率
- (instancetype)initWithContentURL:(NSURL *)url//使用指定的URL初始化媒体播放控制器对象
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated//设置视频全屏,注意如果要通过此方法设置全屏则必须在其视图显示之后设置,否则无效
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option//获取在指定播放时间的视频缩略图,第一个参数是获取缩略图的时间点数组;第二个参数代表时间点精度,枚举类型:
MPMovieTimeOptionNearestKeyFrame://时间点附近
MPMovieTimeOptionExact://准确时间
- (void)cancelAllThumbnailImageRequests//取消所有缩略图获取请求
- (void)prepareToPlay//准备播放,加载视频数据到缓存,当调用play方法时如果没有准备好会自动调用此方法
- (void)play//开始播放
- (void)pause//暂停播放
- (void)stop//停止播放
- (void)beginSeekingForward//向前定位
- (void)beginSeekingBackward//向后定位
- (void)endSeeking//停止快进/快退
@interface MPMoviePlayerController (MPMovieProperties)
//该属性返回MPMoviePlayerController播放的多媒体类型。
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes;
typedefNS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) {
MPMovieMediaTypeMaskNone =0,
MPMovieMediaTypeMaskVideo =1 <<0,
MPMovieMediaTypeMaskAudio =1 <<1
};
@property (nonatomic) MPMovieSourceType movieSourceType;
typedefNS_ENUM(NSInteger, MPMovieSourceType) {
MPMovieSourceTypeUnknown,//未知来源
MPMovieSourceTypeFile, //本地文件 Local or progressively downloaded network content
MPMovieSourceTypeStreaming//流媒体(直播或点播) Live or on-demand streaming content
};
//媒体时长,如果未知则返回0
@property (nonatomic, readonly) NSTimeInterval duration;
//媒体可播放时长,主要用于表示网络媒体已下载视频时长
@property (nonatomic, readonly) NSTimeInterval playableDuration;
//返回视频的大小,如果未知则返回CGSizeZero
@property (nonatomic, readonly) CGSize naturalSize;
//起始播放时间
@property (nonatomic) NSTimeInterval initialPlaybackTime;
//终止播放时间
@property (nonatomic) NSTimeInterval endPlaybackTime;
//当前媒体是否正在通过AirPlay播放。即无限播放视频
@property (nonatomic)BOOL allowsAirPlayNS_AVAILABLE_IOS(4_3);
//当前是否处于无限播放模式。
@property (nonatomic, readonly, getter=isAirPlayVideoActive)BOOL airPlayVideoActiveNS_AVAILABLE_IOS(5_0);
@end
//通知中心部分
MPMoviePlayerScalingModeDidChangeNotification//视频缩放填充模式发生改变
MPMoviePlayerPlaybackDidFinishNotification//媒体播放完成或用户手动退出,具体完成原因可以通过通知userInfo中的key为MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的对象获取
MPMoviePlayerPlaybackStateDidChangeNotification//播放状态改变,可配合playbakcState属性获取具体状态
MPMoviePlayerLoadStateDidChangeNotification//媒体网络加载状态改变
MPMoviePlayerNowPlayingMovieDidChangeNotification//当前播放的媒体内容发生改变
MPMoviePlayerWillEnterFullscreenNotification//将要进入全屏
MPMoviePlayerDidEnterFullscreenNotification//进入全屏后
MPMoviePlayerWillExitFullscreenNotification//将要退出全屏
MPMoviePlayerDidExitFullscreenNotification//退出全屏后
MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification//当媒体开始通过AirPlay播放或者结束AirPlay播放
MPMoviePlayerReadyForDisplayDidChangeNotification//视频显示状态改变
MPMovieMediaTypesAvailableNotification//确定了媒体可用类型后
MPMovieSourceTypeAvailableNotification//确定了媒体来源后
MPMovieDurationAvailableNotification//确定了媒体播放时长后
MPMovieNaturalSizeAvailableNotification//确定了媒体的实际尺寸后
MPMoviePlayerThumbnailImageRequestDidFinishNotification//缩略图请求完成之后
MPMediaPlaybackIsPreparedToPlayDidChangeNotification//做好播放准备后
注意MPMediaPlayerController的状态等信息并不是通过代理来和外界交互的,而是通过通知中心,因此从上面的列表中可以看到常用的一些通知。
//MPMoviePlayerController播放视频的步骤:
1)创建MPMoviePlayerController对象。创建该对象时可调用- (instancetype)initWithContentURL:(NSURL *)url方法进行初始化,获取播放器播放的资源。
2)设置MPMoviePlayerController对象的view的frame属性,该属性用于控制播放器的可视化界面的大小和位置。
3)将MPMoviePlayerController的view添加到控制器视图中进行播放。如果需要进行全屏幕播放,调用
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated方法即可。
1)实现一个基本的视频播放,代码如下:
#import <UIKit/UIKit.h>
@interface FKViewController :UIViewController
@property (strong,nonatomic) IBOutlet UIView *movieView;
- (IBAction)play:(id)sender;
@end
#import <MediaPlayer/MediaPlayer.h>
#import "FKViewController.h"
@interfaceFKViewController (){
MPMoviePlayerController *moviePlayer;
}
@end
@implementation FKViewController
- (void)viewDidLoad
{
[superviewDidLoad];
// 1 创建本地URL(也可创建基于网络的URL)
NSURL * movieUrl = [[NSBundlemainBundle]URLForResource:@"movie"withExtension:@"mp4"];
//使用指定URL创建MPMoviePlayerController
// 2 MPMoviePlayerController将会播放该URL对应的视频
moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:movieUrl];
//设置该播放器的控制条风格。
moviePlayer.controlStyle =MPMovieControlStyleEmbedded;
//设置该播放器的缩放模式
moviePlayer.scalingMode =MPMovieScalingModeAspectFit;
[moviePlayer.view setFrame:CGRectMake(0 ,0 ,380 , 320)];
[moviePlayer prepareToPlay];
}
// 重写该方法,控制该视图控制器只支持横屏显示
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
- (IBAction)play:(id)sender{
//3开始播放
[self.movieView addSubview:moviePlayer.view];
}
@end
2:接下来进一步学习:弹出一个全屏界面播放视频
#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@interfaceViewController ()
//播放器视图控制器
@property (nonatomic,strong)MPMoviePlayerViewController *moviePlayerViewController;
@end
@implementation ViewController
#pragma mark - 控制器视图方法
- (void)viewDidLoad {
[superviewDidLoad];
}
-(void)dealloc{
//移除所有通知监控
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
#pragma mark - 私有方法
/**
* 取得本地文件路径
*
* @return 文件路径
*/
-(NSURL *)getFileUrl{
NSString *urlStr=[[NSBundlemainBundle]pathForResource:@"The New Look of OS X Yosemite.mp4"ofType:nil];
NSURL *url=[NSURLfileURLWithPath:urlStr];
return url;
}
/**
* 取得网络文件路径
*
* @return 文件路径
*/
-(NSURL *)getNetworkUrl{
NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURLURLWithString:urlStr];
return url;
}
-(MPMoviePlayerViewController *)moviePlayerViewController{
if (!_moviePlayerViewController) {
NSURL *url=[self getNetworkUrl];
_moviePlayerViewController=[[MPMoviePlayerViewController alloc]initWithContentURL:url];
[selfaddNotification];
}
return_moviePlayerViewController;
}
#pragma mark - UI事件 点击模态化出现播放界面.
- (IBAction)playClick:(UIButton *)sender {
self.moviePlayerViewController=nil;//保证每次点击都重新创建视频播放控制器视图,避免再次点击时由于不播放的问题。所以当再次点击播放弹出新的模态窗口的时如果不销毁之前的MPMoviePlayerViewController,那么新的对象就无法完成初始化,这样也就不能再次进行播放。
// [self presentViewController:self.moviePlayerViewController animated:YES completion:nil];
//注意,在MPMoviePlayerViewController.h中对UIViewController扩展两个用于模态展示和关闭MPMoviePlayerViewController的方法,增加了一种下拉展示动画效果
[self presentMoviePlayerViewControllerAnimated:self.moviePlayerViewController];
}
#pragma mark - 控制器通知
/**
* 添加通知监控媒体播放控制器状态
*/
-(void)addNotification{
NSNotificationCenter *notificationCenter=[NSNotificationCenterdefaultCenter];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotificationobject:self.moviePlayerViewController.moviePlayer];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished: )name:MPMoviePlayerPlaybackDidFinishNotificationobject:self.moviePlayerViewController.moviePlayer];
}
/**
* 播放状态改变,注意播放完成时的状态是暂停
*
* @param notification通知对象
*/
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
switch (self.moviePlayerViewController.moviePlayer.playbackState) {
caseMPMoviePlaybackStatePlaying:
NSLog(@"正在播放...");
break;
caseMPMoviePlaybackStatePaused:
NSLog(@"暂停播放.");
break;
caseMPMoviePlaybackStateStopped:
NSLog(@"停止播放.");
break;
default:
NSLog(@"播放状态:%li",self.moviePlayerViewController.moviePlayer.playbackState);
break;
}
}
/**
* 播放完成
*
* @param notification通知对象
*/
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
NSLog(@"播放完成.%li",self.moviePlayerViewController.moviePlayer.playbackState);
}
@end