/**
 直播资源编码类型
 */
typedef NS_ENUM(NSInteger, QHVCPlayerDecodingType)
{
    QHVCMediaInfoDecodeFormateH264    = 0,//正在解码的是h264
    QHVCMediaInfoDecodeFormateH265    = 1,//正在解码的是h265
};

/**
 播放器播放模式
 */
typedef NS_ENUM(NSInteger, QHVCPlayMode)
{
    QHVCPlayModeFluency      = 0,//流畅模式
    QHVCPlayModeLowLatency   = 1,//低延迟模式
};

typedef NS_ENUM(NSInteger, QHVCRecorderFormat)
{
    QHVCRecorderFormat_MP4   = 0,
    QHVCRecorderFormat_MOV   = 1,
};

typedef struct
{
    int width;
    int height;
    int video_bitrate;
    
    int audio_bitrate;
    int samplerate;
    int channels;
    int fps;
}QHVCRecordConfig;

/**
 播放器advanceDelegate
 */
@protocol QHVCPlayerAdvanceDelegate <NSObject>

@optional

/**
 播放器实例句柄创建
 */
- (void)onPlayerHandlerCreated:(QHVCPlayer *_Nonnull)player;

/**
 播放器销毁
 */
- (void)onPlayerDestoryed:(QHVCPlayer *_Nonnull)player;

/**
 流量计算回调函数

 @param dvbps 播放器下行视频每秒字节数
 @param dabps 播放器下行音频每秒字节数
 @param dvfps 播放器下行视频每秒帧数
 @param dafps 播放器下行音频每秒帧数
 @param fps 当前fps
 @param bitrate 当前bitrate
 */
- (void)onPlayerNetStats:(long)dvbps
                   dabps:(long)dabps
                   dvfps:(long)dvfps
                   dafps:(long)dafps
                     fps:(long)fps
                 bitrate:(long)bitrate
                  player:(QHVCPlayer *_Nonnull)player;

/**
 编码方式

 @param decodingType 编码类型
 @param sn sheduled_sn_url
 @param errorCode errorCode
 */
- (void)onPlayerDecodingType:(QHVCPlayerDecodingType)decodingType sn:(NSString *_Nullable)sn errorCode:(int)errorCode player:(QHVCPlayer *_Nonnull)player;

/**
 直播预览指定次数结束回调
 */
- (void)onPlayerPreviewFinished:(QHVCPlayer *_Nonnull)player;

@end

@interface QHVCPlayer (Advance)

/**
 播放器扩展delegate
 */
@property (nonatomic, weak) _Null_unspecified id<QHVCPlayerAdvanceDelegate> playerAdvanceDelegate;

/**
 * 开始预调度
 
 * @param sn 资源标识
 * @param channelId channelID
 * @param userId 用户ID
 * @param uSign 鉴权签名
 * @return YES表示成功 NO表示失败
 */
+ (BOOL)prepareScheduling:(NSString * _Nonnull)sn
                channelId:(NSString * _Nullable)channelId
                   userId:(NSString * _Nullable)userId
                    uSign:(NSString * _Nonnull)uSign;

/**
 * 开始预调度,需要使用特定调度地址的情况
 * @param scheduleUrl 预调度地址 格式参考http://g2.live.360.cn/
 * @param sn 资源标识
 * @param channelId channelID
 * @param userId 用户ID
 * @param uSign 鉴权签名
 * @return YES表示成功 NO表示失败
 */
+ (BOOL)prepareScheduling:(NSString * _Nonnull)scheduleUrl
                       sn:(NSString * _Nonnull)sn
                channelId:(NSString * _Nullable)channelId
                   userId:(NSString * _Nullable)userId
                    uSign:(NSString * _Nonnull)uSign;

/**
 初始化播放器
 
 @param SN 要播放的SN
 @param userId 用户id
 @param uSign 验证信息
 @param optionsDict 播放器可选属性字典,可传nil,或者根据实际需要选择部分或者全部属性设置,支持的全部属性如下:
 NSDictionary *playProperty =
 {@"position", @"NSString long",//只适用于点播,设置点播开始到位置(毫秒)
 @"scheduleUrl",@"NSString"//调度地址,需要使用自定义的调度地址时使用
 @"hardDecode", @"boolValue"//播放器硬解开关
 @"renderMode", @QHVCPlayerRenderMode//播放器渲染模式
 @"playMode", @QHVCPlayMode//设置播放器播放模式,流畅/低延时
 @"mute", @"boolValue"//开始播放的时候是否静音0/1
 @"previewDuration", @"NSString int"//视频预览时长(毫秒)
 @"previewLoopCount", @"NSString int"//视频预览指定次数结束
 @"streamType", @"QHVCStreamType"//流类型
 }
 
 @return 播放器对象
 */
- (QHVCPlayer * _Nullable)initWithSN:(NSString * _Nonnull)SN
                           channelId:(NSString * _Nullable)channelId
                              userId:(NSString * _Nullable)userId
                               uSign:(NSString * _Nonnull)uSign
                            options:(NSDictionary * _Nullable)optionsDict;

/**
 * @abstract 视频截图
 * @return 视频帧图像
 */
- (UIImage *_Nullable)snapshotImage:(NSString * _Nonnull)path;

/**
 用于解决播放器audioSession被占用的场景
 */
+ (void)cleanAudioSession;

/**
 打开播放器流量统计

 @param intervalBySecond 统计计算周期,单位:秒
 @参见 onPlayerNetStats delegate
 */
- (void)openNetStats:(uint)intervalBySecond;

/**
 关闭播放器流量统计
 */
- (void)closeNetStats;

/**
 镜像模式开关,播放器模式状态是非镜像状态,若启用镜像模式,调用该接口

 @param bMirror 镜像:YES,否则:NO
 */
- (void)setMirror:(BOOL)bMirror;

/**
 连麦加入Group
 
 @param groupID group id
 */
- (void)addToGroup:(int)groupID;

/**
 * 通知GPS,时区信息,用于优化调度CDN,定期由业务调用(切换省市,距离较远时调用,不要频繁调用)
 * @param lon 经度
 * @param lat 纬度
 */
- (void)playerGPSZoneLonLat:(double)lon latitude:(double)lat;

/**
 * 倍速播放
 *
 * @param rate 播放速度,取值1~n(建议n<=5)
 */
- (void)setPlayBackRate:(float)rate;

/**
 获取播放倍速

 @return 倍速值
 */
- (float)getPlayBackRate;

/**
 * 开始录制
 * 注意:不支持暂停时录制
 *
 * @param filePath 录像存储路径(确保有读写权限)
 * @param recorderFormat 存储格式
 * @param config   配置
 * @return yes:成功  no: 失败
 */
- (BOOL)startRecorder:(NSString *_Nonnull)filePath recorderFormat:(QHVCRecorderFormat)recorderFormat recordConfig:(QHVCRecordConfig *_Nullable)config;

/**
 * 结束录制(异步接口)
 *
 * @return yes:成功  no: 失败
 */
- (BOOL)stopRecorder;


/**
 视频转gif

 @param inputPath 视频路径
 @param outputPath gif路径
 @param sampleInterval 画面取帧间隔
 @param callback 进度状态回调
 */
+ (void)createGifWithVideo:(NSString *_Nonnull)inputPath outPutPath:(NSString *_Nonnull)outputPath sampleInterval:(NSUInteger)sampleInterval callback:(void (^_Nonnull)(float progress, BOOL completed))callback;