在iOS中播放視頻可以使用MediaPlayer.framework種的MPMoviePlayerController類來完成,它支持本地視頻和網(wǎng)絡(luò)視頻播放。這個(gè)類實(shí)現(xiàn)了MPMediaPlayback協(xié)議,因此具備一般的播放器控制功能,例如播放、暫停、停止等。但是MPMediaPlayerController自身并不是一個(gè)完整的視圖控制器,如果要在UI中展示視頻需要將view屬性添加到界面中。下面列出了MPMoviePlayerController的常用屬性和方法:
屬性
說明
@property (nonatomic, copy) NSURL *contentURL
播放媒體URL,這個(gè)URL可以是本地路徑,也可以是網(wǎng)絡(luò)路徑
@property (nonatomic, readonly) UIView *view
播放器視圖,如果要顯示視頻必須將此視圖添加到控制器視圖中
@property (nonatomic, readonly) UIView *backgroundView
播放器背景視圖
@property (nonatomic, readonly) MPMoviePlaybackState playbackState
媒體播放狀態(tài),枚舉類型:
MPMoviePlaybackStateStopped:停止播放
MPMoviePlaybackStatePlaying:正在播放
MPMoviePlaybackStatePaused:暫停
MPMoviePlaybackStateInterrupted:中斷
MPMoviePlaybackStateSeekingForward:向前定位
MPMoviePlaybackStateSeekingBackward:向后定位
@property (nonatomic, readonly) MPMovieLoadState loadState
網(wǎng)絡(luò)媒體加載狀態(tài),枚舉類型:
MPMovieLoadStateUnknown:位置類型
MPMovieLoadStatePlayable:
MPMovieLoadStatePlaythroughOK:這種狀態(tài)如果shouldAutoPlay為YES將自動播放
MPMovieLoadStateStalled:停滯狀態(tài)
@property (nonatomic) MPMovieControlStyle controlStyle
控制面板風(fēng)格,枚舉類型:
MPMovieControlStyleNone:無控制面板
MPMovieControlStyleEmbedded:嵌入視頻風(fēng)格
MPMovieControlStyleFullscreen:全屏
MPMovieControlStyleDefault:默認(rèn)風(fēng)格
@property (nonatomic) MPMovieRepeatMode repeatMode;
重復(fù)播放模式,枚舉類型:
MPMovieRepeatModeNone:不重復(fù),默認(rèn)值
MPMovieRepeatModeOne:重復(fù)播放
@property (nonatomic) BOOL shouldAutoplay
當(dāng)網(wǎng)絡(luò)媒體緩存到一定數(shù)據(jù)時(shí)是否自動播放,默認(rèn)為YES
@property (nonatomic, getter=isFullscreen) BOOL fullscreen
是否全屏展示,默認(rèn)為NO,注意如果要通過此屬性設(shè)置全屏必須在視圖顯示完成后設(shè)置,否則無效
@property (nonatomic) MPMovieScalingMode scalingMode
視頻縮放填充模式,枚舉類型:
MPMovieScalingModeNone:不進(jìn)行任何縮放
MPMovieScalingModeAspectFit:固定縮放比例并且盡量全部展示視頻,不會裁切視頻
MPMovieScalingModeAspectFill:固定縮放比例并填充滿整個(gè)視圖展示,可能會裁切視頻
MPMovieScalingModeFill:不固定縮放比例壓縮填充整個(gè)視圖,視頻不會被裁切但是比例失衡
@property (nonatomic, readonly) BOOL readyForDisplay
是否有相關(guān)媒體被播放
@property (nonatomic, readonly) MPMovieMediaTypeMask movieMediaTypes
媒體類別,枚舉類型:
MPMovieMediaTypeMaskNone:未知類型
MPMovieMediaTypeMaskVideo:視頻
MPMovieMediaTypeMaskAudio:音頻
@property (nonatomic) MPMovieSourceType movieSourceType
媒體源,枚舉類型:
MPMovieSourceTypeUnknown:未知來源
MPMovieSourceTypeFile:本地文件
MPMovieSourceTypeStreaming:流媒體(直播或點(diǎn)播)
@property (nonatomic, readonly) NSTimeInterval duration
媒體時(shí)長,如果未知則返回0
@property (nonatomic, readonly) NSTimeInterval playableDuration
媒體可播放時(shí)長,主要用于表示網(wǎng)絡(luò)媒體已下載視頻時(shí)長
@property (nonatomic, readonly) CGSize naturalSize
視頻實(shí)際尺寸,如果未知則返回CGSizeZero
@property (nonatomic) NSTimeInterval initialPlaybackTime
起始播放時(shí)間
@property (nonatomic) NSTimeInterval endPlaybackTime
終止播放時(shí)間
@property (nonatomic) BOOL allowsAirPlay
是否允許無線播放,默認(rèn)為YES
@property (nonatomic, readonly, getter=isAirPlayVideoActive) BOOL airPlayVideoActive
當(dāng)前媒體是否正在通過AirPlay播放
@property(nonatomic, readonly) BOOL isPreparedToPlay
是否準(zhǔn)備好播放
@property(nonatomic) NSTimeInterval currentPlaybackTime
當(dāng)前播放時(shí)間,單位:秒
@property(nonatomic) float currentPlaybackRate
當(dāng)前播放速度,如果暫停則為0,正常速度為1.0,非0數(shù)據(jù)表示倍率
對象方法
說明
- (instancetype)initWithContentURL:(NSURL *)url
使用指定的URL初始化媒體播放控制器對象
- (void)setFullscreen:(BOOL)fullscreen animated:(BOOL)animated
設(shè)置視頻全屏,注意如果要通過此方法設(shè)置全屏則必須在其視圖顯示之后設(shè)置,否則無效
- (void)requestThumbnailImagesAtTimes:(NSArray *)playbackTimes timeOption:(MPMovieTimeOption)option
獲取在指定播放時(shí)間的視頻縮略圖,第一個(gè)參數(shù)是獲取縮略圖的時(shí)間點(diǎn)數(shù)組;第二個(gè)參數(shù)代表時(shí)間點(diǎn)精度,枚舉類型:
MPMovieTimeOptionNearestKeyFrame:時(shí)間點(diǎn)附近
MPMovieTimeOptionExact:準(zhǔn)確時(shí)間
- (void)cancelAllThumbnailImageRequests
取消所有縮略圖獲取請求
- (void)prepareToPlay
準(zhǔn)備播放,加載視頻數(shù)據(jù)到緩存,當(dāng)調(diào)用play方法時(shí)如果沒有準(zhǔn)備好會自動調(diào)用此方法
- (void)play
開始播放
- (void)pause
暫停播放
- (void)stop
停止播放
- (void)beginSeekingForward
向前定位
- (void)beginSeekingBackward
向后定位
- (void)endSeeking
停止快進(jìn)/快退
通知
說明
MPMoviePlayerScalingModeDidChangeNotification
視頻縮放填充模式發(fā)生改變
MPMoviePlayerPlaybackDidFinishNotification
媒體播放完成或用戶手動退出,具體完成原因可以通過通知userInfo中的key為MPMoviePlayerPlaybackDidFinishReasonUserInfoKey的對象獲取
MPMoviePlayerPlaybackStateDidChangeNotification
播放狀態(tài)改變,可配合playbakcState屬性獲取具體狀態(tài)
MPMoviePlayerLoadStateDidChangeNotification
媒體網(wǎng)絡(luò)加載狀態(tài)改變
MPMoviePlayerNowPlayingMovieDidChangeNotification
當(dāng)前播放的媒體內(nèi)容發(fā)生改變
MPMoviePlayerWillEnterFullscreenNotification
將要進(jìn)入全屏
MPMoviePlayerDidEnterFullscreenNotification
進(jìn)入全屏后
MPMoviePlayerWillExitFullscreenNotification
將要退出全屏
MPMoviePlayerDidExitFullscreenNotification
退出全屏后
MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification
當(dāng)媒體開始通過AirPlay播放或者結(jié)束AirPlay播放
MPMoviePlayerReadyForDisplayDidChangeNotification
視頻顯示狀態(tài)改變
MPMovieMediaTypesAvailableNotification
確定了媒體可用類型后
MPMovieSourceTypeAvailableNotification
確定了媒體來源后
MPMovieDurationAvailableNotification
確定了媒體播放時(shí)長后
MPMovieNaturalSizeAvailableNotification
確定了媒體的實(shí)際尺寸后
MPMoviePlayerThumbnailImageRequestDidFinishNotification
縮略圖請求完成之后
MPMediaPlaybackIsPreparedToPlayDidChangeNotification
做好播放準(zhǔn)備后
注意MPMediaPlayerController的狀態(tài)等信息并不是通過代理來和外界交互的,而是通過通知中心,因此從上面的列表中可以看到常用的一些通知。由于MPMoviePlayerController本身對于媒體播放做了深度的封裝,使用起來就相當(dāng)簡單:創(chuàng)建MPMoviePlayerController對象,設(shè)置frame屬性,將MPMoviePlayerController的view添加到控制器視圖中。
MPMoviePlayerViewController
其實(shí)MPMoviePlayerController如果不作為嵌入視頻來播放(例如在新聞中嵌入一個(gè)視頻),通常在播放時(shí)都是占滿一個(gè)屏幕的,特別是在iPhone、iTouch上。因此從iOS3.2以后蘋果也在思考既然MPMoviePlayerController在使用時(shí)通常都是將其視圖view添加到另外一個(gè)視圖控制器中作為子視圖,那么何不直接創(chuàng)建一個(gè)控制器視圖內(nèi)部創(chuàng)建一個(gè)MPMoviePlayerController屬性并且默認(rèn)全屏播放,開發(fā)者在開發(fā)的時(shí)候直接使用這個(gè)視圖控制器。這個(gè)內(nèi)部有一個(gè)MPMoviePlayerController的視圖控制器就是MPMoviePlayerViewController,它繼承于UIViewController。MPMoviePlayerViewController內(nèi)部多了一個(gè)moviePlayer屬性和一個(gè)帶有url的初始化方法,同時(shí)它內(nèi)部實(shí)現(xiàn)了一些作為模態(tài)視圖展示所特有的功能,例如默認(rèn)是全屏模式展示、彈出后自動播放、作為模態(tài)窗口展示時(shí)如果點(diǎn)擊“Done”按鈕會自動退出模態(tài)窗口等。