在iOS8中,iOS开发框架中引入了一个新的视频框架AVKit,其中提供了视频开发类AVPlayerViewController用于在应用中嵌入播放视频的控件。
iOS9系统后,iPad Air正式开始支持多任务与画中画的分屏功能,所谓画中画,即是用户可以将当前播放的视频缩小放在屏幕上同时进行其他应用程序的使用。
这个革命性的功能将极大的方便用户的使用。开发者使用AVPlayerViewController可以十分方便的实现视频播放的功能并在一些型号的iPad上集成画中画的功能。
注意事项:
* AVPlayerViewController提供了默认的可视化控制界面,要使用AVPlayerViewController需导入AVKit.h。
* AVPlayerViewController整合了一个完整的播放器,可以作为控制器进行操作显示。
* AVPlayerViewController可以支持播放本地及网络视频文件,支持以下格式:.mov、.mp4、.mpv、.3gp。
* 在循环播放视频的时,MPMoviePlayerController可以直接设置循环播放模式self.player.repeatMode = MPMovieRepeatModeOne;而AVPlyer和AVPlayerViewController都是需要添加通知去监测播放完成和后台切换到前台这个操作。
AVPlayerViewController内部封装的播放器 @property (nonatomic, strong, nullable) AVPlayer *player; 是否显示媒体播放组件,默认为YES @property (nonatomic) BOOL showsPlaybackControls; 拉伸模式,默认为AVLayerVideoGravityResizeAspect @property (nonatomic, copy) NSString *videoGravity; 枚举类型如下: AVLayerVideoGravityResizeAspect 不进行比例缩放 以宽高中长的一边充满为基准 AVLayerVideoGravityResizeAspectFill 不进行比例缩放 以宽高中短的一边充满为基准 AVLayerVideoGravityResize 进行缩放充满屏幕 是否准备好播放 @property (nonatomic, readonly, getter = isReadyForDisplay) BOOL readyForDisplay; 播放视频界面的尺寸 @property (nonatomic, readonly) CGRect videoBounds; 视频播放器的视图 自定义的控件可以添加在其上 @property (nonatomic, readonly, nullable) UIView *contentOverlayView; 接收方是否允许画中画回放。默认YES。9.0之后可以使用 @property (nonatomic) BOOL allowsPictureInPicturePlayback NS_AVAILABLE_IOS(9_0); 是否更新信息中心,10.0之后可以使用 @property (nonatomic) BOOL updatesNowPlayingInfoCenter NS_AVAILABLE_IOS(10_0); 代理 @property (nonatomic, weak, nullable) id <AVPlayerViewControllerDelegate> delegate NS_AVAILABLE_IOS(9_0);
start.将要开始画中画时调用的方法 - (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; 用户点击还原按钮 从画中画模式还原回app内嵌模式时调用的方法 - (void)playerViewController:(AVPlayerViewController *)playerViewController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;
移除播放完成与切换通知 - (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; }
配置播放相关属性以及注册完成和切换通知 - (void)setMovieURL:(NSURL *)movieURL{ _movieURL = movieURL; [self configurationStartVideoPath:_movieURL]; } - (void)configurationStartVideoPath:(NSURL *)pathUrl{ if (!pathUrl) { return; } AVPlayer *player = [[AVPlayer alloc]initWithURL:pathUrl]; // playerVC _playerViewController = [[AVPlayerViewController alloc] init]; // 控制器的player播放器 _playerViewController.player = player; // 试图的填充模式 _playerViewController.videoGravity = AVLayerVideoGravityResizeAspectFill; // 是否显示播放控制条 _playerViewController.showsPlaybackControls = NO; // 设置显示的Frame _playerViewController.view.frame = self.bounds; //添加到当前view [self addSubview:_playerViewController.view]; // 播放 [_playerViewController.player play]; //注册通知 播放完成 和从后台切换到前台 //完成 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil]; //后台->前台 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name: UIApplicationWillEnterForegroundNotification object:nil]; }
通知事件 - (void)playbackFinished:(NSNotification *)notifation { // 回到视频的播放起点 -> 播放 [self.playerViewController.player seekToTime:kCMTimeZero]; [self.playerViewController.player play]; }