IOS9之前爹脾,ios播放視頻文件一般使用 MPMoviePlayerViewController 和 MPMoviePlayerController。
前者繼承自UIViewController找田,后者繼承NSObject。MPMoviePlayerViewController里面包含了一個MPMoviePlayerController径密。
要想使用上述兩者午阵,首先要包含? #import頭文件和MediaPlayer.framework。
MPMoviePlayerViewController中只有三個方法和一個屬性:
//初始化
- (instancetype)initWithContentURL:(NSURL *)contentURL
//把這個VC Present出來
- (void)presentMoviePlayerViewControllerAnimated:(MPMoviePlayerViewController *)moviePlayerViewController
//把這個VC dismiss掉
- (void)dismissMoviePlayerViewControllerAnimated
//包含的MPMoviePlayerController
@property (nonatomic, readonly) MPMoviePlayerController *moviePlayer;
從根本意義上來說,MPMoviePlayerViewController的方法實現(xiàn)的就是MPMoviePlayerController中的對應初始化底桂,加入視圖的方法植袍,前者只是對后者進行了一個簡單的封裝。
如果要對播放視頻的屬性進行操作籽懦,可以通過設(shè)置MPMoviePlayerViewController.moviePlayer來實現(xiàn)于个。MPMoviePlayerController中可以的修改的參數(shù)有很多,詳細可以去看官網(wǎng)文檔暮顺,或者直接從Xcode中直接進mediaPlayer庫文件中查看厅篓。
以下是關(guān)于播放視頻的監(jiān)聽事件,注冊之后捶码,當對應的狀態(tài)改變時就可以收到對應的通知
// -----------------------------------------------------------------------------
// Movie Player Notifications
// 當視頻縮放比例改變時
?NSString * const MPMoviePlayerScalingModeDidChangeNotification?
// 當視頻播放結(jié)束時
?NSString * const MPMoviePlayerPlaybackDidFinishNotification?
//當用戶退出視頻時
?NSString * const MPMoviePlayerPlaybackDidFinishReasonUserInfoKey?
// 當回調(diào)狀態(tài)改變時
?NSString * const MPMoviePlayerPlaybackStateDidChangeNotification?
// 當網(wǎng)絡(luò)加載狀態(tài)改變時
?NSString * const MPMoviePlayerLoadStateDidChangeNotification?
//當當前播放視頻改變時
?NSString * const MPMoviePlayerNowPlayingMovieDidChangeNotification?
// 當進入全屏或者退出全屏
?NSString * const MPMoviePlayerWillEnterFullscreenNotification?
?NSString * const MPMoviePlayerDidEnterFullscreenNotification?
?NSString * const MPMoviePlayerWillExitFullscreenNotification?
?NSString * const MPMoviePlayerDidExitFullscreenNotification?
?NSString * const MPMoviePlayerFullscreenAnimationDurationUserInfoKey?
?NSString * const MPMoviePlayerFullscreenAnimationCurveUserInfoKey?
// 在appleTv或者音響上播放狀態(tài)改變時
?NSString * const MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification?
// 當準備狀態(tài)改變時
?NSString * const MPMoviePlayerReadyForDisplayDidChangeNotification?
播放本地路徑下的視頻的實例代碼如下
- (void)Play:(NSString*)resName TypeName:(NSString*)type
{
NSString *path = [[NSBundle mainBundle] pathForResource:resName ofType:type];
if ( nil == path ) ?{
return;
}
NSURL *url = [NSURL fileURLWithPath:path];
MPMoviePlayerViewController *_moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
_moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:[_moviePlayer moviePlayer] ];
[_moviePlayer.moviePlayer play];
[ [self GetRootViewController] presentMoviePlayerViewControllerAnimated:_moviePlayer];
_moviePlayer = nil;
}
- (void) movieFinishedCallback:(NSNotification*) aNotification
{
MPMoviePlayerController *player = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[player stop];
[ [self GetRootViewController] dismissMoviePlayerViewControllerAnimated];
}
在IOS9之后羽氮,上述的MPMoviePlayerController就被蘋果棄用了(不過不影響正常使用),蘋果推薦使用AVPlayerViewController,簡而言之就是MPMoviePlayerController使用更簡單惫恼,功能不如AVPlayer強大档押,而AVPlayer使用稍微麻煩點,不過功能更加強大祈纯。
實例代碼
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"backspace" ofType:@"mov"];
NSURL *sourceMovieURL = [NSURL fileURLWithPath:filePath];
AVAsset *movieAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:movieAsset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.layer.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[self.view.layer addSublayer:playerLayer];
[player play];
上方的代碼實現(xiàn)的效果其實和MPMoviePlayerController實現(xiàn)的是一樣的令宿,AVPlayer更強大的地方是它有對應的方法去調(diào)節(jié)視頻的音量以及視頻的進度,可以通過簡單的UIslider來實現(xiàn)一個簡單的播放器腕窥,是不是很酷炫呢AC弧(具體的調(diào)節(jié)方法請參照蘋果API)