介紹:
和音頻播放一樣,ios也提供個很多的API。如mediaPlayer.framework下的MPMediaPlayerController、AVFounditon.framework下的AVPlayer和AVKit下的AVPlayerViewcontroller。MPMovieplayerController已經在ios9.0中被廢棄了,用來替代的是AVPlayerViewcontroller。盡管如此,但還是說一下比較熟悉的MPMovieplayerController.
1、MPMovieplayerController
<1>初始化MPMovieplayerController
// 創建本地URL(也可創建基於網絡的URL) NSURL* movieUrl = [[NSBundlemainBundle]URLForResource:@"movie"withExtension:@"mp4"]; // 使用指定URL創建MPMoviePlayerController // MPMoviePlayerController將會播放該URL對應的視頻 MPMoviePlayerController *moviePlayer = [[MPMoviePlayerControlleralloc]initWithContentURL:movieUrl];
<2>設置屬性並添加到當前控制器的View上
// 設置該播放器的控制條風格。 moviePlayer.controlStyle =MPMovieControlStyleEmbedded; // 設置該播放器的縮放模式 moviePlayer.scalingMode =MPMovieScalingModeAspectFit; //設置播放視圖大小 _movieplayer.view.frame = self.view.bounds; //設置播放視圖寬高自適應調整 _movieplayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//添加到當前控制器的View上
[self.View addSubview:moviePlayer.view];
<3>播放選擇
//播放緩沖 [self.movieplayer prepareToPlay]; //播放開始 [moviePlayer play]; //播放暫停 [moviePlayer pause]; //播放停止 [moviePlayer stop];
由於屬性太多,這里只列出能完成簡單的播放器的屬性,其他屬性可在頭文件中查找,注意:播放的狀態的監聽和截圖功能都是通過通知實現的。
這里給一個具體的代碼:
ViewController類
#import "ViewController.h" #import "PlayViewController.h" @interface ViewController ()<PlayViewControllerDelegate> @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"播放器"; } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ PlayViewController *playContronller = segue.destinationViewController; playContronller.delegate = self; } #pragma mark <PlayViewControllerDelegate> -(void)dismissPlayViewController{ [self dismissViewControllerAnimated:self completion:nil]; } -(void)setImageWithThumbnailImage:(UIImage *)image{ self.imageView.image = image; } @end
PlayViewController類
#import <UIKit/UIKit.h> @protocol PlayViewControllerDelegate <NSObject> //關閉模態窗體 -(void)dismissPlayViewController; //設置截圖 -(void)setImageWithThumbnailImage:(UIImage *)image; @end @interface PlayViewController : UIViewController @property (assign,nonatomic)id<PlayViewControllerDelegate> delegate; @end
#import "PlayViewController.h" #import <MediaPlayer/MediaPlayer.h> #import <AVKit/AVKit.h> @interface PlayViewController () @property (strong,nonatomic)MPMoviePlayerController *movieplayer; @end @implementation PlayViewController /** 創建視頻播放器 */ -(MPMoviePlayerController *)movieplayer{ if (!_movieplayer) { //設置播放器的屬性 NSURL *URL = [[NSBundle mainBundle]URLForResource:@"風景" withExtension:@".mp4"]; _movieplayer = [[MPMoviePlayerController alloc]initWithContentURL:URL]; _movieplayer.view.frame = self.view.bounds; _movieplayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; //添加通知 [self addNotify]; } return _movieplayer; } - (void)viewDidLoad { [super viewDidLoad]; [self.view addSubview:self.movieplayer.view]; [self.movieplayer prepareToPlay]; [self.movieplayer play]; } //添加通知 -(void)addNotify{ //注冊播放完成的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:_movieplayer]; //注冊播放狀態改變的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackStateChanged) name:MPMoviePlayerPlaybackStateDidChangeNotification object:_movieplayer]; //注冊全屏通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidEnterFullScreen) name:MPMoviePlayerDidEnterFullscreenNotification object:_movieplayer]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayDidExitFullScreen) name:MPMoviePlayerDidExitFullscreenNotification object:_movieplayer]; //注冊請求截屏的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerRequestThumbnailImage) name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:_movieplayer]; //發送截圖請求 [self.movieplayer requestThumbnailImagesAtTimes:@[@(5.0f),@(10.0f)] timeOption:MPMovieTimeOptionNearestKeyFrame]; } //截屏 -(void)moviePlayerRequestThumbnailImage{ //獲取圖片 UIImage *image = [self.movieplayer thumbnailImageAtTime:5.0f timeOption:MPMovieTimeOptionNearestKeyFrame]; NSLog(@"%@",image); if ([self.delegate respondsToSelector:@selector(setImageWithThumbnailImage:)]) { [self.delegate setImageWithThumbnailImage:image]; } } //播放完成 -(void)moviePlayBackDidFinish:(NSNotification *)notification{ NSLog(@"播放完成"); } //播放狀態改變 -(void)moviePlayBackStateChanged{ switch (self.movieplayer.playbackState) { case MPMoviePlaybackStateStopped: NSLog(@"播放停止"); break; case MPMoviePlaybackStatePlaying: NSLog(@"播放中"); break; case MPMoviePlaybackStatePaused: NSLog(@"播放暫停"); break; case MPMoviePlaybackStateInterrupted: NSLog(@"播放中斷"); break; case MPMoviePlaybackStateSeekingForward: NSLog(@"快進播放"); break; case MPMoviePlaybackStateSeekingBackward: NSLog(@"回退播放"); break; } } //進入全屏 -(void)moviePlayDidEnterFullScreen{ NSLog(@"進入全屏"); } //離開全屏 -(void)moviePlayDidExitFullScreen{ NSLog(@"離開全屏"); //關閉播放器 [self.movieplayer.view removeFromSuperview]; self.movieplayer = nil; if ([self.delegate respondsToSelector:@selector(dismissPlayViewController)]) { [self.delegate dismissPlayViewController]; } [[NSNotificationCenter defaultCenter]removeObserver:self]; } @end
演示結果截圖:
播放前: 播放中:

播放過程中一個指定時間點的視頻截圖

2、AVPlayer
AVPlayer既可以播放音樂又可以播放視頻;使用AVPlayer不能直接顯示視頻,必須要加入AVPlayerLayer中,並添加到其他能顯示的layer中。
//獲取播放源的url NSString *filePath = [[NSBundlemainBundle] pathForResource:@"backspace"ofType:@"mov"]; NSURL *sourceMovieURL = [NSURLfileURLWithPath: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];
3、AVPlayerViewcontroller
AVPlayerViewcontroller繼承自UIViewController,一般適用於點擊一個視頻縮略圖,modal出一個新的界面來進行播放的情況。
用法:
//創建播放器 AVPlayerViewController *player = [[AVPlayerViewController alloc]init]; player.player = [[AVPlayer alloc]initWithURL:movieUrl]; //模態出播放器 [self presentViewController:player animated:YES completion:nil];
4、ffmpeg-AVPlayer-for-iOS——強大的iOS視頻播放框架
ffmpeg-avplayer-for-ios是一個微小但是強大的iOS視頻播放框架,能夠播放大多數的音頻和視頻格式文件(包括網絡音頻和視頻流),沒有格式轉換的煩惱,不依賴VLC和SDL。支持播放1080P視頻,但是建議只在iPad Air & iPhone 5s設備上播放1080P視頻。
