視頻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文件設置了允許網絡請求不安全,就可以了。