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]; }