MPMoviePlayerController

本文介绍iOS平台使用MPMoviePlayerController播放视频的方法,包括初始化播放器、设置播放参数、响应播放状态变化及实现全屏播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: MPMoviePlayerController

     在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频播放。这个类实现了MPMediaPlayback协议,因此具备一般的播放器控制功能,例如播放、暂停、停止等。但是MPMediaPlayerController自身并不是一个完整的视图控制器,如果要在UI中展示视频需要将view属性添加到界面中。下面列出了MPMoviePlayerController的常用属性和方法:

    

   @property (nonatomic, copy) NSURL *contentURL //播放媒体URL,这个URL可以是本地路径,也可以是网络路径

   @property (nonatomic, readonly) UIView *view//播放器视图,如果要显示视频必须将此视图添加到控制器视图中

   @property (nonatomic, readonly) UIView *backgroundView//播放器背景视图

    

   @property (nonatomic, readonly) MPMoviePlaybackState playbackState//媒体播放状态,枚举类型:

    MPMoviePlaybackStateStopped//停止播放

    MPMoviePlaybackStatePlaying//正在播放

    MPMoviePlaybackStatePaused//暂停

    MPMoviePlaybackStateInterrupted//中断

    MPMoviePlaybackStateSeekingForward//向前定位

    MPMoviePlaybackStateSeekingBackward//向后定位

    

   @property (nonatomic, readonly) MPMovieLoadState loadState//网络媒体加载状态,枚举类型:

    MPMovieLoadStateUnknown

    MPMovieLoadStatePlayable

    MPMovieLoadStatePlaythroughOK//这种状态如果shouldAutoPlayYES将自动播放

    MPMovieLoadStateStalled//停滞状态

    

   @property (nonatomic) MPMovieControlStyle controlStyle//控制面板风格,枚举类型:

    MPMovieControlStyleNone//无控制面板

    MPMovieControlStyleEmbedded//嵌入视频风格

    MPMovieControlStyleFullscreen//全屏

    MPMovieControlStyleDefault//默认风格

    

   @property (nonatomic) MPMovieRepeatMode repeatMode;//重复播放模式,枚举类型:

    MPMovieRepeatModeNone://不重复,默认值

    MPMovieRepeatModeOne://重复播放

    

   @property (nonatomic)BOOL shouldAutoplay//当网络媒体缓存到一定数据时是否自动播放,默认为YES

   @property (nonatomic, getter=isFullscreen)BOOL fullscreen//是否全屏展示,默认为NO,注意如果要通过此属性设置全屏必须在视图显示完成后设置,否则无效

    

   @property (nonatomic) MPMovieScalingMode scalingMode//视频缩放填充模式,枚举类型:

    MPMovieScalingModeNone//不进行任何缩放

    MPMovieScalingModeAspectFit//固定缩放比例并且尽量全部展示视频,不会裁切视频

    MPMovieScalingModeAspectFill//固定缩放比例并填充满整个视图展示,可能会裁切视频

    MPMovieScalingModeFill//不固定缩放比例压缩填充整个视图,视频不会被裁切但是比例失衡

    

   @property (nonatomic, readonly)BOOL readyForDisplay//是否有相关媒体被播放

   @property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes//媒体类别,枚举类型:

    MPMovieMediaTypeMaskNone//未知类型

    MPMovieMediaTypeMaskVideo//视频

    MPMovieMediaTypeMaskAudio//音频

   

   @property(nonatomic, readonly)BOOL isPreparedToPlay//是否准备好播放

   @property(nonatomic) NSTimeInterval currentPlaybackTime//当前播放时间,单位:秒

   @property(nonatomic)float currentPlaybackRate//当前播放速度,如果暂停则为0,正常速度为1.0,非0数据表示倍率

  

    

    - (instancetype)initWithContentURL:(NSURL *)url//使用指定的URL初始化媒体播放控制器对象

    - (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated//设置视频全屏,注意如果要通过此方法设置全屏则必须在其视图显示之后设置,否则无效

    - (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option//获取在指定播放时间的视频缩略图,第一个参数是获取缩略图的时间点数组;第二个参数代表时间点精度,枚举类型:

    MPMovieTimeOptionNearestKeyFrame//时间点附近

    MPMovieTimeOptionExact//准确时间

    - (void)cancelAllThumbnailImageRequests//取消所有缩略图获取请求

    - (void)prepareToPlay//准备播放,加载视频数据到缓存,当调用play方法时如果没有准备好会自动调用此方法

    - (void)play//开始播放

    - (void)pause//暂停播放

    - (void)stop//停止播放

    - (void)beginSeekingForward//向前定位

    - (void)beginSeekingBackward//向后定位

    - (void)endSeeking//停止快进/快退

 

    

   @interface MPMoviePlayerController (MPMovieProperties)

    

    //该属性返回MPMoviePlayerController播放的多媒体类型。

   @property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes;

   typedefNS_OPTIONS(NSUInteger, MPMovieMediaTypeMask) {

        MPMovieMediaTypeMaskNone  =0,

        MPMovieMediaTypeMaskVideo =1 <<0,

        MPMovieMediaTypeMaskAudio =1 <<1

    };

    

   @property (nonatomic) MPMovieSourceType movieSourceType;

   typedefNS_ENUM(NSInteger, MPMovieSourceType) {

        MPMovieSourceTypeUnknown,//未知来源

        MPMovieSourceTypeFile,   //本地文件  Local or progressively downloaded network content

        MPMovieSourceTypeStreaming//流媒体(直播或点播) Live or on-demand streaming content

    };

    

    //媒体时长,如果未知则返回0

   @property (nonatomic, readonly) NSTimeInterval duration;

    

    //媒体可播放时长,主要用于表示网络媒体已下载视频时长

   @property (nonatomic, readonly) NSTimeInterval playableDuration;

    

    //返回视频的大小,如果未知则返回CGSizeZero

   @property (nonatomic, readonly) CGSize naturalSize;

    

    //起始播放时间

   @property (nonatomic) NSTimeInterval initialPlaybackTime;

  

    //终止播放时间

   @property (nonatomic) NSTimeInterval endPlaybackTime;

    

    //当前媒体是否正在通过AirPlay播放。即无限播放视频

   @property (nonatomic)BOOL allowsAirPlayNS_AVAILABLE_IOS(4_3);

    

   //当前是否处于无限播放模式。

   @property (nonatomic, readonly, getter=isAirPlayVideoActive)BOOL airPlayVideoActiveNS_AVAILABLE_IOS(5_0);

    

   @end


    //通知中心部分

    MPMoviePlayerScalingModeDidChangeNotification//视频缩放填充模式发生改变

    MPMoviePlayerPlaybackDidFinishNotification//媒体播放完成或用户手动退出,具体完成原因可以通过通知userInfo中的keyMPMoviePlayerPlaybackDidFinishReasonUserInfoKey的对象获取

    MPMoviePlayerPlaybackStateDidChangeNotification//播放状态改变,可配合playbakcState属性获取具体状态

    MPMoviePlayerLoadStateDidChangeNotification//媒体网络加载状态改变

    MPMoviePlayerNowPlayingMovieDidChangeNotification//当前播放的媒体内容发生改变

    MPMoviePlayerWillEnterFullscreenNotification//将要进入全屏

    MPMoviePlayerDidEnterFullscreenNotification//进入全屏后

    MPMoviePlayerWillExitFullscreenNotification//将要退出全屏

    MPMoviePlayerDidExitFullscreenNotification//退出全屏后

    MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification//当媒体开始通过AirPlay播放或者结束AirPlay播放

    MPMoviePlayerReadyForDisplayDidChangeNotification//视频显示状态改变

    MPMovieMediaTypesAvailableNotification//确定了媒体可用类型后

    MPMovieSourceTypeAvailableNotification//确定了媒体来源后

    MPMovieDurationAvailableNotification//确定了媒体播放时长后

    MPMovieNaturalSizeAvailableNotification//确定了媒体的实际尺寸后

    MPMoviePlayerThumbnailImageRequestDidFinishNotification//缩略图请求完成之后

    MPMediaPlaybackIsPreparedToPlayDidChangeNotification//做好播放准备后

    

   注意MPMediaPlayerController的状态等信息并不是通过代理来和外界交互的,而是通过通知中心,因此从上面的列表中可以看到常用的一些通知。

    

    //MPMoviePlayerController播放视频的步骤:

   1)创建MPMoviePlayerController对象。创建该对象时可调用- (instancetype)initWithContentURL:(NSURL *)url方法进行初始化,获取播放器播放的资源。

   2)设置MPMoviePlayerController对象的viewframe属性,该属性用于控制播放器的可视化界面的大小和位置。

   3)将MPMoviePlayerControllerview添加到控制器视图中进行播放。如果需要进行全屏幕播放,调用

    - (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated方法即可。


1)实现一个基本的视频播放,代码如下:

   
#import <UIKit/UIKit.h>

@interface FKViewController :UIViewController

@property (strong,nonatomic) IBOutlet UIView *movieView;
- (IBAction)play:(id)sender;

@end

#import <MediaPlayer/MediaPlayer.h>
#import "FKViewController.h"

@interfaceFKViewController (){
   MPMoviePlayerController *moviePlayer;
}

@end

@implementation FKViewController

- (void)viewDidLoad
{
    [superviewDidLoad];

 // 1 创建本地URL(也可创建基于网络的URL)
NSURL * movieUrl = [[NSBundlemainBundle]URLForResource:@"movie"withExtension:@"mp4"];
//使用指定URL创建MPMoviePlayerController
// 2 MPMoviePlayerController将会播放该URL对应的视频
moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:movieUrl];
//设置该播放器的控制条风格。
moviePlayer.controlStyle =MPMovieControlStyleEmbedded;
//设置该播放器的缩放模式
moviePlayer.scalingMode =MPMovieScalingModeAspectFit;
[moviePlayer.view setFrame:CGRectMake(0 ,0 ,380 , 320)];
[moviePlayer prepareToPlay];
    
}
// 重写该方法,控制该视图控制器只支持横屏显示
- (NSUInteger)supportedInterfaceOrientations{
   return   UIInterfaceOrientationMaskLandscape;
}

- (IBAction)play:(id)sender{
    //3开始播放 
    [self.movieView addSubview:moviePlayer.view];
}

@end


2:接下来进一步学习:弹出一个全屏界面播放视频

    其实MPMoviePlayerController如果不作为嵌入视频来播放(例如在新闻中嵌入一个视频),通常在播放时都是占满一个屏幕的。下面的示例中就不直接将播放器放到主视图控制器,而是放到一个模态视图控制器中,简单演示MPMoviePlayerViewController的使用。

#import "ViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@interfaceViewController ()
//播放器视图控制器
@property (nonatomic,strong)MPMoviePlayerViewController *moviePlayerViewController;

@end

@implementation ViewController

#pragma mark - 控制器视图方法
- (void)viewDidLoad {
    [superviewDidLoad];
}

-(void)dealloc{
    //移除所有通知监控
    [[NSNotificationCenterdefaultCenter]removeObserver:self];
}


#pragma mark - 私有方法
/**
 *  取得本地文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundlemainBundle]pathForResource:@"The New Look of OS X Yosemite.mp4"ofType:nil];
   NSURL *url=[NSURLfileURLWithPath:urlStr];
   return url;
}

/**
 *  取得网络文件路径
 *
 *  @return 文件路径
 */
-(NSURL *)getNetworkUrl{
    NSString *urlStr=@"http://192.168.1.161/The New Look of OS X Yosemite.mp4";
    urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
   NSURL *url=[NSURLURLWithString:urlStr];
   return url;
}

-(MPMoviePlayerViewController *)moviePlayerViewController{
    if (!_moviePlayerViewController) {
       NSURL *url=[self getNetworkUrl];
        _moviePlayerViewController=[[MPMoviePlayerViewController alloc]initWithContentURL:url];
        [selfaddNotification];
    }
    return_moviePlayerViewController;
}

#pragma mark - UI事件 点击模态化出现播放界面.
- (IBAction)playClick:(UIButton *)sender {
    self.moviePlayerViewController=nil;//保证每次点击都重新创建视频播放控制器视图,避免再次点击时由于不播放的问题。所以当再次点击播放弹出新的模态窗口的时如果不销毁之前的MPMoviePlayerViewController,那么新的对象就无法完成初始化,这样也就不能再次进行播放。
//    [self presentViewController:self.moviePlayerViewController animated:YES completion:nil];
    //注意,在MPMoviePlayerViewController.h中对UIViewController扩展两个用于模态展示和关闭MPMoviePlayerViewController的方法,增加了一种下拉展示动画效果
    [self presentMoviePlayerViewControllerAnimated:self.moviePlayerViewController];
}

#pragma mark - 控制器通知
/**
 *  添加通知监控媒体播放控制器状态
 */
-(void)addNotification{
    NSNotificationCenter *notificationCenter=[NSNotificationCenterdefaultCenter];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackStateChange:) name:MPMoviePlayerPlaybackStateDidChangeNotificationobject:self.moviePlayerViewController.moviePlayer];
    [notificationCenter addObserver:self selector:@selector(mediaPlayerPlaybackFinished: )name:MPMoviePlayerPlaybackDidFinishNotificationobject:self.moviePlayerViewController.moviePlayer];
    
}

/**
 *  播放状态改变,注意播放完成时的状态是暂停
 *
 *  @param notification通知对象
 */
-(void)mediaPlayerPlaybackStateChange:(NSNotification *)notification{
    switch (self.moviePlayerViewController.moviePlayer.playbackState) {
        caseMPMoviePlaybackStatePlaying:
           NSLog(@"正在播放...");
           break;
        caseMPMoviePlaybackStatePaused:
           NSLog(@"暂停播放.");
           break;
        caseMPMoviePlaybackStateStopped:
           NSLog(@"停止播放.");
           break;
       default:
            NSLog(@"播放状态:%li",self.moviePlayerViewController.moviePlayer.playbackState);
           break;
    }
}

/**
 *  播放完成
 *
 *  @param notification通知对象
 */
-(void)mediaPlayerPlaybackFinished:(NSNotification *)notification{
    NSLog(@"播放完成.%li",self.moviePlayerViewController.moviePlayer.playbackState);
}

@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值