天天看点

iOS播放器开发之MPMoviePlayerController

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        = ,//状态未知
    MPMovieLoadStatePlayable       =  << ,//缓存数据足够开始播放,但是视频并没有缓存完全
    MPMovieLoadStatePlaythroughOK  =  << , //已经缓存完成,如果设置了自动播放,这时会自动播放
    MPMovieLoadStateStalled        =  << , //数据缓存已经停止,播放将暂停
};
@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  = ,//格式未知
    MPMovieMediaTypeMaskVideo =  << ,//音频格式
    MPMovieMediaTypeMaskAudio =  << //视频格式
};
@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];
}