iOS-MPMoviePlayerController視頻播放


視頻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:這種狀態如果shouldAutoPlay為YES將自動播放
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) MPMovieSourceType movieSourceType 媒體源,枚舉類型:
MPMovieSourceTypeUnknown:未知來源
MPMovieSourceTypeFile:本地文件
MPMovieSourceTypeStreaming:流媒體(直播或點播)
@property (nonatomic, readonly) NSTimeInterval duration 媒體時長,如果未知則返回0
@property (nonatomic, readonly) NSTimeInterval playableDuration 媒體可播放時長,主要用於表示網絡媒體已下載視頻時長
@property (nonatomic, readonly) CGSize naturalSize 視頻實際尺寸,如果未知則返回CGSizeZero
@property (nonatomic) NSTimeInterval initialPlaybackTime 起始播放時間
@property (nonatomic) NSTimeInterval endPlaybackTime 終止播放時間
@property (nonatomic) BOOL allowsAirPlay 是否允許無線播放,默認為YES
@property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive 當前媒體是否正在通過AirPlay播放
@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 停止快進/快退
通知 說明
MPMoviePlayerScalingModeDidChangeNotification 視頻縮放填充模式發生改變
MPMoviePlayerPlaybackDidFinishNotification 媒體播放完成或用戶手動退出,具體完成原因可以通過通知userInfo中的key為MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的對象獲取
MPMoviePlayerPlaybackStateDidChangeNotification 播放狀態改變,可配合playbakcState屬性獲取具體狀態
MPMoviePlayerLoadStateDidChangeNotification 媒體網絡加載狀態改變
MPMoviePlayerNowPlayingMovieDidChangeNotification 當前播放的媒體內容發生改變
MPMoviePlayerWillEnterFullscreenNotification 將要進入全屏
MPMoviePlayerDidEnterFullscreenNotification 進入全屏后
MPMoviePlayerWillExitFullscreenNotification 將要退出全屏
MPMoviePlayerDidExitFullscreenNotification 退出全屏后
MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification 當媒體開始通過AirPlay播放或者結束AirPlay播放
MPMoviePlayerReadyForDisplayDidChangeNotification 視頻顯示狀態改變
MPMovieMediaTypesAvailableNotification 確定了媒體可用類型后
MPMovieSourceTypeAvailableNotification 確定了媒體來源后
MPMovieDurationAvailableNotification 確定了媒體播放時長后
MPMovieNaturalSizeAvailableNotification 確定了媒體的實際尺寸后
MPMoviePlayerThumbnailImageRequestDidFinishNotification 縮略圖請求完成之后
MPMediaPlaybackIsPreparedToPlayDidChangeNotification 做好播放准備后

注意MPMediaPlayerController的狀態等信息並不是通過代理來和外界交互的,而是通過通知中心,因此從上面的列表中可以看到常 用的一些通知。由於MPMoviePlayerController本身對於媒體播放做了深度的封裝,使用起來就相當簡單:創建 MPMoviePlayerController對象,設置frame屬性,將MPMoviePlayerController的view添加到控制器視 圖中。

實現效果如下:

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

@interface ViewController ()


@property (nonatomic,strong) MPMoviePlayerController *moviePlayer;//視頻播放控制器


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    NSURL *url = [NSURL URLWithString:@"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4"];
    
    self.view.backgroundColor = [UIColor whiteColor];
    
    //播放
    [self.moviePlayer play];


    //添加通知
    [self addNotification];

}


/**
 *  取得本地文件路徑
 *
 *  @return 文件路徑
 */
-(NSURL *)getFileUrl{
    NSString *urlStr=[[NSBundle mainBundle] pathForResource:@"The New Look of OS X Yosemite.mp4" ofType:nil];
    NSURL *url=[NSURL fileURLWithPath:urlStr];
    return url;
}
/**
 *  取得網絡文件路徑
 *
 *  @return 文件路徑
 */
-(NSURL *)getNetworkUrl{

    NSString *urlStr = @"http://vf1.mtime.cn/Video/2012/04/23/mp4/120423212602431929.mp4";
    
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url = [NSURL URLWithString:urlStr];
    
    return url;
}
-(MPMoviePlayerController *)moviePlayer{

    if (!_moviePlayer) {
        
        NSURL *url = [self getNetworkUrl];
        _moviePlayer = [[MPMoviePlayerController alloc]initWithContentURL:url];
        _moviePlayer.view.frame = self.view.bounds;
        _moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        
        [self.view addSubview:_moviePlayer.view];
    }

    return _moviePlayer;
}


/**
 *  添加通知監控媒體播放控制器狀態
 */
-(void)addNotification{

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

}


/**
 *  播放狀態改變,注意播放完成時的狀態是暫停
 *
 *  @param notification 通知對象
 */
-(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;
    }
}

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


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

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 由於於開始升級了ios9,不管是模擬器還是真機播放都是黑屏,郁悶了好久好久,后來打印:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

在plist文件設置了允許網絡請求不安全,就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM