1. AVPlayerViewController简介
在iOS8中,iOS开发框架中引入了一个新的视频框架AVKit,其中提供了视频开发类AVPlayerViewController用于在应用中嵌入播放视频的控件。
iOS9系统后,iPad Air正式开始支持多任务与画中画的分屏功能,所谓画中画,即是用户可以将当前播放的视频缩小放在屏幕上同时进行其他应用程序的使用。
这个革命性的功能将极大的方便用户的使用。开发者使用AVPlayerViewController可以十分方便的实现视频播放的功能并在一些型号的iPad上集成画中画的功能。
AVPlayerViewController的使用频率其实很高,加入你的App不是专门做视频流的App,仅仅需要播放功能,或者说对播放界面要求不是很高都可以使用AVPlayerController
2. 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;
##3. AVPlayerViewController用法
AVPlayerViewController可以支持播放本地及网络视频文件,支持以下格式:.mov、.mp4、.mpv、.3gp。
值得一提的是即使我们把项目中支持横屏关掉,AVPlayerViewController还是会横屏,如果想实现不横屏,需要修改,设置为NO之后,横屏也不会有变化了
- (BOOL)shouldAutorotate{
//是否支持屏幕旋转,默认为YES
return NO;
}
AVPlayerViewController调用需要加入两个系统框架,分别为
import <AVKit/AVKit.h>
import <AVFoundation/AVFoundation.h>
-(void)initView{
[self.Playerview addSubview:self.PlayerVC.view];
[self.PlayerVC.player play];
//我们可以将它自带的控件隐藏,设置自己需要的样式,我们写一个例子
//值得注意的是contentOverlayView的大小跟AVPlayerViewController的大小是相同的
/**
UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(WIDTH - 50, 400 - 60, 40, 40)];
[button setBackgroundImage:[UIImage imageNamed:@"Rotation@2x.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor whiteColor];
[self.PlayerVC.contentOverlayView addSubview:button];
self.PlayerVC.contentOverlayView.userInteractionEnabled = YES;
*/
//这里笔者有个疑问,放在ContentOverLayView上的控件点击没有反应,若有人想告,感激不尽
}
-(AVPlayerViewController*)PlayerVC{
if (!_PlayerVC) {
_PlayerVC = [[AVPlayerViewController alloc] init];
NSURL * url = [NSURL URLWithString:@"http://v.cctv.com/flash/mp4video6/TMS/2011/01/05/cf752b1c12ce452b3040cab2f90bc265_h264818000nero_aac32-1.mp4"];
_PlayerVC.player = [AVPlayer playerWithURL:url];
_PlayerVC.view.frame = CGRectMake(0, 0, WIDTH, 400);
_PlayerVC.showsPlaybackControls = YES;
}
return _PlayerVC;
}
-(UIView*)Playerview{
if (!_Playerview) {
_Playerview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, 400)];
_Playerview.backgroundColor = [UIColor yellowColor];
[self.view addSubview:_Playerview];
}
return _Playerview;
}
- #Demo地址奉上
https://github.com/usercai/OC