CNLivePlayer.h 9.83 KB
//
//  CNLivePlayer.h
//  CNLivePlayer_Example
//
//  Created by CNLive-zxw on 2019/7/26.
//  Copyright © 2019 153993236@qq.com. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <libksygpulive/KSYMoviePlayerController.h>
#import "KSYMoviePlayerDefines.h"

// 枚举定义
#import "CNLivePlayerDefines.h"

// 播放器管理类
#import "CNLivePlayerManager.h"

// 缓存url
#import "CNLivePlayerDBTool.h"

// 缓存视频
#import "CNLiveHTTPProxyService.h"

NS_ASSUME_NONNULL_BEGIN

/*
 * 获取主播状态通知
 */
UIKIT_EXTERN NSString *const CNLiveHostStatusChangedNotification;

/*
 * 成功回调
 */
typedef void(^AuthSuccessBlock)(void);

/*
 * 失败回调
 */
typedef void(^AuthFailureBlock)(NSDictionary *errorInfo);

@interface CNLivePlayer : NSObject

/*
 * 播放器类型
 */
@property (nonatomic, assign, readonly) CNLivePlayerType type;

/*
 * 播放器
 */
@property (nonatomic, strong) KSYMoviePlayerController *player;

#pragma mark - 初始化方法
/*
 * 初始化播放器并设置播放地址
 *
 * url     视频url
 *
 */
- (instancetype)initWithContentURL:(NSString *)url;


/* 初始化点播播放器  初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
 * 码率默认2-标清
 *
 * videoId           视频Id
 * authSuccess       初始化成功block
 * authFailed        初始化失败block 回调一个errorInfo的字典
 *
 */
- (instancetype)initVodPlayerWithVideoId:(NSString *)videoId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;


/* 初始化直播播放器(* 以channelId播放)  初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
 *
 * channelId         直播视频Id (注* 若agree为YES时,必传,用于获取主播状态; 若agree为NO,可不传)
 * activityId        活动Id
 * agree             是否允许获取主播状态 YES:获取 NO:不获取
 * authSuccess       初始化成功block
 * authFailed        初始化失败block 回调一个errorInfo的字典
 *
 * result            获取主播状态 YES:获取状态成功
 *                               NO:获取失败,不影响视频播放,但是获取不到主播离开、回来、直播结束等通知。
 * 可通过- (void)getHostStatus:(void(^)(BOOL result))result;方法重新获取
 */
- (instancetype)initLivePlayerWithChannelId:(NSString *)channelId activityId:(NSString *)activityId hostStatus:(BOOL)agree authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock getHostStatusResult:(void(^)(BOOL result))result;


/* 初始化音频播放器  初始化成功后才能对播放器进行设置(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
 *
 * audioId        音频Id
 * authSuccess    初始化成功block
 * authFailed     初始化失败block 回调一个errorInfo的字典
 *
 */
- (instancetype)initAudioPlayerWithAudioId:(NSString *)audioId authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;


#pragma mark - 属性
/**
 @abstract 正在播放的视频文件的地址,该地址可以是本地地址或者服务器地址。
 */
@property (nonatomic, readonly) NSURL *contentURL;

/**
 @abstract 包含视频播放内容的VIEW(只读)。
 @discussion view的使用逻辑:
 
 * 可以通过frame设置view大大小
 * 使用[scalingMode]([KSYMoviePlayerController scalingMode]) 可以更改视频内容在VIEW中的显示情况
 
 @see scalingMode
 */
// The view in which the media and playback controls are displayed.
@property (nonatomic, strong, readonly) UIView *view;

/*
 * 主播直播状态(只读)
 */
@property (nonatomic, assign, readonly) CNLiveHostStatus hostStatus;

/**
 @abstract 是否静音
 @discussion
 * 默认不静音
 * [prepareToPlay]方法前设置即生效,也可以在播放过程中动态切换
 */
@property (nonatomic) BOOL shouldMute;

/**
 @abstract 是否循环播放
 @discussion 默认不循环
 * 只在[prepareToPlay]调用前设置生效;
 * 只有点播生效,直播场景请勿设置
 */
@property (nonatomic) BOOL shouldLoop;

/**
 @abstract 指定逆时针旋转角度,只能是0/90/180/270, 不符合上述值不进行旋转
 */
@property (nonatomic, assign) int rotateDegress;

/**
 @abstract 是否打断其他后台的音乐播放
 @discussion 也可以理解为是否允许和其他音频同时播放
 @discussion YES:开始播放时,会打断其他的后台播放音频,也会被其他音频播放打断
 @discussion NO: 可以与其他后台播放共存,相互之间不会被打断
 @discussion 默认为YES
 */
@property (nonatomic) BOOL  bInterruptOtherAudio;

/*
 * 查询视频准备是否完成(只读)
 */
@property (nonatomic, readonly) BOOL isPreparedToPlay;

/*
 * 当前播放的时间
 */
@property(nonatomic, assign) NSTimeInterval currentPlaybackTime;

/**
 * 当前视频总时长
 * 视频总时长,单位是秒。
 * 如果是直播视频源,总时长为0.
 * 如果该信息未知,总时长默认为0.
 */
@property (nonatomic, readonly) NSTimeInterval duration;

/**
 @abstract 当前视频宽高
 @discussion 获取信息
 
 * 监听MPMovieNaturalSizeAvailableNotification
 * 播放过程中,宽高信息可能会产生更改
 
 @since Available in KSYMoviePlayerController 1.0 and later.
 */
@property (nonatomic, readonly) CGSize naturalSize;

/**
 @abstract 当前视频自带旋转(逆时针)角度
 @discussion  rotateDegress 是人为旋转角度,naturalRotate是文件meta信息中自带的旋转角度
 @warning 该方法由金山云引入,不是原生系统接口
 @since Available in KSYMoviePlayerController 2.2.0 and later.
 */
@property (nonatomic, readonly) NSInteger naturalRotate;

/**
 @abstract 当前播放器的播放状态(只读)。
 @discussion 可以通过该属性获取视频播放情况:
 
 <pre><code>
 typedef NS_ENUM(NSInteger, MPMoviePlaybackState) {
 MPMoviePlaybackStateStopped,           // 播放停止
 MPMoviePlaybackStatePlaying,           // 正在播放
 MPMoviePlaybackStatePaused,            // 播放暂停
 MPMoviePlaybackStateInterrupted,       // 播放被打断
 MPMoviePlaybackStateSeekingForward,    // 向前seeking中
 MPMoviePlaybackStateSeekingBackward    // 向后seeking中
 } NS_DEPRECATED_IOS(3_2, 9_0);
 </code></pre>
 @discussion 通知:
 
 * MPMoviePlayerPlaybackDidFinishNotification,当播放完成时提供通知
 * MPMoviePlayerPlaybackStateDidChangeNotification,当播放状态变化时提供通知
 
 @since Available in KSYMoviePlayerController 1.0 and later.
 */
// Returns the current playback state of the movie player.
@property (nonatomic, readonly) MPMoviePlaybackState playbackState;


/**
 @abstract 当前网络加载情况
 @discussion 可以通过该属性获取视频加载情况:
 
 <pre><code>
 typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) {
 MPMovieLoadStateUnknown        = 0,        // 加载情况未知
 MPMovieLoadStatePlayable       = 1 << 0,   // 加载完成,可以播放
 MPMovieLoadStatePlaythroughOK  = 1 << 1,   // 加载完成,如果shouldAutoplay为YES,将自动开始播放
 MPMovieLoadStateStalled        = 1 << 2,   // 如果视频正在加载中
 } NS_DEPRECATED_IOS(3_2, 9_0);
 </code></pre>
 @discussion 通知:
 
 * MPMoviePlayerLoadStateDidChangeNotification,当加载状态变化时提供通知
 
 @since Available in KSYMoviePlayerController 1.0 and later.
 */
// Returns the network load state of the movie player.
@property (nonatomic, readonly) MPMovieLoadState loadState;

#pragma mark - 方法
/*
 * 获取主播状态(离开/已结束)
 */
- (void)getHostStatus:(void(^)(BOOL result))result;

/* 给播放器设置内容id 设置成功后才能播放(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
 * 切换视频
 * contentId         内容Id(直播channelId+activityId)
 * type              内容类型
 */
- (void)setPlayerWithContentId:(NSString *)contentId type:(CNLivePlayerType)type authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;

/* 给点播播放器切换码率设置内容id 设置成功后才能播放(如:自动播放、是否开启硬件解码等)和调用准备播放视频方法(prepareToPlay)
 * 切换视频清晰度
 * contentId         内容Id(如果不切换视频,只切换清晰度,可以将contentId=nil)
 * rate              码率 1-流畅,2-标清,3-高清,4-超清,默认为2
 */
- (void)setPlayerWithContentId:(NSString *)contentId rate:(NSString *)rate authSuccess:(AuthSuccessBlock)authSuccessBlock authFailure:(AuthFailureBlock)authFailureBlock;

/*
 * 销毁播放器
 */
- (void)destroyPlayer;

/*
 * 准备视频播放
 * MPMediaPlaybackIsPreparedToPlayDidChangeNotification  播放器完成对视频文件的初始化时发送通知
 */
- (void)prepareToPlay;

/*
 * 视频播放
 */
- (void)play;

/*
 * 当前播放器是否在播放
 */
- (BOOL)isPlaying;

/*
 * 视频暂停
 */
- (void)pause;

/*
 * 视频停止
 */
- (void)stop;

/*
 * 视频截图
 */
- (UIImage *)thumbnailImageAtCurrentTime;

/**
 @abstract 重新启动拉流
 @param aUrl 视频播放地址,该地址可以是本地地址或者服务器地址.如果为nil,则使用前一次播放地址
 @discussion 调用场景如下:
 
 * 当播放器调用方发现卡顿时,可以主动调用
 * 当估计出更优质的拉流ip时,可以主动调用
 * 当发生WiFi/3G网络切换时,可以主动调用
 * 当播放器回调体现播放完成时,可以主动调用
 * 播放器SDK不会自动调用reload功能
 
 @warning 该方法由金山云引入,不是原生系统接口
 @since Available in KSYMoviePlayerController 1.0 and later.
 */
- (void)reload:(NSURL *)aUrl;

@end

NS_ASSUME_NONNULL_END