MPMoviePlayerController是iOS中进行视频播放开发的一个控制类,里面涵盖了视频播放中大部分的需求功能,在使用这个框架时,需要导入头文件<MediaPlayer/MediaPlayer.h>
MPMoviePlayerController具备一般的播放器控制功能,例如播放、暂停、停止等。但是MPMediaPlayerController自身并不是一个完整的视图控制器,如果要在UI中展示视频需要将view属性添加到界面中。
扩充MPMoviePlayerViewController:其实MPMoviePlayerController如果不作为嵌入视频来播放(例如在新闻中嵌入一个视频),通常在播放时都是占满一个屏幕的,特别是在iPhone、iTouch上。因此从iOS3.2以后苹果也在思考既然MPMoviePlayerController在使用时通常都是将其视图view添加到另外一个视图控制器中作为子视图,那么何不直接创建一个控制器视图内部创建一个MPMoviePlayerController属性并且默认全屏播放,开发者在开发的时候直接使用这个视图控制器。这个内部有一个MPMoviePlayerController的视图控制器就是MPMoviePlayerViewController,它继承于UIViewController。MPMoviePlayerViewController内部多了一个moviePlayer属性和一个带有url的初始化方法,同时它内部实现了一些作为模态视图展示所特有的功能,例如默认是全屏模式展示、弹出后自动播放、作为模态窗口展示时如果点击“Done”按钮会自动退出模态窗口等。
首先说一下创建误区:
MPMoviePlayerController *movieplayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
如果我们这样直接使用movieplayer,会发现黑屏了。
原因:因为现在大多数是arc环境,movieplayer不能是局部变量,一旦方法走完,就自动销毁了,所以黑屏。需要设置为全局变量。
@property (strong, nonatomic) MPMoviePlayerController * movieplayer;
MPMoviePlayerController *movieplayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
self. movieplayer= movieplayer;
这样,movieplayer的创建以及设置走完就不会销毁。
下面看一下里面的方法和属性吧
//视频的url地址
@property (nonatomic, copy) NSURL *contentURL;
//显示媒体和播放控件的视图
@property (nonatomic, readonly) UIView *view;
//用于定制的视图,始终显示在电影内容后面
@property (nonatomic, readonly) UIView *backgroundView;
//播放器的当前播放状态,枚举定义如下:
typedef NS_ENUM(NSInteger, MPMoviePlaybackState) {
MPMoviePlaybackStateStopped,//停止播放
MPMoviePlaybackStatePlaying,//正在播放
MPMoviePlaybackStatePaused,//暂停播放
MPMoviePlaybackStateInterrupted,//中断播放
MPMoviePlaybackStateSeekingForward,//快进
MPMoviePlaybackStateSeekingBackward//快退
};
@property (nonatomic, readonly) MPMoviePlaybackState playbackState;
//播放器的网络缓存状态,枚举定义如下:
typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) {
MPMovieLoadStateUnknown = 0,//状态未知
MPMovieLoadStatePlayable = 1 << 0,//缓存数据足够开始播放,但是视频并没有缓存完全
MPMovieLoadStatePlaythroughOK = 1 << 1, //已经缓存完成,如果设置了自动播放,这时会自动播放
MPMovieLoadStateStalled = 1 << 2, //数据缓存已经停止,播放将暂停
};
@property (nonatomic, readonly) MPMovieLoadState loadState;
//播放器风格,枚举如下:
typedef NS_ENUM(NSInteger, MPMovieControlStyle) {
MPMovieControlStyleNone, // 无控制器
MPMovieControlStyleEmbedded, // 嵌入视频风格
MPMovieControlStyleFullscreen, // 全屏播放风格
MPMovieControlStyleDefault = MPMovieControlStyleEmbedded
};
@property (nonatomic) MPMovieControlStyle controlStyle;
//播放器的循环模式,枚举如下:
typedef NS_ENUM(NSInteger, MPMovieRepeatMode) {
MPMovieRepeatModeNone,//播放结束后不循环
MPMovieRepeatModeOne//循环
};
@property (nonatomic) MPMovieRepeatMode repeatMode;
//是否开启自动播放,默认是yes
@property (nonatomic) BOOL shouldAutoplay;
//设置是否充满屏幕,默认是no
@property (nonatomic, getter=isFullscreen) BOOL fullscreen;
//设置是否充满屏幕,带动画效果
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated;
//设置播放器的填充方式,枚举定义如下:
typedef NS_ENUM(NSInteger, MPMovieScalingMode) {
MPMovieScalingModeNone, // 无缩放
MPMovieScalingModeAspectFit, // 适应大小模式
MPMovieScalingModeAspectFill, // 充满可视范围,可能会被裁剪
MPMovieScalingModeFill // 缩放到充满视图
};
@property (nonatomic) MPMovieScalingMode scalingMode;
//返回YES说明数据栈已经缓存好数据,返回NO则没有缓存好
@property (nonatomic, readonly) BOOL readyForDisplay
//下面是分类:
@interface MPMoviePlayerController (MPMovieProperties)
//数据文件的格式,枚举如下:
typedef NS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) {
MPMovieMediaTypeMaskNone = 0,//格式未知
MPMovieMediaTypeMaskVideo = 1 << 0,//音频格式
MPMovieMediaTypeMaskAudio = 1 << 1//视频格式
};
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes
//视频的数据类型,枚举如下:
typedef NS_ENUM(NSInteger, MPMovieSourceType) {
MPMovieSourceTypeUnknown,//类型未知
MPMovieSourceTypeFile, // 文件类型
MPMovieSourceTypeStreaming // 数据流
};
@property (nonatomic) MPMovieSourceType movieSourceType
//视频文件的时长
@property (nonatomic, readonly) NSTimeInterval duration
//缓存完成能够播放的时长
@property (nonatomic, readonly) NSTimeInterval playableDuration
//视频的原始大小
@property (nonatomic, readonly) CGSize naturalSize
//播放器开始播放的时间
@property (nonatomic) NSTimeInterval initialPlaybackTime
//播放器结束播放的时间
@property (nonatomic) NSTimeInterval endPlaybackTime;
//是否允许云端播放,在ios5.0之后默认是yes
@property (nonatomic) BOOL allowsAirPlay;
//指示电影播放器当前是否通过AirPlay播放视频
@property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive
//获取视频某一些时间点的缩略图
typedef NS_ENUM(NSInteger, MPMovieTimeOption) {
MPMovieTimeOptionNearestKeyFrame,//使用最近的关键帧生成缩略图
MPMovieTimeOptionExact//使用精确的当前帧生成缩略图
};
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
//取消所有待处理的异步缩图请求
- (void)cancelAllThumbnailImageRequests
//调用这个方法进行播放视频的准备工作
- (void)prepareToPlay;
//获取播放器的准备工作是否就绪
@property(nonatomic, readonly) BOOL isPreparedToPlay;
//调用此方法进行视频的播放
- (void)play;
//调用此方法进行视频播放的暂停操作
- (void)pause;
//调用此方法停止视频播放
- (void)stop;
//当前视频已播放的时间
@property(nonatomic) NSTimeInterval currentPlaybackTime;
//当前视频的播放速度
@property(nonatomic) float currentPlaybackRate;
//调用此方法进行快进操作
- (void)beginSeekingForward;
//调用此方法进行快退操作
- (void)beginSeekingBackward;
//调用此方法结束快进或者快退操作
- (void)endSeeking;
播放器系统通知
//当缩放模式更改时发出
NSString * const MPMoviePlayerScalingModeDidChangeNotification
//在电影播放结束或用户退出播放时发出
NSString * const MPMoviePlayerPlaybackDidFinishNotification
NSString * const MPMoviePlayerPlaybackDidFinishReasonUserInfoKey
//在播放状态更改时发布
NSString * const MPMoviePlayerPlaybackStateDidChangeNotification
//当网络缓冲状态改变时发布
NSString * const MPMoviePlayerLoadStateDidChangeNotification
//当前播放的视频改变时发送的通知
NSString * const MPMoviePlayerNowPlayingMovieDidChangeNotification
//将要进入全屏模式时发送的通知
NSString * const MPMoviePlayerWillEnterFullscreenNotification
//已经进入全屏时发送的通知
NSString * const MPMoviePlayerDidEnterFullscreenNotification
//将要退出全屏时发送的通知
NSString * const MPMoviePlayerWillExitFullscreenNotification
//已经退出全屏时发送的通知
NSString * const MPMoviePlayerDidExitFullscreenNotification
//当电影播放器开始或结束通过AirPlay播放视频时发布。
NSString * const MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification
//当准备好显示状态改变时发布。
NSString * const MPMoviePlayerReadyForDisplayDidChangeNotification
通知使用:
NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];
[notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
switch (self.moviePlayer.playbackState) {
case MPMoviePlaybackStatePlaying:
NSLog(@"正在播放...");
break;
case MPMoviePlaybackStatePaused:
NSLog(@"暂停播放.");
break;
case MPMoviePlaybackStateStopped:
NSLog(@"停止播放.");
break;
default:
NSLog(@"播放状态:%li",self.moviePlayer.playbackState);
break;
}
}
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
NSLog(@"播放完成.%li",self.moviePlayer.playbackState);
}
-(void)dealloc{
//移除所有通知监控
[[NSNotificationCenter defaultCenter] removeObserver:self];
}