iOS視頻功能模塊的開發

iOS視頻功能模塊的開發

1、使用MPMoviePlayerController進行視頻播放

        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;

獲取縮略圖完成時發送的通知

 

 

2、MPMoviePlayerViewController視頻視圖控制器

        若是你很熟悉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

相關文章
相關標籤/搜索