前面有一篇博客探討了iOS中視頻播放的開發相關類和方法,那篇博客中主要講解的是MeidaPlayer框架中的MPMoviePlayerController類和MPMoviePlayerViewController類。在iOS8中,iOS開發框架中引入了一個新的視頻框架AVKit,其中提供了視頻開發類AVPlayerViewController用於在應用中嵌入播放視頻的控件。在iOS8中,這兩個框架中的視頻播放功能並沒有太大差別,基本均可以知足開發者的需求。iOS9系統後,iPad Air正式開始支持多任務與畫中畫的分屏功能,所謂畫中畫,便是用戶能夠將當前播放的視頻縮小放在屏幕上同時進行其餘應用程序的使用。這個革命性的功能將極大的方便用戶的使用。於此同時,在iOS9中,MPMoviePlayerController與MPMoviePlayerViewController類也被徹底易用,開發者使用AVPlayerViewController能夠十分方便的實現視頻播放的功能並在一些型號的iPad上集成畫中畫的功能。編程
使用AVPlayerViewController首先須要引入兩個框架,以下:app
#import <AVKit/AVKit.h> #import <AVFoundation/AVFoundation.h>
使用以下代碼進行視頻的播放:框架
NSString * path = [[NSBundle mainBundle]pathForResource:@"iphone" ofType:@"mp4"]; NSURL *url = [NSURL fileURLWithPath:path]; AVPlayerViewController * play = [[AVPlayerViewController alloc]init]; play.player = [[AVPlayer alloc]initWithURL:url]; [self presentViewController:play animated:YES completion:nil];
運行工程,能夠看到以下圖所示的視頻播放界面:iphone
AVPlayerViewController中還有以下屬性和方法提供給開發者使用:ide
//是否顯示視頻播放控制控件 @property (nonatomic) BOOL showsPlaybackControls; //設置視頻播放界面的尺寸縮放選項 /* 能夠設置的值及意義以下: AVLayerVideoGravityResizeAspect 不進行比例縮放 以寬高中長的一邊充滿爲基準 AVLayerVideoGravityResizeAspectFill 不進行比例縮放 以寬高中短的一邊充滿爲基準 AVLayerVideoGravityResize 進行縮放充滿屏幕 */ @property (nonatomic, copy) NSString *videoGravity; //獲取是否已經準備好開始播放 @property (nonatomic, readonly, getter = isReadyForDisplay) BOOL readyForDisplay; //獲取視頻播放界面的尺寸 @property (nonatomic, readonly) CGRect videoBounds; //視頻播放器的視圖 自定義的控件能夠添加在其上 @property (nonatomic, readonly, nullable) UIView *contentOverlayView; //畫中畫代理 iOS9後可用 @property (nonatomic, weak, nullable) id <AVPlayerViewControllerDelegate> delegate NS_AVAILABLE_IOS(9_0); //是否支持畫中畫 iOS9後可用 默認支持 @property (nonatomic) BOOL allowsPictureInPicturePlayback NS_AVAILABLE_IOS(9_0);
AVPlayerViewController是默認支持畫中畫操做的,如上圖所示,視頻的播放界面右下角出現一個畫中畫的按鈕,點擊這個按鈕當前播放的視頻界面會縮小顯示在屏幕角落,這時點擊Home鍵回到主界面,或者切換到其餘應用程序,視頻播放不會中斷。以下圖所示:atom
兩指的捏合操做能夠將縮小的視頻播放窗口進行任意尺寸的放大,若是將視頻窗口拖進屏幕的邊界,視頻窗口會被吸進邊界,用戶能夠經過拖拽手勢將其拉出,以下圖:url
AVPlayerViewControllerDelegate中的方法能夠對用戶畫中畫的操做進行監聽:spa
//將要開始畫中畫時調用的方法 - (void)playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController{ } //已經開始畫中畫時調用的方法 - (void)playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController{ } //開始畫中畫失敗調用的方法 - (void)playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error{ } //將要中止畫中畫時調用的方法 - (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController{ } //已經中止畫中畫時調用的方法 - (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController{ } //是否在開始畫中畫時自動將當前的播放界面dismiss掉 返回YES則自動dismiss 返回NO則不會自動dismiss - (BOOL)playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart:(AVPlayerViewController *)playerViewController{ return YES; } //用戶點擊還原按鈕 從畫中畫模式還原回app內嵌模式時調用的方法 - (void)playerViewController:(AVPlayerViewController *)playerViewController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler{ }
專一技術,熱愛生活,交流技術,也作朋友。代理
——琿少 QQ羣:203317592rest