1. 程式人生 > >iOS開發之AVKit框架使用

iOS開發之AVKit框架使用

iOS開發之AVKit框架使用

一、引言

    在iOS開發框架中,AVKit是一個非常上層,偏應用的框架,它是基於AVFoundation的一層檢視層封裝。其中相關檔案和類都十分簡單,本篇部落格主要整理和總結AVKit中相關類的使用方法。

二、AVRoutePickerView

    AVRoutePickerView是iOS 11後新加入的類,AirPlay是iOS裝置方便使用者使用的一大特點。其作用是將當前手機播放的音訊或者視訊投送到其他外部裝置上,例如支援AirPlay的電視,車載裝置等。AVRoutePickerView只是一個按鈕,其用來方便使用者可以直接在應用程式內喚出AirPlay選擇視窗。示例如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    AVRoutePickerView * view = [[AVRoutePickerView alloc]initWithFrame:CGRectMake(100, 100, 60, 60)];
    //活躍狀態顏色
    view.activeTintColor = [UIColor redColor];
    //設定代理
    view.delegate = self;
    [self.view addSubview:view];
}
//AirPlay介面彈出時回撥
- (void)routePickerViewWillBeginPresentingRoutes:(AVRoutePickerView *)routePickerView{
    NSLog(@"!!!!!!!!");
}
//AirPlay介面結束時回撥
- (void)routePickerViewDidEndPresentingRoutes:(AVRoutePickerView *)routePickerView{
    NSLog(@"@@@@@@@@");
}

按鈕和彈出介面效果如下:

從上面的示例程式碼也可以看出,對於AVRoutePickerView,我們基本沒有任何可以進行自定義的餘地,從UI效果到按鈕的觸發方法全部由AVKit封裝好了,它只是一個喚出系統功能的介面。

三、AVPlayerViewController

    AVPlayerViewController是對AVFoundation中的AVPlayer與AVPlayerLayer的封裝,它是一個封裝好的檢視控制器,包含了視訊的播放和控制功能。這個類在iOS8之後可用,解析如下:

@interface AVPlayerViewController : UIViewController
//視訊播放器物件
@property (nonatomic, strong, nullable) AVPlayer *player;
//是否顯示視訊播放控制組件
@property (nonatomic) BOOL showsPlaybackControls;
//設定視訊的填充方式
/*
//按比例縮放
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResizeAspect NS_AVAILABLE(10_7, 4_0);
//按比例填充
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResizeAspectFill NS_AVAILABLE(10_7, 4_0);
//充滿
AVF_EXPORT AVLayerVideoGravity const AVLayerVideoGravityResize NS_AVAILABLE(10_7, 4_0);
*/
@property (nonatomic, copy) AVLayerVideoGravity videoGravity;
//視訊的第一幀是否已經準備好了
@property (nonatomic, readonly, getter = isReadyForDisplay) BOOL readyForDisplay;
//獲取視訊的尺寸
@property (nonatomic, readonly) CGRect videoBounds;
//內容覆蓋層 可以向其上新增子檢視 會出現在視訊層與控制層之間
@property (nonatomic, readonly, nullable) UIView *contentOverlayView;
//是否允許畫中畫  iOS9以上可用 ipad可用
@property (nonatomic) BOOL allowsPictureInPicturePlayback API_AVAILABLE(ios(9.0));
//是否對資訊中心的播放器資訊進行更新 預設為YES
@property (nonatomic) BOOL updatesNowPlayingInfoCenter API_AVAILABLE(ios(10.0));
//是否預設進行全屏播放
@property (nonatomic) BOOL entersFullScreenWhenPlaybackBegins API_AVAILABLE(ios(11.0));
//播放結束後 是否預設退出全屏
@property (nonatomic) BOOL exitsFullScreenWhenPlaybackEnds API_AVAILABLE(ios(11.0));
//代理
@property (nonatomic, weak, nullable) id <AVPlayerViewControllerDelegate> delegate API_AVAILABLE(ios(9.0));
@end

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;
//畫中畫結束後回覆之前的使用者介面
- (void)playerViewController:(AVPlayerViewController *)playerViewController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;

四、AVPictureInPictureController

      AVPictureInPictureController是一個控制器,用來對畫中畫進行相關操作,解析如下:

@interface AVPictureInPictureController : NSObject
//獲取當前裝置是否支援畫中畫
+ (BOOL)isPictureInPictureSupported;
//畫中畫轉換開始按鈕影象
+ (UIImage *)pictureInPictureButtonStartImageCompatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection;
//畫中畫轉換結束按鈕影象
+ (UIImage *)pictureInPictureButtonStopImageCompatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection;
//構造方法
- (nullable instancetype)initWithPlayerLayer:(AVPlayerLayer *)playerLayer;
//播放器檢視
@property (nonatomic, readonly) AVPlayerLayer *playerLayer;
//代理
@property (nonatomic, weak, nullable) id <AVPictureInPictureControllerDelegate> delegate;
//開始畫中畫
- (void)startPictureInPicture;
//結束畫中畫
- (void)stopPictureInPicture;
//畫中畫目前是否可用
@property (nonatomic, readonly, getter = isPictureInPicturePossible) BOOL pictureInPicturePossible;
//畫中畫是否啟用
@property (nonatomic, readonly, getter = isPictureInPictureActive) BOOL pictureInPictureActive;
//是否支援畫中畫
@property (nonatomic, readonly, getter = isPictureInPictureSuspended) BOOL pictureInPictureSuspended;