MPMoviePlayerController是iOS中進行視頻播放開發的一個控制類,裏面涵蓋了視頻播放中大部分的需求功能,在使用這個框架時,須要導入頭文件<MediaPlayer/MediaPlayer.h>。設計模式
MPMoviePlayerController能夠播放網絡視頻,也能夠播放本地視頻,經過不一樣的URL來進行初始化,例如本地視頻的初始化以下:緩存
//視頻文件路徑 NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp4"]; //視頻URL NSURL *url = [NSURL fileURLWithPath:path]; //視頻播放對象 MPMoviePlayerController * movie = [[MPMoviePlayerController alloc] initWithContentURL:url];
初始化和完成相關配置後,咱們須要將MPMoviePlayerController對象的View添加在咱們須要的UI視圖上,這個控制器只提供的控制的相關功能,外部的UI並無爲咱們提供好。網絡
@property (nonatomic, copy) NSURL *contentURL;框架
視頻文件的url地址ide
@property (nonatomic, readonly) UIView *view;動畫
播放器view,在使用以前,必須設置frame大小,而後將其添加在咱們的UI視圖上atom
@property (nonatomic, readonly) UIView *backgroundView;url
播放器背景顏色spa
@property (nonatomic, readonly) MPMoviePlaybackState playbackState;.net
播放器的當前播放狀態,枚舉定義以下:
typedef NS_ENUM(NSInteger, MPMoviePlaybackState) { MPMoviePlaybackStateStopped,//中止播放 MPMoviePlaybackStatePlaying,//正在播放 MPMoviePlaybackStatePaused,//暫停播放 MPMoviePlaybackStateInterrupted,//中斷播放 MPMoviePlaybackStateSeekingForward,//快進 MPMoviePlaybackStateSeekingBackward//快退 };
@property (nonatomic, readonly) MPMovieLoadState loadState;
播放器的網絡緩存狀態,枚舉定義以下:
typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) { MPMovieLoadStateUnknown = 0,//狀態未知 MPMovieLoadStatePlayable = 1 << 0,//緩存數據足夠開始播放,可是視頻並無緩存徹底 MPMovieLoadStatePlaythroughOK = 1 << 1, //已經緩存完成,若是設置了自動播放,這時會自動播放 MPMovieLoadStateStalled = 1 << 2, //數據緩存已經中止,播放將暫停 };
@property (nonatomic) MPMovieControlStyle controlStyle;
播放器風格,枚舉以下:
typedef NS_ENUM(NSInteger, MPMovieControlStyle) { MPMovieControlStyleNone, // 無控制器 MPMovieControlStyleEmbedded, // 嵌入視頻風格 MPMovieControlStyleFullscreen, // 全屏播放風格 MPMovieControlStyleDefault = MPMovieControlStyleEmbedded };
@property (nonatomic) MPMovieRepeatMode repeatMode;
播放器的循環模式,枚舉以下:
typedef NS_ENUM(NSInteger, MPMovieRepeatMode) { MPMovieRepeatModeNone,//播放結束後不循環 MPMovieRepeatModeOne//循環 };
@property (nonatomic) BOOL shouldAutoplay;
是否開啓自動播放
@property (nonatomic, getter=isFullscreen) BOOL fullscreen;
設置是否充滿屏幕
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated;
設置是否充滿屏幕,帶動畫效果
@property (nonatomic) MPMovieScalingMode scalingMode;
設置播放器的填充方式,枚舉定義以下:
typedef NS_ENUM(NSInteger, MPMovieScalingMode) { MPMovieScalingModeNone, // 無縮放 MPMovieScalingModeAspectFit, // 適應大小模式 MPMovieScalingModeAspectFill, // 充滿可視範圍,可能會被裁剪 MPMovieScalingModeFill // 縮放到充滿視圖 };
@property (nonatomic, readonly) BOOL readyForDisplay NS_AVAILABLE_IOS(6_0);
返回YES說明數據棧已經緩存好數據,返回NO則沒有緩存好
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes;
數據文件的格式,枚舉以下:
typedef NS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) { MPMovieMediaTypeMaskNone = 0,//格式未知 MPMovieMediaTypeMaskVideo = 1 << 0,//音頻格式 MPMovieMediaTypeMaskAudio = 1 << 1//視頻格式 };
@property (nonatomic) MPMovieSourceType movieSourceType;
視頻的數據類型,枚舉以下:
typedef NS_ENUM(NSInteger, MPMovieSourceType) { MPMovieSourceTypeUnknown,//類型未知 MPMovieSourceTypeFile, // 文件類型 MPMovieSourceTypeStreaming // 數據流 };
@property (nonatomic, readonly) NSTimeInterval duration;
視頻文件的時長
@property (nonatomic, readonly) NSTimeInterval playableDuration;
緩存完成可以播放的時長
@property (nonatomic, readonly) CGSize naturalSize;
視頻的原始大小
@property (nonatomic) NSTimeInterval initialPlaybackTime;
播放器開始播放的時間
@property (nonatomic) NSTimeInterval endPlaybackTime;
播放器結束播放的時間
@property (nonatomic) BOOL allowsAirPlay;
是否容許雲端播放
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)optio;
獲取視頻某一些時間點的縮略圖,參數枚舉以下,生成縮略圖的數據回調在後面的通知中詳說:
typedef NS_ENUM(NSInteger, MPMovieTimeOption) { MPMovieTimeOptionNearestKeyFrame,//使用最近的關鍵幀生成縮略圖 MPMovieTimeOptionExact//使用精確的當前幀生成縮略圖 };
與播放控制相關的方法以下:
//調用這個方法進行播放視頻的準備工做 - (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;
MPMoviePlayerController的系統回調並無採用代理的設計模式,而是採用的系統發通知,咱們註冊觀察者,接收咱們須要的通知。舉例幾種經常使用通知以下:
NSString * const MPMoviePlayerScalingModeDidChangeNotification;
播放器縮放產生改變時發送的通知
NSString * const MPMoviePlayerPlaybackDidFinishNotification;
播放結束時發送的通知
NSString * const MPMoviePlayerPlaybackStateDidChangeNotification;
播放狀態改變時發送的通知
NSString * const MPMoviePlayerLoadStateDidChangeNotification;
緩衝狀態改變時發送的通知
NSString * const MPMoviePlayerNowPlayingMovieDidChangeNotification;
當前播放的視頻改變時發送的通知
NSString * const MPMoviePlayerWillEnterFullscreenNotification;
將要進入全屏模式時發送的通知
NSString * const MPMoviePlayerDidEnterFullscreenNotification;
已經進入全屏時發送的通知
NSString * const MPMoviePlayerWillExitFullscreenNotification;
將要退出全屏時發送的通知
NSString * const MPMoviePlayerDidExitFullscreenNotification;
已經退出全屏時發送的通知
NSString * const MPMoviePlayerThumbnailImageRequestDidFinishNotification;
獲取縮略圖完成時發送的通知
若是你很熟悉MVC,你可能會以爲MPMoviePlayerController的設計模式很是蹩腳,強行要求你將控制器的視圖分離出來加在另外的UI上,徒增的代碼邏輯的混亂,那麼你想的沒錯,MPMoviePlayerViewController可能就是爲了解決這個問題。
MPMoviePlayerViewController將視圖封裝在了一塊兒,其中有一個成員對象是MPMoviePlayerController類型,相似C++中的has-a邏輯,咱們只須要對MPMoviePlayerViewController進行的簡單的初始化後,對其中MPMoviePlayerController進行其餘配置,以後經過模態跳轉切換控制器便可。
方法以下:
- (instancetype)initWithContentURL:(NSURL *)contentURL;
初始化方法,和上面相似
@property (nonatomic, readonly) MPMoviePlayerController *moviePlayer;
播放器對象
- (void)presentMoviePlayerViewControllerAnimated:(MPMoviePlayerViewController *)moviePlayerViewController;
- (void)dismissMoviePlayerViewControllerAnimated;
viewController的模態跳轉方法,也能夠經過導航push與pop
代碼示例以下:
@interface ViewController2 () @property(nonatomic,strong)MPMoviePlayerController * movie; @property(nonatomic,strong)MPMoviePlayerViewController * viewController; @end @implementation ViewController2 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self playMovie:@"111"]; } -(void)playMovie:(NSString *)fileName{ //視頻文件路徑 NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp4"]; //視頻URL NSURL *url = [NSURL fileURLWithPath:path]; //視頻播放對象 _viewController = [[MPMoviePlayerViewController alloc]initWithContentURL:url]; _movie=_viewController.moviePlayer; // 註冊一個播放結束的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:_movie]; _movie.fullscreen=YES; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [_movie play]; [self presentViewController:_viewController animated:YES completion:nil]; } -(void)myMovieFinishedCallback:(NSNotification*)notify { //視頻播放對象 MPMoviePlayerController* theMovie = [notify object]; //銷燬播放通知 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:theMovie]; [theMovie.view removeFromSuperview]; }
專一技術,熱愛生活,交流技術,也作朋友。
——琿少 QQ羣:203317592