AVKit框架

AVKit框架基于AVFoundation框架,提供了一个用于播放视频内容的高级界面,创建用于媒体播放的视图级服务。主要包含两个类:AVPictureInPictureControllerAVPlayerViewController

一、AVPlayerViewController

AVPlayerViewController类继承与UIViewController,在iOS 8.0之后可以使用,用来代替MPMoviePlayerController(iOS 9.0后被废弃)。用于显示AVPlayer对象的视频内容以及系统提供的播放控制。

  • @property (nonatomic, strong, nullable) AVPlayer *player;用于从视图控制器获取媒体内容的播放器。

  • @property (nonatomic) BOOL showsPlaybackControls;是否显示播放控制。 默认为YES。

  • @property (nonatomic, copy) NSString *videoGravity;定义视频在AVPlayerLayer中的显示方式字符串。此处都是系统定义的字符串,有关选项的说明,请参阅<AVFoundation / AVAnimation.h>

    • AVLayerVideoGravityResizeAspect:默认项,在layer层范围内保持长宽比适配。不会变形和缺失。
    • AVLayerVideoGravityResizeAspectFill:在layer层范围内保持长宽比完全填充满。不会变形但是会使显示部分缺失。
    • AVLayerVideoGravityResize:平铺,会变形。
  • @property (nonatomic, readonly, getter = isReadyForDisplay) BOOL readyForDisplay;表示第一个视频帧已经准备就绪,可以显示相关AVPlayer的当前项目,就是说是否准备好播放视频。

  • @property (nonatomic, readonly) CGRect videoBounds;视频图像显示在父视图范围内的当前大小和位置。

  • @property (nonatomic, readonly, nullable) UIView *contentOverlayView;获取在视频内容和视频控制控件之间用来添加其他自定义视图的内容叠加层视图。

以上属性是8.0后就可以使用,下面是关于实现画中画效果的属性和方法,对于SDK要求比较高(所谓画中画,即是用户可以将当前播放的视频缩小放在屏幕上同时进行其他应用程序的使用,画中画仅在iPad上可用)

  • @property (nonatomic, weak, nullable) id <AVPlayerViewControllerDelegate> delegate API_AVAILABLE(ios(9.0)); 设置代理。

  • @property (nonatomic) BOOL allowsPictureInPicturePlayback API_AVAILABLE(ios(9.0));是否允许画中画播放。 默认为YES。只在iPad上有效。

  • @property (nonatomic) BOOL updatesNowPlayingInfoCenter API_AVAILABLE(ios(10.0));指示播放器视图控制器是否更新现在正在播放的信息中心。

  • @property (nonatomic) BOOL entersFullScreenWhenPlaybackBegins API_AVAILABLE(ios(11.0));当播放按钮被点击时,是否自动进入全屏。 默认为NO。

  • @property (nonatomic) BOOL exitsFullScreenWhenPlaybackEnds API_AVAILABLE(ios(11.0));当播放完后,是否自动退出全屏。 默认为NO。

AVPlayerViewControllerDelegate代理方法:

  • - (void)playerViewControllerWillStartPictureInPicture:(AVPlayerViewController *)playerViewController; 画中画将要开始时调用。

  • - (void)playerViewControllerDidStartPictureInPicture:(AVPlayerViewController *)playerViewController;画中画已经开始时调用。

  • - (void)playerViewController:(AVPlayerViewController *)playerViewController failedToStartPictureInPictureWithError:(NSError *)error;在画中画无法启动时调用。

  • - (void)playerViewControllerWillStopPictureInPicture:(AVPlayerViewController *)playerViewController;在画中画将要停止是调用。

  • - (void)playerViewControllerDidStopPictureInPicture:(AVPlayerViewController *)playerViewController;在画中画已经停止是调用。

  • - (BOOL)playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart:(AVPlayerViewController *)playerViewController;是否在开始画中画时自动将当前的播放界面dismiss掉 返回YES则自动dismiss 返回NO则不会自动dismiss。

  • - (void)playerViewController:(AVPlayerViewController *)playerViewController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;用户点击还原按钮 从画中画模式还原时调用的方法。

简单示例:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    playerVC = [[AVPlayerViewController alloc] init];
    // 本地文件
//    NSURL * playerURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test"  ofType:@"mp4"]];
    // 网络资源
    NSURL * playerURL = [NSURL URLWithString:@"http://103.18.209.144/vhot2.qqvideo.tc.qq.com/AbGiL-wj27eJwdsfQXSfTHJzXd7a2v4iEN2oZpBfSh1I/o01836xm9bv.p702.1.mp4?sdtfrom=v1010&guid=fc947bf167ab7aa7ec24d7523d73b91b&vkey=BA71FD41E98CE214630AB773019FBCFDCA1653725707A23E819DE057AE20C4C94250FA0B0C1E63031FB89621068D2218C43BDEDF7E0421B31B667CD8621ABD4032617463E3F169876D39BFA50AFCD0CD710B8D68501140A62E4E1BC7746997EF8F43E4710BC4D53C376676B0CFB9E3F3CD97213F7DF356F6"];
    playerVC.player = [AVPlayer playerWithURL:playerURL];
    playerVC.delegate = self;
    playerVC.allowsPictureInPicturePlayback = YES;
    if (@available(iOS 11.0, *)) {
        playerVC.entersFullScreenWhenPlaybackBegins = YES;
        playerVC.exitsFullScreenWhenPlaybackEnds = YES;

    } else {
        // Fallback on earlier versions
    }
    [self presentViewController:playerVC animated:YES completion:nil];
}

- (void)playerViewController:(AVPlayerViewController *)playerViewController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL))completionHandler
{
    [self presentViewController:playerVC animated:YES completion:^{
        completionHandler(YES);
    }];
}
屏幕快照 2017-10-26 下午4.15.34.png

二、AVPictureInPictureController

AVPictureInPictureController是NSObject的一个子类,可用于呈现浮动在应用程序之上的AVPlayerLayer的内容。主要针对使用自定义AVPlayer播放的画中画设置。

  • + (BOOL)isPictureInPictureSupported;判断当前设备及当前上下文是否支持画中画。一般在显示提供画中画按钮之前调用。

  • + (UIImage *)pictureInPictureButtonStartImageCompatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection;参数给nil返回系统默认的“画中画”启动模板图像,用于播放器的“画中画”按钮。

  • + (UIImage *)pictureInPictureButtonStopImageCompatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection;参数给nil返回系统默认的“画中画”停止模板图像,用于播放器的“画中画”按钮。

  • - (nullable instancetype)initWithPlayerLayer:(AVPlayerLayer *)playerLayer;指定的初始化方法。

  • @property (nonatomic, readonly) AVPlayerLayer *playerLayer;获取播放图层。

  • @property (nonatomic, weak, nullable) id <AVPictureInPictureControllerDelegate> delegate;

  • - (void)startPictureInPicture;如果允许启动提供的AVPlayerLayer的画中画,在设置delegate后,delegate将会在开始和完成是分别调用- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;两个代理方法。
    如果调用画中画失败则会调用- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error;方法。

  • - (void)stopPictureInPicture;如果允许停止提供的AVPlayerLayer的画中画,与开始方法对应,在设置delegate后,delegate将会在开始和完成是分别调用- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;两个代理方法。

  • @property (nonatomic, readonly, getter = isPictureInPicturePossible) BOOL pictureInPicturePossible;指示当前是否可以进行画中画播放。该处要区别于isPictureInPictureSupported,这里主要检验在设备、系统支持的前提下是否有其他应用程序干扰实现画中画功能,如FaceTime,正在播放画中画内容,该属性的值是NO。

  • @property (nonatomic, readonly, getter = isPictureInPictureActive) BOOL pictureInPictureActive;指示控制器的画中画窗口是否在屏幕上。

  • @property (nonatomic, readonly, getter = isPictureInPictureSuspended) BOOL pictureInPictureSuspended;指示控制器的画中画窗口是否暂停。当另一个应用程序(通常为FaceTime)正在使用该功能时,您的应用程序的图片内容播放将被暂停。在这种状态下,您的视频播放是活动的,但已暂停和离开屏幕。当其他应用程序使用PiP完成时,您的应用程序的PiP播放将自动恢复。


以下为代理方法:AVPictureInPictureControllerDelegate

  • - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;将要进入画中画模式。

  • - (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;已经进入画中画模式。

  • - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error;进入画中画模式失败后调用。

  • - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;将要停止画中画模式。

  • - (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;已经停止画中画模式。

  • - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;当画中画即将停止时,调用它,让应用恢复其视频播放用户界面。要允许系统完成恢复用户界面,必须使block回调YES。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容