Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • V VOD_iOS_SDK
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 4
    • Issues 4
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Infrastructure Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CCVideo
  • VOD_iOS_SDK
  • Wiki
  • 4.开发指南

Last edited by guow Jun 23, 2022
Page history

4.开发指南

开发指南

1.播放功能

1.1 DWVodVideoModel数据模型的使用

DWVodVideoModel类是SDK中媒体的数据模型,无论是播放、下载都需要通过DWPlayInfo对象来获取到此对象。获取方式详见2.集成指南。

以下是具体DWVodVideoModel中,包含的字段及含义:

/**
 *  @brief 视频id
 */
@property(nonatomic, strong, readonly)NSString * videoId;

/**
 *  @brief 视频标题
 */
@property(nonatomic, strong, readonly)NSString * title;

/**
 *  @brief 视频状态,0代表可用,否则代表不可用
 */
@property(nonatomic, assign, readonly)NSInteger status;

/**
 *  @brief 视频状态描述,若视频不可用,具体描述原因
 */
@property(nonatomic, strong, readonly)NSString * statusInfo;

/**
 *  @brief 默认清晰度
 */
@property(nonatomic, strong, readonly)NSString * defaultquality;

/**
 *  @brief 视频封面图地址
 */
@property(nonatomic, strong, readonly)NSString * img;

/**
 *  @brief 分享URL
 */
@property(nonatomic, strong, readonly)NSString * shareurl;

/**
 *  @brief 视频清晰度
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoQualityModel *> * videoQualities;

/**
 *  @brief 音频清晰度
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoQualityModel *> * radioQualities;

/**
 *  @brief 授权验证信息字典
 */
@property(nonatomic, strong, readonly)DWVideoAuthorizeModel * authorize;

/**
 *  @brief 是否原片播放
 */
@property(nonatomic, assign, readonly)BOOL isRealTime;

/**
 *  @brief 是否支持VR,1表示播放VR视频,0表示普通
 */
@property(nonatomic, assign, readonly)NSInteger vrmode;

/**
 *  @brief 视频打点数据
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoMarkModel *> * videomarks;

/**
 *  @brief 视频问答数据
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoQuestionModel *> * questions;

/**
 *  @brief 字幕类型,-1 无字幕 ,0 subtitle, 1 subtitle2, 2 双语
 */
@property(nonatomic, assign, readonly)NSInteger defaultSubtitle;

/**
 *  @brief 字幕模式,-1 无字幕 ,0 固定字号, 1 自适应模式
 */
@property(nonatomic, assign, readonly)NSInteger subtitlemodel;

/**
 *  @brief 字幕1
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle;

/**
 *  @brief 字幕2
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle2;

/**
 *  @brief 访客信息收集
 */
@property(nonatomic, strong, readonly)DWVideoVisitorModel * visitor;

/**
 *  @brief 课堂练习
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoExercisesModel *> * exercises;

/**
 *  @brief reason
 */
@property(nonatomic, assign, readonly)int reason;

/**
 *  @brief responseTime
 */
@property(nonatomic, strong, readonly)NSDate * responseTime;

/**
 *  @brief startTime
 */
@property(nonatomic, strong, readonly)NSDate * startTime;

/**
 *  @brief 获得场景视频账号id
 */
@property(nonatomic, strong, readonly)NSString * CCUserId;

/**
 *  @brief 获得场景视频账号key
 */
@property(nonatomic, strong, readonly)NSString * CCApiKey;

/**
 *  @brief 是否支持hls
 */
@property(nonatomic, assign, readonly)BOOL hlsSupport;

/**
 *  @brief UPID
 */
@property(nonatomic, strong, readonly)NSString * UPID;

/**
 *  @brief token
 */
@property(nonatomic, strong, readonly)NSString * token;

/**
 *  @brief reskeys 当数组中有video_clicker值的时候表明有答题器
 */
@property(nonatomic, copy)NSArray * reskeys;

/**
*数据格式要求:@{@"title":@"标题", @"seconds":@[@12, @20], @"btnText":@"按钮", @"content":@"内容"}
*随机签到:具体实现参考demo
*@property (nonatomic, copy) NSDictionary *randomSign;
*/

1.2 播放功能集成

1.2.1 播放功能的快速集成,请详见2.集成指南

1.2.2 DWPlayerView的使用

DWPlayerView是SDK的播放视图,可以通过创建此对象,添加到需要显示的视图上,并传入数据对象即可播放。

DWPlayerView包含的属性及方法如下:


/**
 *  @brief 播放属性
 */
@property(nonatomic,strong,readonly)AVPlayer *player;

/**
 *  @brief 播放图层
 */
@property(nonatomic,strong,readonly)AVPlayerLayer *playerLayer;

/**
 *  @brief 代理
 */
@property(nonatomic,weak)id<DWVideoPlayerDelegate> delegate;

/**
 *  @brief 视频填充模式,默认AVLayerVideoGravityResizeAspect
 */
@property(nonatomic,copy)NSString *videoGravity;

/**
 *  @brief 当前播放状态
 */
@property(nonatomic,assign,readonly)BOOL playing;

/**
 *  @brief 是否循环播放,默认为NO
 */
@property(nonatomic,assign)BOOL looping;

/**
 *  @brief 是否静音,默认为NO
 */
@property(nonatomic,assign)BOOL muted;

/**
 *  @brief 是否自动播放,默认为YES
 */
@property(nonatomic,assign)BOOL autoPlay;

/**
 *  @brief 视频加载超时时间,默认30s
 */
@property(nonatomic,assign)CGFloat timeOutLoad;

/**
 *  @brief 缓存超时时间,默认30s
 */
@property(nonatomic,assign)CGFloat timeOutBuffer;

/**
 *  @brief 缓冲模式 默认DWPlayerViewLoadStyleDefault
 */
@property(nonatomic,assign)DWPlayerViewLoadStyle loadStyle;

/**
 *  @brief 是否开启防录屏模式,默认为NO。仅对iOS11以上系统生效
 */
@property(nonatomic,assign)BOOL videoProtect;

/**
 *  @brief 期待缓冲时长,默认0,建议取值1 ~ 50。仅对iOS10以上系统,m3u8格式视频有效
 */
@property(nonatomic,assign)NSTimeInterval forwardBufferDuration;

/**
 *  @brief 是否是备用线路
 */
@property(nonatomic,assign,readonly)BOOL isSpar;

/**
 *  @brief 当前正在播放的媒体清晰度model,非在线视频返回nil。注意,在调用playVodViedo:withCustomId:方法后才可获取到此属性
 */
@property(nonatomic,strong,readonly,nullable)DWVideoQualityModel * qualityModel;

/**
 *  @brief 返回当前播放的离线model,在线视频返回nil。注意,在调用playLocalVideo:方法后才可获取到此属性
 */
@property(nonatomic,strong,readonly,nullable)DWDownloadModel * downloadModel;

/**
 *  @brief 当前播放时长
 */
@property(nonatomic,assign,readonly)NSTimeInterval playedTimes;

/**
 *  @brief 当前暂停时长
 */
@property(nonatomic,assign,readonly)NSTimeInterval pausedTimes;

/**
 *  @brief 视频自定义Logo。对于在线视频,直接设置即可显示,对于离线视频,调用playLocalVideo:方法播放时,会自动设置下载视频所设置的Logo,无需手动设置。
 */
@property(nonatomic,strong)DWVideoLogoModel * videoLogo;

/*!
 * @method
 * @abstract 初始化播放对象
 * @discussion 以单例的形式,初始化播放对象
 * @result DWPlayerView对象
 */
+(instancetype)sharedInstance;

/*!
 * @method
 * @abstract 初始化播放对象
 * @discussion 初始化播放对象
 * @result DWPlayerView对象
 */
-(instancetype)init;

/*!
 * @method
 * @abstract 初始化播放对象
 * @discussion 初始化播放对象
 * @param frame 视图frame
 * @result DWPlayerView对象
 */
-(instancetype)initWithFrame:(CGRect)frame;

/*!
 * @method
 * @abstract 播放网络视频
 * @discussion 播放默认清晰度,对于在线媒体,必须要执行此方法,否则会导致数据统计缺失
 * @param videoModel 在线视频model
 * @param customId 用户自定义参数,有自定义统计参数需求/流量统计的客户必须传值,没有此需求的客户请传nil
 */
-(void)playVodViedo:(DWVodVideoModel *)videoModel withCustomId:(NSString *)customId;

/*!
 * @method
 * @abstract 播放本地视频
 * @discussion 播放本地视频
 * @param downloadModel 离线视频model
 */
-(void)playLocalVideo:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 切换清晰度方法
 * @discussion 切换清晰度方法
 * @param qualitiyModel 清晰度model
 * @param customId 用户自定义参数,有自定义统计参数需求/流量统计的客户必须传值,没有此需求的客户请传nil
 */
-(void)switchQuality:(DWVideoQualityModel *)qualitiyModel withCustomId:(NSString *)customId;

/*!
 * @method
 * @abstract 切换备用线路
 * @discussion 切换当前清晰度下的备用线路
 */
-(void)switchSparPlayLine;

/*!
 * @method
 * @abstract 后台播放功能
 * @discussion 开启/关闭后台播放功能
 * @param play 是否允许后台播放
 */
-(void)setPlayInBackground:(BOOL)play;

/*!
 * @method
 * @abstract 画中画功能
 * @discussion 开启/关闭画中画功能
 * @param openPIP 是否开启画中画功能
 */
-(void)setPictureInPicture:(BOOL)openPIP API_AVAILABLE(ios(9.0));

/*!
 * @method
 * @abstract 切换倍速
 * @discussion 切换倍速
 * @param rate 倍速速率 目前只支持0.5X-2.0X
 */
-(void)setPlayerRate:(float)rate;

/*!
 * @method
 * @abstract 重复播放当前媒体
 * @discussion 重复播放当前媒体
 */
-(void)repeatPlay;

/*!
 * @method
 * @abstract 播放
 * @discussion 播放当前媒体资源
 */
-(void)play;

/*!
 * @method
 * @abstract 暂停
 * @discussion 暂停当前媒体资源
 */
-(void)pause;

/*!
 * @method
 * @abstract 拖到XX秒播放视频
 * @discussion 在AVPlayerItemStatusReadyToPlay即状态处于可播放后,拖拽生效
 * @param time 跳转时间
 */
-(void)scrub:(float)time;

/*!
 * @method
 * @abstract 拖到XX秒播放视频
 * @discussion 在AVPlayerItemStatusReadyToPlay即状态处于可播放后,拖拽生效
 * @param time 跳转时间
 * @param completion 跳转完成回调
 */
-(void)scrubPrecise:(float)time CompletionHandler:(void(^)(BOOL finished))completion;

/*!
 * @method
 * @abstract 记录播放位置的方法
 * @discussion 只为记忆播放功能使用,其它地方请调用scrub / scrubPrecise方法,在AVPlayerItemStatusReadyToPlay即状态处于可播放后 才会有效果
 * @param time 跳转时间
 */
-(void)oldTimeScrub:(float)time;

/*!
 * @method
 * @abstract 设置音量
 * @discussion 设置音量
 * @param volume 音量
 */
-(void)setVolume:(float)volume;

/*!
 * @method
 * @abstract 加大音量
 * @discussion 加大音量
 */
-(void)fadeInVolume;

/*!
 * @method
 * @abstract 减小音量
 * @discussion 减小音量
 */
-(void)fadeOutVolume;

/*!
 * @method
 * @abstract 关闭|释放播放资源
 * @discussion 关闭|释放播放资源
 */
-(void)resetPlayer;

/*!
 * @method
 * @abstract 停止视频播放统计
 * @discussion 播放页面关闭时务必调用removeTimer方法 注意:播放页面关闭时 如需释放资源 调用方式如下{
                                         [playerView removeTimer];
                                         [playerView resetPlayer];
                                       }
                如无需释放播放资源 调用方式如下{
                                         [playerView removeTimer];
                                         [playerView pause];
                                       }
 */
-(void)removeTimer;

/*!
 * @method
 * @abstract 触发一次震动
 * @discussion 触发一次震动
 */
-(void)shockFeedback;

//AirPlay技术 外部播放设置
/*!
 * @method
 * @abstract 支持AirPlay外部播放
 * @discussion 默认支持
 */
-(void)enableAirplay;

/*!
 * @method
 * @abstract 不支持AirPlay外部播放
 * @discussion 不支持AirPlay外部播放
 */
-(void)disableAirplay;

/*!
 * @method
 * @abstract 检测是否支持支持AirPlay外部播放
 * @discussion 检测是否支持支持AirPlay外部播放
 * @result 检测结果
 */
-(BOOL)isAirplayEnabled;

/*!
 * @method
 * @abstract 播放器截图
 * @discussion 获取播放器在当前时间点的截图
 * @result 图片对象
 */
-(UIImage *)screenShot;

/*!
 * @method
 * @abstract 获取可播放的持续时间
 * @discussion 获取可播放的持续时间
 * @result 可播放的持续时间
 */
-(NSTimeInterval)playableDuration;

/*!
 * @method
 * @abstract 获取当前player播放的URL
 * @discussion 可用于截图
 * @result 当前播放URL
 */
-(NSURL *)urlOfCurrentlyPlayingInPlayer;

/*!
 * @method
 * @abstract 获取用来做GIF功能的URL
 * @discussion 加密调用
 * @result 当前播放URL
 */
-(NSURL *)drmGIFURL;

/*!
 * @method
 * @abstract 获取用来做GIF功能的URL
 * @discussion 非加密调用
 * @result 当前播放URL
 */
-(NSURL *)unDrmGIFURL;

/*!
 * @method
 * @abstract 问答统计
 * @discussion 有此需求的客户调用,一个问题只发送一次
 * @param videoId 视频ID
 * @param questionId 问题ID
 * @param answerId 用户选择的选项ID,以逗号分隔多个选项ID,如1345是单选 2067,3092,4789是多选
 * @param status YES正确 NO错误
 */
-(void)reportQuestionWithVideoId:(NSString *)videoId questionId:(NSString *)questionId answerId:(NSString *)answerId status:(BOOL)status;

/*!
 * @method
 * @abstract 访客信息统计上报
 * @discussion 有此需求的客户调用
 * @param visitorId 访客信息收集器ID,必填
 * @param videoId 视频ID,必填
 * @param userId 获得场景视频账号ID,必填
 * @param message 上报信息,必填,具体格式详见demo
 */
-(void)reportVisitorCollectWithVisitorId:(NSString *)visitorId VideoId:(NSString *)videoId UserId:(NSString *)userId AndMessage:(NSString *)message;

/*!
 * @method
 * @abstract 课堂练习统计上报
 * @discussion 有此需求的客户调用
 * @param exercisesId 课堂练习ID,必填
 * @param videoId 视频ID,必填
 * @param userId 获得场景视频账号ID,必填
 * @param questionMes 上报信息,必填,具体格式详见demo
 * @param completion  完成回调,返回课堂练习结果
*/
-(void)reportExercisesWithExercisesId:(NSString *)exercisesId videoId:(NSString *)videoId UserId:(NSString *)userId QuestionMes:(NSString *)questionMes AndCompletion:(void (^)(NSArray * resultArray,NSError * error))completion;

1.2.3 DWPlayerViewDelegate的使用

DWPlayerViewDelegate是DWPlayerView的代理方法,包含了一系列的播放回调,用户可根据自己的功能需求来调用。

DWPlayerViewDelegate方法及含义如下:

/** 可播放
 @param playerView 自身对象
 */
-(void)videoPlayerIsReadyToPlayVideo:(DWPlayerView *)playerView;

/** 播放完毕
 @param playerView 自身对象
 */
-(void)videoPlayerDidReachEnd:(DWPlayerView *)playerView;

/** 获取播放进度
 @param playerView 自身对象
 @param time 当前播放时间
 */
-(void)videoPlayer:(DWPlayerView *)playerView timeDidChange:(float)time;

/** 获取缓冲进度
 @param playerView 自身对象
 @param duration 当前缓冲进度
 */
-(void)videoPlayer:(DWPlayerView *)playerView loadedTimeRangeDidChange:(float)duration;

/** 播放器缓存不足,播放卡顿
 @param playerView 自身对象
 */
-(void)videoPlayerPlaybackBufferEmpty:(DWPlayerView *)playerView;

/** 播放器缓存充足,可继续播放
 @param playerView 自身对象
 */
-(void)videoPlayerPlaybackLikelyToKeepUp:(DWPlayerView *)playerView;

/** 加载超时/scrub超时
 @param playerView 自身对象
 @param timeOut 超时类型
 */
-(void)videoPlayer:(DWPlayerView *)playerView receivedTimeOut:(DWPlayerViewTimeOut )timeOut;

/** 加载失败
 @param playerView 自身对象
 @param error 错误信息
 */
-(void)videoPlayer:(DWPlayerView *)playerView didFailWithError:(NSError *)error;

/** AVPlayerLayer对象发生改变时回调
 @param playerView 自身对象
 @param playerLayer 新的AVPlayerLayer对象
 */
-(void)videoPlayer:(DWPlayerView *)playerView ChangePlayerLayer:(AVPlayerLayer *)playerLayer;

1.2.4 DWPlayerSkinView的使用

为了方便用户快速集成我们的SDK,SDK中提供了一套带皮肤的播放器。若此播放器不满足需求,用户可使用DWPlayerView,来高度定制化自己的播放页面。

DWPlayerSkinView包含的属性及方法如下:

/**
 *  @brief 代理
 */
@property(nonatomic,weak) id<DWPlayerSkinViewDelegate> delegate;

/**
 *  @brief 当期视频标题
 */
@property(nonatomic,strong)NSString * title;

/**
 *  @brief 在线视频model
 */
@property(nonatomic,strong,readonly)DWVodVideoModel * videoModel;

/**
 *  @brief 离线视频model
 */
@property(nonatomic,strong,readonly)DWDownloadModel * downloadModel;

/**
 *  @brief DWPlayerView 对象
 */
@property(nonatomic,strong,readonly)DWPlayerView * player;

/**
 *  @brief 用户自定义参数  有自定义统计参数需求/流量统计的客户必须传值
 */
@property(nonatomic,copy)NSString * customId;

/**
 *  @brief 视频填充模式,默认AVLayerVideoGravityResizeAspect
 */
@property(nonatomic,strong)NSString * videoGravity;

/**
 *  @brief 宽高比 默认是4:3,若需改变view的大小,请设置此属性,不要直接设置frame
 */
@property(nonatomic,assign)CGFloat screenScale;

/**
 *  @brief 是否在播放中,YES 正在播放,NO 暂停播放
 */
@property(nonatomic,assign,readonly)BOOL isPlaying;

/**
 *  @brief 当前是否全屏,YES 全屏,NO 非全屏
 */
@property(nonatomic,assign,readonly)BOOL isFull;

/**
 *  @brief 当前播放倍速,默认1
 */
@property(nonatomic,assign,readonly)CGFloat speed;

/**
 *  @brief 当期播放媒体是否是视频,YES 视频,NO 音频
 */
@property(nonatomic,assign,readonly)BOOL isPlayVideo;

/**
 *  @brief 媒体总时长,收到videoPlayerSkinReadyToPlay回调以后生效
 */
@property(nonatomic,assign,readonly)NSTimeInterval totalDuration;

/**
 *  @brief 当前播放时间
 */
@property(nonatomic,assign,readonly)NSTimeInterval currentDuration;

/**
 *  @brief 当前缓冲时间,只对在线视频有效,离线视频为0
 */
@property(nonatomic,assign,readonly)NSTimeInterval bufferDuration;

/**
 *  @brief 媒体播放的起始位置,默认为0,如果设置此值 收到videoPlayerSkinReadyToPlay回调以后,会自动跳转到当前进度,包括切换清晰度时,也会拖拽到此
 */
@property(nonatomic,assign)NSTimeInterval scrubPosition;

/**
 *  @brief 是否允许自动旋转,默认YES,若设置NO,屏幕旋转时,将不会改变view的大小
 */
@property(nonatomic,assign)BOOL allowAutoRotate;

/**
 *  @brief 播放器默认横竖屏状态设置,仅在自动旋转功能关闭的情况下生效 会强制转换屏幕,需跟allowAutoRotate搭配使用。 默认YES,竖屏模式
 */
@property(nonatomic,assign)BOOL isPortraitModel;

/*!
 * @method
 * @abstract 初始化方法
 * @discussion 初始化方法,请调用此方法进行初始化,不要调用init,initWithFrame等初始化方法
 * @param time 当前播放时间
 * @result DWPlayerSkinView对象
 */
-(instancetype)initSkinView;

/*!
 * @method
 * @abstract 设置播放网络视频数据,并开始播放
 * @discussion 设置播放网络视频数据,并开始播放
 * @param videoModel DWVodVideoModel对象
 */
-(void)playVodViedo:(DWVodVideoModel *)videoModel;

/*!
 * @method
 * @abstract 设置播放本地视频,并开始播放
 * @discussion 设置播放本地视频,并开始播放
 * @param downloadModel DWDownloadModel对象
 */
-(void)playLocalVideo:(DWDownloadModel *)downloadModel;

注意:DWPlayerSkinView对象暂不支持修改frame的操作,view的大小完全根据传入的screenScale属性来决定的。

1.2.5 DWPlayerSkinViewDelegate的使用

DWPlayerSkinViewDelegate是DWPlayerSkinView的代理方法,包含了一些事件回调及播放状态回调。

DWPlayerSkinViewDelegate方法及含义如下:

/** 准备播放
 @param playerSkinView 自身对象
 */
-(void)videoPlayerSkinReadyToPlay:(DWPlayerSkinView *)playerSkinView;

/** 当前播放时长回调
 @param playerSkinView 自身对象
 @param time 当前播放时间
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView timeDidChange:(NSTimeInterval)time;

/** 媒体播放完毕回调
 @param playerSkinView 自身对象
 */
-(void)videoPlayerSkinEndToPlay:(DWPlayerSkinView *)playerSkinView;

/** 开始/暂停事件触发回调
 @param playerSkinView 自身对象
 @param isPlay 当前播放状态
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView PlayOrPauseAction:(BOOL)isPlay;

/** 全屏/非全屏旋转回调
 @param playerSkinView 自身对象
 @param isScreen 是否全屏状态
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView FullScreenAction:(BOOL)isScreen;

/** 后退按钮回调
 @param playerSkinView 自身对象
 @param backPortrait 后退按钮状态。注意:此值为YES时,会清空播放器
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView ReturnBackAction:(BOOL)backPortrait;

/** 倍速切换回调
 @param playerSkinView 自身对象
 @param speed 当期倍速
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView SpeedSwitchAction:(CGFloat)speed;

/** 下载事件回调
 @param playerSkinView 自身对象
 @param qualityModel 当前播放清晰度model
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView DownloadAction:(DWVideoQualityModel *)qualityModel;

/** 错误/警告信息回调
 @param playerSkinView 自身对象
 @param error 错误信息
 */
-(void)videoPlayerSkin:(DWPlayerSkinView *)playerSkinView didFailWithError:(NSError *)error;

1.3 统计功能

1.3.1 默认统计功能

此功能已在SDK内部实现,用户无需在做额外的设置即可在后台看到视频相关的统计数据。

1.3.2 自定义参数统计功能

若有自定义统计参数需求/流量统计的需求的客户,需自行进行如下设置。

下面是使用DWPlayerView / DWPlayerSkinView 播放器的具体使用方式:

对于使用DWPlayerView对象的用户,在设置播放数据或切换播放数据时,请传入customId即可。

[self.playerView playVodViedo:videoModel withCustomId:@"传入需要分类的customId"];
或者
[self.playerView switchQuality:qualityModel withCustomId:@"传入需要分类的customId"];

对于使用DWPlayerSkinView对象的用户,在调用playVodViedo:方法前,设置customId属性即可。例:

self.playerSkinView.customId = @"传入需要分类的customId";
...
[self.playerSkinView playVodViedo:播放对象];

1.4 视频打点功能

视频打点数据为DWVodVideoModel对象的<DWVideoMarkModel *>videomarks数组。

DWVideoMarkModel数据及含义如下:

/**
 *  @brief 打点描述内容
 */
@property(nonatomic, strong, readonly)NSString * markdesc;

/**
 *  @brief 打点时间
 */
@property(nonatomic, assign, readonly)NSInteger marktime;

1.5 视频问答

视频问答数据为DWVodVideoModel对象的<DWVideoQuestionModel *>questions数组。

DWVideoQuestionModel数据及含义如下:

/**
 *  @brief 问答id
 */
@property(nonatomic, strong, readonly)NSString * questionId;

/**
 *  @brief 问答题目描述
 */
@property(nonatomic, strong, readonly)NSString * content;

/**
 *  @brief 问答出现时间
 */
@property(nonatomic, assign, readonly)NSInteger showTime;

/**
 *  @brief 答案解释
 */
@property(nonatomic, strong, readonly)NSString * explainInfo;

/**
 *  @brief 是否允许跳过
 */
@property(nonatomic, assign, readonly)BOOL jump;

/**
 *  @brief 答错退回时间,-1表示不回退
 */
@property(nonatomic, assign, readonly)NSInteger backSecond;

/**
 *  @brief 选项列表
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoQuestionAnswerModel *> * answers;

/**
 *  @brief 是否多选
 */
@property(nonatomic, assign, readonly)BOOL multipleSelect;

/**
 *  @brief 答错能否继续播放
 */
@property(nonatomic, assign, readonly)BOOL keepPlay;

/**
 *  @brief 是否显示问答
 */
@property(nonatomic, assign)BOOL isShow;

///视频问题选项数据模型DWVideoQuestionAnswerModel
/**
 *  @brief 选项id
 */
@property(nonatomic, strong, readonly)NSString * answerId;

/**
 *  @brief 选项内容描述
 */
@property(nonatomic, strong, readonly)NSString * content;

/**
 *  @brief 是否是正确答案
 */
@property(nonatomic, assign, readonly)BOOL isRight;

1.6 视频字幕

视频字幕相关的数据包含三个,DWVodVideoModel对象的defaultSubtitle、subtitle、subtitle2。

具体数据及含义如下:

/**
 *  @brief 字幕类型,-1 无字幕 ,0 subtitle, 1 subtitle2, 2 双语
 */
@property(nonatomic, assign, readonly)NSInteger defaultSubtitle;

/**
 *  @brief 字幕1
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle;

/**
 *  @brief 字幕2
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle2;

//DWVideoSubtitleModel对象

/**
 *  @brief 字幕文件地址
 */
@property(nonatomic, strong, readonly)NSString * url;

/**
 *  @brief 字幕字体
 */
@property(nonatomic, strong, readonly)NSString * font;

/**
 *  @brief 字幕字体大小
 */
@property(nonatomic, assign, readonly)CGFloat size;

/**
 *  @brief 字幕字体色值  eg:0xFFFFFF
 */
@property(nonatomic, strong, readonly)NSString * color;

/**
 *  @brief 阴影色值  eg:0x000000
 */
@property(nonatomic, strong, readonly)NSString * surroundColor;

/**
 *  @brief 字幕距离底部的偏移量 百分比
 */
@property(nonatomic, assign, readonly)CGFloat bottom;

/**
 *  @brief 编码格式  utf-8/gbk
 */
@property(nonatomic, strong, readonly)NSString * code;

/**
 *  @brief 字幕名称
 */
@property(nonatomic, strong, readonly)NSString * subtitleName;

/**
 *  @brief 双语字幕中的位置,1:上, 2:下 单字幕时sort=0
 */
@property(nonatomic, assign, readonly)NSInteger sort;

/**
 *  @brief 存储文件名
 */
@property(nonatomic, strong, readonly)NSString * fileName;

/**
 *  @brief 存储路径
 */
@property(nonatomic, strong, readonly)NSString * filePath;

/**
 *  @brief 是否下载成功
 */
@property(nonatomic, assign, readonly)BOOL isDownload;

/*!
 * @method
 * @abstract 计算自适应字幕字体大小
 * @discussion 计算自适应字幕字体大小
 * @param size 后台返回字幕字体大小
 * @param playerWidth 当前播放器宽度,单位pt
 * @result 计算后的字幕字体大小
 */
+(CGFloat)getAdaptiveFontSize:(CGFloat)size PlayerWidth:(CGFloat)playerWidth;

1.7 授权验证功能

授权验证数据为DWVodVideoModel对象的authorize。

DWVideoAuthorizeModel数据及含义如下:

/**
 *  @brief 是否允许完整播放,NO:不允许完整播放 YES:允许完整播放
 */
@property(nonatomic, assign, readonly)BOOL enable;

/**
 *  @brief 视频试看时间,单位:秒
 */
@property(nonatomic, assign, readonly)NSInteger freetime;

/**
 *  @brief 提示内容
 */
@property(nonatomic, strong, readonly)NSString * message;

/**
 *  @brief 跑马灯数据
 */
@property(nonatomic, strong, readonly)NSString * marqueeStr;

1.7.1 跑马灯功能

对于需要集成跑马灯功能的用户,请引入#import <HDBaseUtils/HDMarqueeView.h>及#import <HDBaseUtils/HDMarqueeAction.h>头文件。

HDMarqueeView是跑马灯视图。

/*
自定义跑马灯 
数据格式参考demo中:marquee.json
tempDict:自定义跑马灯的数据
*/
NSDictionary *tempDict = [self readLocalFileWithName:@"marquee"];

/**
 *  @brief 父视图,必填
 */
@property(nonatomic,assign)UIView * fatherView;

/**
 *  @brief 跑马灯样式,默认文字样式
 */
@property(nonatomic,assign)HDMarqueeViewStyle style;

/**
 *  @brief 跑马灯文字内容
 */
@property(nonatomic,copy)NSString * text;

/**
 *  @brief 跑马灯文字格式
 */
@property(nonatomic,copy)NSDictionary * textAttributed;

/**
 *  @brief 跑马灯文字对齐方式,默认kCAAlignmentNatural
 */
@property(nonatomic,copy)NSString * textAlignmentMode;

/**
 *  @brief 跑马灯文字显示不全时,裁剪方式,默认kCATruncationNone
 */
@property(nonatomic,copy)NSString * textTruncationMode;

/**
 *  @brief 跑马灯文字是否自动换行,默认NO
 */
@property(nonatomic,assign)BOOL wrapped;

/**
 *  @brief 跑马灯图片
 */
@property(nonatomic,strong)NSURL * imageURL;

/**
 *  @brief 跑马灯效果,必填
 */
@property(nonatomic,strong)NSArray <HDMarqueeAction *> * actions;

/**
 *  @brief 循环次数,默认1,0表示无限循环
 */
@property(nonatomic,assign)NSInteger repeatCount;

/*!
 * @method
 * @abstract 开始跑马灯
 * @discussion 开始跑马灯
 */
-(void)startMarquee;

/*!
 * @method
 * @abstract 结束跑马灯
 * @discussion 结束跑马灯
 */
-(void)stopMarquee;

HDMarqueeAction是跑马灯的具体动作,比如在一个时间段内,从(0,0)点移动到(0.5,0.5)点

/**
 *  @brief 持续时间
 */
@property(nonatomic,assign)CGFloat duration;

/**
 *  @brief 动作开始时坐标位置
 */
@property(nonatomic,strong,readonly)HDMarqueeActionPosition * startPostion;

/**
 *  @brief 动作结束时坐标位置
 */
@property(nonatomic,strong,readonly)HDMarqueeActionPosition * endPostion;

@end

///用于记录每次的位置
@interface HDMarqueeActionPosition : NSObject

/**
 *  @brief 坐标位置,取值范围0 - 1,例如(0.5,0.5)
 */
@property(nonatomic,assign)CGPoint pos;

/**
 *  @brief 透明度,取值范围0 - 1
 */
@property(nonatomic,assign)CGFloat alpha;

1.8 广告功能

用户可以通过DWAdInfo,来获取后台投放的广告,实现广告的播放功能。

1.8.1 通过DWAdInfo,获取后台投放的广告信息

通过账号ID、视频ID、广告类型(现在支持片头、暂停,片尾三种类型),来获取DWVodAdInfoModel广告模型数据。

 DWAdInfo * adInfo = [[DWAdInfo alloc]initWithUserId:@"账号ID" andVideoId:@"视频ID" type:@"广告类型,详见demo"];
 [adInfo start];
 adInfo.finishBlock = ^(DWVodAdInfoModel *adInfo) {
    //广告获取成功回调
 };
 adInfo.errorBlock = ^(NSError *error) {
   //广告获取失败回调
 };

1.8.2 DWVodAdInfoModel广告模型数据

DWVodAdInfoModel属性及含义如下:

/**
 *  @brief 广告信息获取情况,0:获取成功 非0:获取失败
 */
@property(nonatomic, assign, readonly)NSInteger result;

/**
 *  @brief 广告类型,1 片头广告 2 暂停广告 3 片尾广告
 */
@property(nonatomic, assign, readonly)NSInteger type;

/**
 *  @brief 广告ID
 */
@property(nonatomic, strong, readonly)NSString * adId;

/**
 *  @brief 广告展示时长
 */
@property(nonatomic, assign, readonly)NSInteger time;

/**
 *  @brief 是否响应点击
 */
@property(nonatomic, assign, readonly)BOOL canClick;

/**
 *  @brief 是否允许跳过广告
 */
@property(nonatomic, assign, readonly)BOOL canSkip;

/**
 *  @brief 跳过时间,单位秒,经过若干秒后显示跳过按钮,0代表立即显示跳过按钮
 */
@property(nonatomic, assign, readonly)NSInteger skipTime;

/**
 *  @brief 广告信息
 */
@property(nonatomic, strong, readonly)NSArray <DWVodAdMaterialModel *> * ads;

广告信息模型DWVodAdMaterialModel属性及含义如下:

/**
 *  @brief 素材id
 */
@property(nonatomic, strong, readonly)NSString * materialId;

/**
 *  @brief 素材链接
 */
@property(nonatomic, strong, readonly)NSString * materialUrl;

/**
 *  @brief 跳转链接
 */
@property(nonatomic, strong, readonly)NSString * clickUrl;

1.9 VR视频

1.9.1 VR视频的判断

DWVodVideoModel对象中的vrmode,代表此视频是否是VR视频。

/**
 *  @brief 是否支持VR,1表示播放VR视频,0表示普通
 */
@property(nonatomic, assign, readonly)NSInteger vrmode;

1.9.2 VR视频的播放

VR视频的使用流程如下:

//1.首先,需要创建一个承载VR播放的视图,添加到需要展示的视图上。同时,将DWPlayerView隐藏。
self.vrView = [[UIView alloc]init];
[self addSubview:self.vrView];
self.playerView.hidden = NO;

//2.创建DWVRConfiguration、DWVRLibrary对象,并关联AVPlayerItem、VRView等属性,即可实现VR视频的播放。
self.config = [DWVRLibrary createConfig];
//关联AVPlayerItem
[_config asVideo:self.playerView.player.currentItem];
    
UINavigationController * currentNC = (UINavigationController *)DWAPPDELEGATE.window.rootViewController;
UIViewController * preVC = [currentNC.viewControllers objectAtIndex:currentNC.viewControllers.count - 1];
//关联VewController、VRView
[_config setContainer:preVC view:self.vrView];
//可选设置
[_config projectionMode:DWModeProjectionSphere];//效果
[_config displayMode:_display];//是否分屏
[_config interactiveMode:_interative];//交互方式
[_config pinchEnabled:true];
[_config setDirectorFactory:[[CustomDirectorFactory alloc]init]];
//通过DWVRConfiguration创建DWVRLibrary对象
self.vrLibrary = [_config build]; 

1.10 GIF录制功能

SDK提供DWGIFManager对象,来完成GIF录制。

DWGIFManager的方法属性及含义如下:

/**
 * Gif制作完成回调
 * @param GifURL     GIF的本地URL(本地路径存储到tmp文件夹下,如果需要本地保存,请copy到自己需要的路径下)
 * @param error      错误原因
 */
typedef void(^CompleteBlock)(NSError *error,NSURL *GifURL);

@interface DWGIFManager : NSObject

/**
 *  @brief 制作完成GIF回调
 */
@property(nonatomic,copy)CompleteBlock completeBlock;

/**
 *  @brief 生成GIF质量
 */
@property(nonatomic,assign)GIFQuality quality;

/**
 *  @brief GIF播放的次数,0无限循环
 */
@property(nonatomic,assign)NSInteger loopCount;

/**
 *  @brief 是否正在录制gif
 */
@property(nonatomic,readonly)BOOL isRecording;

/*!
 * @method
 * @abstract 关联播放器
 * @discussion 在startRecordingGif录制开始前调用,每次startRecordingGif前,都要调用此方法
 * @param playUrl                 播放路径
 * @param currentPlayer           当前播放player
 * @param m3u8Method              为YES,会强制使用m3u8视频格式截取GIF方式,一般设置为NO即可
 */
-(void)associationWithUrl:(NSURL *)playUrl CurrentPlayer:(AVPlayer *)currentPlayer AndUseM3U8Method:(BOOL)m3u8Method;

/*!
 * @method
 * @abstract 开始录制gif
 * @discussion 开始录制gif
 */
-(void)startRecordingGif;

/*!
 * @method
 * @abstract 结束录制gif
 * @discussion 如果视频播放完成,内部会自动调用此方法,完成GIF回调
 */
-(void)endRecordingGif;

/*!
 * @method
 * @abstract 取消录制gif
 * @discussion 取消录制gif
 */
-(void)cancelRecordGif;

1.11 访客信息收集

访客信息收集数据为DWVodVideoModel对象的visitor。

DWVideoVisitorModel数据及含义如下:

/**
 *  @brief 收集器ID
 */
@property(nonatomic, strong, readonly)NSString * visitorId;

/**
 *  @brief 收集器标题
 */
@property(nonatomic, strong, readonly)NSString * title;

/**
 *  @brief 展现的时间,单位:秒
 */
@property(nonatomic, assign, readonly)NSInteger appearTime;

/**
 *  @brief 展现的图片地址
 */
@property(nonatomic, strong, readonly)NSString * imageURL;

/**
 *  @brief 图片的跳转地址
 */
@property(nonatomic, strong, readonly)NSString * jumpURL;

/**
 *  @brief 能否跳过
 */
@property(nonatomic, assign, readonly)BOOL isJump;

/**
 *  @brief 要收集的信息
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoVisitorMessageModel *> * visitorMessages;

/**
 *  @brief 是否显示问答
 */
@property(nonatomic, assign)BOOL isShow;

DWVideoVisitorMessageModel数据及含义如下:

/**
 *  @brief 收集信息含义
 */
@property(nonatomic, strong, readonly)NSString * visitorMes;

/**
 *  @brief 收集信息提示
 */
@property(nonatomic, strong, readonly)NSString * visitorTip;

1.12 课堂练习

课堂练习数据为DWVodVideoModel对象的exercises。

DWVideoExercisesModel数据及含义如下:

/**
 *  @brief 课堂练习id
 */
@property(nonatomic, strong, readonly)NSString * exercisesId;

/**
 *  @brief 标题
 */
@property(nonatomic, strong, readonly)NSString * title;

/**
 *  @brief 展现的时间,单位:秒
 */
@property(nonatomic, assign, readonly)NSInteger showTime;

/**
 *  @brief 是否允许跳过
 */
@property(nonatomic, assign, readonly)BOOL isJump;

/**
 *  @brief 答错是否可以继续播放
 */
@property(nonatomic, assign, readonly)BOOL isPlay;

/**
*  @brief 课堂练习回看时间点
*/
@property(nonatomic, assign, readonly)NSInteger backSecond;

/**
 *  @brief 课堂练习包含的问题列表
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoExercisesQuestionModel *> * questions;

/**
 *  @brief 是否显示课堂练习
 */
@property(nonatomic, assign)BOOL isShow;

DWVideoExercisesQuestionModel数据及含义如下:

/**
 *  @brief 问题id
 */
@property(nonatomic, strong, readonly)NSString * questionId;

/**
 *  @brief 问题解释内容
 */
@property(nonatomic, strong, readonly)NSString * explainInfo;

/**
*  @brief 问题回看时间点
*/
@property(nonatomic, assign, readonly)NSInteger backSecond;

/**
 *  @brief 问题类型,0:单选 1:多选 2:填空
 */
@property(nonatomic, assign, readonly)NSInteger type;

/**
 *  @brief 问题的标题(填空题的前半段)
 */
@property(nonatomic, strong, readonly)NSString * content;

/**
 *  @brief 问题的标题(填空题后半段,选择题是为nil)
 */
@property(nonatomic, strong, readonly)NSString * content2;

/**
 *  @brief 问题的答案
 */
@property(nonatomic, strong, readonly)NSArray <DWVideoExercisesQuestionAnswerModel *> * answers;

/**
 *  @brief 此问题是否已经作答,YES:已答 NO:未答。注意:选择题,选项选中即为已答。填空题,内容填写即为已答
 */
@property(nonatomic, assign, readonly)BOOL isReply;

/**
 *  @brief 是否答对
 */
@property(nonatomic, assign, readonly)BOOL isCorrect;

/**
 *  @brief 问题正确率
 */
@property(nonatomic, assign)NSInteger accuracy;

DWVideoExercisesQuestionAnswerModel数据及含义如下:

/**
 *  @brief 课堂练习问题答案id
 */
@property(nonatomic, strong, readonly)NSString * answerId;

/**
 *  @brief 是否是正确选项
 */
@property(nonatomic, assign, readonly)BOOL isRight;

/**
 *  @brief 选择题:选项的内容,填空题:正确答案
 */
@property(nonatomic, strong, readonly)NSString * content;

/**
 *  @brief 选择题是否选中
 */
@property(nonatomic, assign)BOOL isSelect;

/**
 *  @brief 填空题填写内容
 */
@property(nonatomic, strong)NSString * answerContent;

1.13 视频投屏

1.13.1 投屏设备的搜索

DWUPnPSearch是设备搜索类,负责搜索可投放视频的设备。

具体的属性及方法如下:

/**
 *  @brief 代理
 */
@property (nonatomic, weak) id<DWUPnPSearchDelegate>delegate;

/*!
 * @method
 * @abstract 开始搜索设备
 * @discussion 开始搜索设备
 */
-(void)start;

/*!
 * @method
 * @abstract 重新搜索设备
 * @discussion 重新搜索设备
 */
-(void)refresh;

/*!
 * @method
 * @abstract 销毁对象
 * @discussion 销毁对象
 */
-(void)destroy;

DWUPnPSearchDelegate方法如下:

/** 搜索结果
 @param devices 设备数组
 */
-(void)upnpSearchChangeWithResults:(NSArray <DWUPnPDevice *>*)devices;

@optional
/** 搜索失败
 @param error 错误信息
 */
-(void)upnpSearchErrorWithError:(NSError *)error;

1.13.2 投屏以及控制设备的事件

DWUPnPRenderer是设备控制类,可以控制设备的播放链接,开始暂停等等一些列功能。

DWUPnPRenderer的具体属性与方法如下:

/**
 *  @brief 设备model
 */
@property(nonatomic,strong)DWUPnPDevice * model;

/**
 *  @brief 代理
 */
@property(nonatomic,strong)id <DWUPnPResponseDelegate> delegate;

/*!
 * @method
 * @abstract 初始化
 * @discussion 初始化
 * @param model 搜索得到的UPnPModel
 * @result DWUPnPRenderer对象
 */
-(instancetype)initWithModel:(DWUPnPDevice *)model;

/*!
 * @method
 * @abstract 获取播放进度,可通过协议回调使用
 * @discussion 获取播放进度,可通过协议回调使用
 */
-(void)getPositionInfo;

/*!
 * @method
 * @abstract 获取播放状态,可通过协议回调使用
 * @discussion 获取播放状态,可通过协议回调使用
 */
-(void)getTransportInfo;

/*!
 * @method
 * @abstract 获取音频,可通过协议回调使用
 * @discussion 获取音频,可通过协议回调使用
 */
-(void)getVolume;

/*!
 * @method
 * @abstract 设置投屏地址
 * @discussion 设置投屏地址
 * @param urlStr 视频url
 */
-(void)setAVTransportURL:(NSString *)urlStr;

/*!
 * @method
 * @abstract 设置下一个播放地址
 * @discussion 设置下一个播放地址
 * @param urlStr 下一个视频url
 */
-(void)setNextAVTransportURI:(NSString *)urlStr;

/*!
 * @method
 * @abstract 播放
 * @discussion 播放
 */
-(void)play;

/*!
 * @method
 * @abstract 暂停
 * @discussion 暂停
 */
-(void)pause;

/*!
 * @method
 * @abstract 结束
 * @discussion 结束
 */
-(void)stop;

/*!
 * @method
 * @abstract 下一个
 * @discussion 下一个
 */
-(void)next;

/*!
 * @method
 * @abstract 前一个
 * @discussion 前一个
 */
-(void)previous;

/*!
 * @method
 * @abstract 跳转进度
 * @discussion 跳转进度
 * @param relTime 进度时间(单位秒)
 */
-(void)seek:(float)relTime;

/*!
 * @method
 * @abstract 跳转至特定进度或视频
 * @discussion 跳转至特定进度或视频
 * @param target 目标值,可以是 00:02:21 格式的进度或者整数的 TRACK_NR
 * @param unit REL_TIME(跳转到某个进度)或 TRACK_NR(跳转到某个视频)
 */
-(void)seekToTarget:(NSString *)target Unit:(NSString *)unit;

/*!
 * @method
 * @abstract 设置音频值
 * @discussion 设置音频值
 * @param value 值,整数
 */
-(void)setVolumeWith:(NSString *)value;

DWUPnPResponseDelegate对应DWUPnPRenderer的事件回调,设置成功后会被调用。以下是具体的方法含义:

@required

/** 设置url响应
 */
-(void)upnpSetAVTransportURIResponse;

/** 获取播放状态
 @param info 返回数据
 */
-(void)upnpGetTransportInfoResponse:(DWUPnPTransportInfo *)info;

@optional
/** 未定义的响应/错误
 @param resXML  响应XML
 @param postXML 请求的动作
 */
-(void)upnpUndefinedResponse:(NSString *)resXML postXML:(NSString *)postXML;

/** 播放响应
 */
-(void)upnpPlayResponse;

/** 暂停响应
 */
-(void)upnpPauseResponse;

/** 停止投屏
 */
-(void)upnpStopResponse;

/** 跳转响应
 */
-(void)upnpSeekResponse;

/** previous响应
 */
-(void)upnpPreviousResponse;

/** next响应
 */
-(void)upnpNextResponse;

/** 设置音量响应
 */
-(void)upnpSetVolumeResponse;

/** 设置下一个url响应
 */
-(void)upnpSetNextAVTransportURIResponse;

/** 获取音量信息
 @param info 音量信息
 */
-(void)upnpGetVolumeResponse:(NSString *)volume;

/** 获取播放进度
 @param info 返回数据
 */
-(void)upnpGetPositionInfoResponse:(DWUPnPAVPositionInfo *)info;

DWUPnPDevice设备类,包含了一些设备的属性。以下是属性及含义:

/**
 *  @brief 设备ID
 */
@property(nonatomic,copy)NSString * uuid;

/**
 *  @brief 设备loactionURL
 */
@property(nonatomic,strong)NSURL * loaction;

/**
 *  @brief 设备地址
 */
@property(nonatomic,copy)NSString * URLHeader;

/**
 *  @brief 友好的设备名称
 */
@property(nonatomic,copy)NSString * friendlyName;

/**
 *  @brief 设备名称
 */
@property(nonatomic,copy)NSString * modelName;

/**
 *  @brief DWServiceModel对象
 */
@property(nonatomic,strong)DWServiceModel * AVTransport;

/**
 *  @brief DWServiceModel对象
 */
@property(nonatomic,strong)DWServiceModel * RenderingControl;

1.13.3 接收投屏设备的回调

DWUPnPSubscription是设备订阅类,主要负责订阅设备以及接收设备事件。

具体的方法及含义如下:

/**
 *  @brief 设备model
 */
@property(nonatomic,strong)DWUPnPDevice *model;

/**
 *  @brief 代理
 */
@property(nonatomic,weak)id <DWUPnPSubscriptionDelegate> delegate;

/**
 * @method
 * @abstract 初始化
 * @discussion 初始化
 * @param model 搜索得到的UPnPModel
 * @return DWUPnPSubscription对象
 */
-(instancetype)initWithModel:(DWUPnPDevice *)model;

/**
 * @method
 * @abstract 开始订阅
 * @discussion 开始订阅
 */
-(void)startSubscribe;

/**
 * @method
 * @abstract 结束订阅
 * @discussion 结束订阅
 */
-(void)cancelSubscribe;

DWUPnPSubscriptionDelegate是接收到回调事件,以下是它方法的具体含义:

/** 视频传输中
 */
-(void)upnpSubscriptionTransition;

/** 设备播放投屏
 */
-(void)upnpSubscriptionPlay;

/** 设备暂停投屏
 */
-(void)upnpSubscriptionPause;

/** 设备退出投屏
 */
-(void)upnpSubscriptionStop;

/** error回调
 @param error 错误信息
 */
-(void)upnpSubscriptionWithError:(NSError *)error;

1.14 视频弹幕

1.14.1 视频弹幕类的说明

DWBarrageManager是SDK中的弹幕管理类,负责弹幕的获取及发送。

/**
 *  @brief 视频id
 */
@property(nonatomic,copy)NSString * videoId;

/**
 *  @brief 代理
 */
@property(nonatomic,weak)id <DWBarrageManagerDelegate> delegate;

/*!
 * @method
 * @abstract 设置当前播放时间
 * @discussion 设置当前播放时间
 * @param time 当前播放时间
 */
-(void)associationWithTimeDidChange:(float)time;

/*!
 * @method
 * @abstract 发送弹幕
 * @discussion 发送弹幕
 * @param barrageModel 弹幕模型
 */
-(void)sendBarrageWithBarrageModel:(DWBarrageModel *)barrageModel;

/*!
 * @method
 * @abstract 销毁进行中的请求
 * @discussion 只对获取弹幕请求有效,发送弹幕的请求不会被销毁。
 */
-(void)cancelRequest;

DWBarrageManagerDelegate方法如下:

/** 收到弹幕响应回调
 @param barrageManager 自身对象
 @param barrageList 字幕列表
 @param error 错误信息
 */
-(void)getBarrageManager:(DWBarrageManager *)barrageManager BarrageList:(NSArray <DWBarrageModel *> *)barrageList WithError:(NSError *)error;

/** 发送弹幕回调
 @param barrageManager 自身对象
 @param sendBarrageModel 字幕模型
 @param error 错误信息
 */
-(void)sendBarrageManager:(DWBarrageManager *)barrageManager BarrageModel:(DWBarrageModel *)sendBarrageModel WithError:(NSError *)error;

每一条弹幕对应一个DWBarrageModel对象,具体的含义如下:

/**
 *  @brief 字幕内容
 */
@property(nonatomic,strong,readonly)NSString * content;

/**
 *  @brief 字幕颜色
 */
@property(nonatomic,strong,readonly)NSString * fc;

/**
 *  @brief 播放时间点,单位:毫秒
 */
@property(nonatomic,assign,readonly)NSInteger pt;

/*!
 * @method
 * @abstract 初始化方法
 * @discussion 初始化方法
 * @param content 字幕内容
 * @param fc 字幕颜色,eg:0xffffff
 * @param pt 弹幕时间,单位毫秒
 * @result DWBarrageModel对象
 */
-(instancetype)initWithContent:(NSString *)content Fc:(NSString *)fc Pt:(NSInteger)pt;

1.14.2 视频弹幕的获取

1.初始化DWBarrageManager对象,并设置delegate。

-(DWBarrageManager *)barrageManager
{
    if (!_barrageManager) {
        _barrageManager = [[DWBarrageManager alloc]init];
        _barrageManager.delegate = self;
    }
    return _barrageManager;;
}

2.关联videoId 在设置DWVodVideoModel/DWDownloadModel对象时,关联videoId。

//关联在线视频videoId
-(void)setVodVideo:(DWVodVideoModel *)videoModel
{
    ......
    
   //设置videoId,关联弹幕
    self.barrageManager.videoId = self.videoModel.videoId;
    
    ......
}
//关联离线视频videoId
-(void)playLocalVideo:(DWDownloadModel *)downloadModel
{
	    ......
	
    //设置videoId,关联弹幕
    self.barrageManager.videoId = self.downloadModel.videoId;

      ......
}

3.关联播放时间点 在DWPlayerView播放进度回调中,同步播放时间。

- (void)videoPlayer:(DWPlayerView *)playerView timeDidChange:(float)time
{
     ......

    //SDK关联当前播放时间
    [self.barrageManager associationWithTimeDidChange:time];
    //弹幕加载
    [self addNewBarrageWithTime:time];

     ......
}

4.收到DWBarrageManagerDelegate回调。

/** 收到弹幕响应回调
 @param barrageManager 自身对象
 @param barrageList 字幕列表
 @param error 错误信息
 */
-(void)getBarrageManager:(DWBarrageManager *)barrageManager BarrageList:(NSArray <DWBarrageModel *> *)barrageList WithError:(NSError *)error
{    
    if (error) {
        return;
    }
    
    self.barragesArray = barrageList;
}

1.14.3 视频弹幕的发送

初始化及关联videoId同1.14.2中的前两步。 1.点击弹幕发送按钮,通过内容,颜色,及发送时间初始化DWBarrageModel对象。

-(void)barrageBgViewSendWithContent:(NSString *)content Fc:(NSString *)fc
{
    if (!self.readyToPlay) {
        [@"正在加载视频,请稍后" showAlert];
        return;
    }
    
    //发送弹幕
    //初始化弹幕模型
    DWBarrageModel * barrageModel = [[DWBarrageModel alloc]initWithContent:content Fc:fc Pt:(NSInteger)(self.currentPlayDuration * 1000)];
    
    //调用方法,发送弹幕
    [self.barrageManager sendBarrageWithBarrageModel:barrageModel];    
}

2.收到DWBarrageManagerDelegate回调。

/** 发送弹幕回调
 @param barrageManager 自身对象
 @param sendBarrageModel 字幕模型
 @param error 错误信息
 */
-(void)sendBarrageManager:(DWBarrageManager *)barrageManager BarrageModel:(DWBarrageModel *)sendBarrageModel WithError:(NSError *)error
{
    if (error) {
        //error存在,证明弹幕发送失败
        [NSString stringWithFormat:@"发送失败 %@",error.localizedDescription];
        return;
    }
    
    [self.barrageBgView clearTextField];
    
    //加载自己发送的弹幕
    [self setBarrageWithModel:sendBarrageModel Send:YES];
 }

1.15 动感视频

视频播放过程中,在某一时间点触发震动反馈,以实现重点信息提醒以及增强互动性的目的。

//触发震动的具体实现
-(void)showImpactView:(CGFloat)time
{
    if (IS_PAD) {
        return;
    }
    
    if (!self.allowImpact) {
        return;
    }
    
    if (!self.videoModel) {
        return;
    }
    
    if (!self.impactRemindView) {
        return;
    }
    
    //判断是否有视频打点,触发震动及提示文字
    for (DWVideoMarkModel * videoMarkModel in self.videomarkArray) {
        if (videoMarkModel.marktime == (NSInteger)time) {
            //触发提示文字
            [self.impactRemindView show];
            //触发震动反馈效果
            [self.playerView shockFeedback];
            break;
        }
    }
}

1.16 自定义LOGO

播放视频时,可以根据不同的设置,来显示不同的logo。

1.16.1 自定义LOGO类的说明

//自定义视频LOGO
@interface DWVideoLogoModel : NSObject

/**
 *  @brief 资源地址URL,必填。支持网络URL,本地URL,支持jpg/jpeg/png/gif格式
 */
@property(nonatomic, strong)NSURL * url;

/**
 *  @brief 下载到本地Logo资源路径
 */
@property(nonatomic, strong, readonly)NSString * filePath;

/**
 *  @brief logo坐标百分比,选填,默认值左上角(0.1,0.1)
 */
@property(nonatomic, assign)CGPoint logoOrigin;

/**
 *  @brief logo大小,相对于DWPlayerView对象size的百分比,选填,默认(0.1,0.1)
 */
@property(nonatomic, assign)CGSize logoSize;

@end

1.16.2 自定义LOGO功能的使用

1.在线视频设置自定义LOGO

   //1.生成DWVideoLogoModel对象
   DWVideoLogoModel * videoLogo = [[DWVideoLogoModel alloc]init];
   videoLogo.url = [NSURL URLWithString:@"网络资源地址"];
   //videoLogo.url = [NSURL fileURLWithPath:@"本地资源地址"];
   videoLogo.logoOrigin = CGPointMake(0, 0);
   videoLogo.logoSize = CGSizeMake(0.2, 0.2);
   //2.设置DWPlayerView对象的videoLogo属性
   self.playerView.videoLogo = videoLogo;

2.离线视频设置自定义LOGO

   //1.创建DWDownloadModel对象以后,调用insertVideoLogoWithDownloadModel: VideoLogo:方法关联自定义LOGO
   DWVideoLogoModel * videoLogo = [[DWVideoLogoModel alloc]init];
   videoLogo.url = [NSURL URLWithString:@"网络资源地址"];
   //videoLogo.url = [NSURL fileURLWithPath:@"本地资源地址"];
   videoLogo.logoOrigin = CGPointMake(0, 0);
   videoLogo.logoSize = CGSizeMake(0.2, 0.2);
  //关联DWVideoLogoModel对象,会自动下载设置的LOGO对象
  [[DWDownloadSessionManager manager insertVideoLogoWithDownloadModel:model VideoLogo:videoLogo];
  //2.播放时,调用DWPlayerView对象的playLocalVideo:方法即可显示已下载的LOGO。

1.17 视频封面图

加载admin后台设置的视频封面图片,使用方式如下:

   1.视频封面图片的地址在DWVodVideoModel对象中,img属性。

   2.在合适的位置,添加及删除展示的封面图信息
   
-(void)loadImgWithURL:(NSString *)imgUrl
{
    self.imgImageView.hidden = NO;

    //加载图片
    //同一个视频,封面图片的地址不会改变,如果使用SDWebImage等第三方框架加载图片,要注意图片缓存的问题。
    dispatch_async(dispatch_queue_create("PLAYERIMGDOWNLOAD", NULL), ^{
        NSData * imgData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imgUrl]];
        if (!imgData) {
            return;
        }
        UIImage * img = [UIImage imageWithData:imgData];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (!_imgImageView) {
                return;
            }
            self.imgImageView.image = img;
        });
    });
    
}

-(void)removeImg
{
    self.imgImageView.hidden = YES;
    self.imgImageView.image = nil;
}

1.18知识点功能

使用知识点功能如下: self.playerView = [[DWVodPlayerView alloc]initWithKnowledgeData:dict]; 初始化 视频播放器的时候传入一个字典,字典数据结构必须保持和demo中一致。 具体内容可以参考demo:

2.下载功能

2.1 下载功能的快速集成,请详见2.集成指南

2.2 DWDownloadSessionManager的使用

DWDownloadSessionManager是下载管理类,所有有关下载的操作,都是通过此对象来进行的。可根据自己的业务逻辑,来自行修改下载相关的设置。

以下是具体的属性及方法:

/**
 *  @brief 下载任务队列
 */
@property(nonatomic,strong,readonly)NSArray <DWDownloadModel *> * downloadModelList;

/**
 *  @brief 代理
 */
@property(nonatomic,weak)id<DWDownloadSessionDelegate> delegate;

/**
  注意:修改下载设置后,对已经存在的下载任务可能无效,请清空下载任务之后修改设置
 */

/**
 *  @brief 是否允许使用移动流量 YES支持 NO不支持 默认支持
 */
@property(nonatomic,assign)BOOL allowsCellular;

/**
 *  @brief 全部并发,默认YES, 当YES时,忽略maxDownloadCount
 */
@property(nonatomic,assign)BOOL isBatchDownload;

/**
 *  @brief 允许同时下载的最大并发数,默认为1,最大为4
 */
@property(nonatomic,assign)NSInteger maxDownloadCount;

/**
 *  @brief 等待下载队列 先进先出 默认YES,当NO时,先进后出
 */
@property(nonatomic,assign)BOOL resumeDownloadFIFO;

/*!
 * @method
 * @abstract 初始化DWDownloadSessionManager
 * @discussion 初始化DWDownloadSessionManager
 * @result DWDownloadSessionManager对象
 */
+(DWDownloadSessionManager *)manager;

/*!
 * @method
 * @abstract 初始化DWDownloadModel
 * @discussion 初始化DWDownloadModel
 * @param videoMdoel 点播视频model,非空
 * @param quality 媒体品质,非空
 * @param othersInfo 自定义字段,可为空
 * @result 创建成功返回DWDownloadModel对象,如果失败,返回nil
 */
+(DWDownloadModel *)createDownloadModel:(DWVodVideoModel *)videoMdoel Quality:(NSString *)quality AndOthersInfo:(nullable NSDictionary *)othersInfo;

/*!
 * @method
 * @abstract 插入自定义LOGO
 * @discussion 在startWithDownloadModel:方法前调用,否则会导致自定义水印无法正常下载
 * @param downloadModel DWDownloadModel对象
 * @param videoLogo 自定义水印对象
 * @result 插入成功返回YES,失败返回NO
 */
-(BOOL)insertVideoLogoWithDownloadModel:(DWDownloadModel *)downloadModel VideoLogo:(DWVideoLogoModel *)videoLogo;

/*!
 * @method
 * @abstract 开始下载任务
 * @discussion 开始下载任务
 * @param downloadModel DWDownloadModel对象
 */
-(void)startWithDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 开始下载任务
 * @discussion 所有回调均已回到主线程中
 * @param downloadModel DWDownloadModel对象
 * @param progress 下载进度回调
 * @param state 下载状态变动回调
 */
-(void)startWithDownloadModel:(DWDownloadModel *)downloadModel progress:(DWDownloadProgressBlock)progress state:(DWDownloadStateBlock)state;

/*!
 * @method
 * @abstract 暂停下载任务
 * @discussion 暂停下载任务
 * @param downloadModel DWDownloadModel对象
*/
-(void)suspendWithDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 恢复下载任务
 * @discussion 恢复下载任务
 * @param downloadModel DWDownloadModel对象
 */
-(void)resumeWithDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 删除下载任务以及本地缓存
 * @discussion 删除下载任务以及本地缓存
 * @param downloadModel DWDownloadModel对象
 */
-(void)deleteWithDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 暂停全部任务
 * @discussion 暂停全部任务
 */
-(void)suspendAllDownloadModel;

/*!
 * @method
 * @abstract 删除全部任务
 * @discussion 删除全部任务
 */
-(void)deleteAllDownloadModel;

/*!
 * @method
 * @abstract 获取下载模型
 * @discussion 获取下载模型
 * @param URLString 下载地址
 * @result DWDownloadModel对象
 */
-(DWDownloadModel *)downLoadingModelForURLString:(NSString *)URLString;

/*!
 * @method
 * @abstract 判断当前资源是已在下载队列中
 * @discussion 判断当前资源是已在下载队列中
 * @param videoId 视频id,非空
 * @param quality 媒体品质,非空
 * @result 查询结果
 */
-(BOOL)checkLocalResourceWithVideoId:(NSString *)videoId WithQuality:(NSString *)quality;

/*!
 * @method
 * @abstract 判断downloadModel下载链接是否有效
 * @discussion 下载链接具有时效性,若超时,请调用reStartDownloadUrlWithNewUrlString:AndDownloadModel:方法
 * @param downloadModel DWDownloadModel对象
 * @result 查询结果
 */
-(BOOL)isValidateURLWithDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 根据新的下载地址,继续下载此任务
 * @discussion 下载链接超时时,调用此方法继续下载当前任务
 * @param newUrlString 新的下载地址
 * @param downloadModel DWDownloadModel对象
 */
-(void)reStartDownloadUrlWithNewUrlString:(NSString *)newUrlString AndDownloadModel:(DWDownloadModel *)downloadModel;

/*!
 * @method
 * @abstract 事件透传
 * @discussion 获取appdelegate,handleEventsForBackgroundURLSession事件回调
 * @param identifier identifier
 * @param completionHandler completionHandler
 */
-(void)setBackgroundSession:(NSString *)identifier CompletionHandler:(void (^)())completionHandler;

/*!
 * @method
 * @abstract 3.x.x升级4.x.x以上版本所使用的过渡方法
 * @discussion 若从3.x.x版本升级到4.x.x,会出现旧版本下载的音视频文件找不到的情况。
可以通过执行此方法,生成新版SDk的下载任务
 * @param loaclPath 对于已完成的任务,必填。对于未完成的任务,请务必传nil
 * @param downloadUrl 网络下载地址。对于未完成的任务,必填
 * @param mediaType 文件类型,1 视频 2 音频。若不填写,默认视频
 * @param quality 清晰度,若不填写,默认 10
 * @param desp 清晰度描述,若不填写,默认 标清
 * @param vrMode 是否是VR视频。默认 NO
 * @param othersInfo 自定义字段,根据自己需求适当添加,比如添加媒体图片,标题等
 * @param userId 用户ID,选填
 * @param videoId 视频ID,选填
 * @param totalBytesWritten 已下载的数量。对于未完成的任务,必填
 * @param totalBytesExpectedToWrite 文件的总大小。对于未完成的任务,必填
 * @result 若过渡成功,返回DWDownloadModel对象,否则返回nil
 */
-(DWDownloadModel *)migrateDownloadTask:(nullable NSString *)loaclPath
                            DownloadUrl:(nullable NSString *)downloadUrl
                              MediaType:(nullable NSString *)mediaType
                                Quality:(nullable NSString *)quality
                                   Desp:(nullable NSString *)desp
                                 VRMode:(BOOL)vrMode
                             OthersInfo:(nullable NSDictionary *)othersInfo
                                 UserId:(nullable NSString *)userId
                                VideoId:(nullable NSString *)videoId
                      TotalBytesWritten:(int64_t)totalBytesWritten
              TotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;

2.3 下载功能的回调

DWDownloadSessionManagerDelegate,方法说明如下:

/** 更新下载进度回调
 @param downloadModel 自身对象
 @param progress 下载进度
 */
-(void)downloadModel:(DWDownloadModel *)downloadModel didUpdateProgress:(DWDownloadProgress *)progress;

/** 更新下载状态/出现error时回调
 @param downloadModel 自身对象
 @param error 错误信息
 */
-(void)downloadModel:(DWDownloadModel *)downloadModel error:(NSError *)error;

/** 后台下载完成时回调
 */
-(void)downloadBackgroundSessionCompletion;

2.4 DWDownloadModel数据模型的使用

DWDownloadModel对象对应具体的下载任务。

以下是具体DWDownloadModel中,包含的字段及含义:

/**
 *  @brief 下载地址
 */
@property(nonatomic, strong, readonly)NSString * downloadURL;

/**
 *  @brief 文件名
 */
@property(nonatomic, strong, readonly)NSString * fileName;

/**
 *  @brief 存储路径
 */
@property(nonatomic, strong, readonly)NSString * filePath;

/**
 *  @brief 下载状态
 */
@property(nonatomic, assign, readonly)DWDownloadState state;

/**
 *  @brief 文件类型,1 视频 2 音频
 */
@property(nonatomic, strong, readonly)NSString * mediaType;

/**
 *  @brief 文件后缀名
 */
@property(nonatomic ,strong, readonly)NSString * mimeType;

/**
 *  @brief 清晰度
 */
@property(nonatomic, strong, readonly)NSString * quality;

/**
 *  @brief 清晰度描述
 */
@property(nonatomic, strong, readonly)NSString * desp;

/**
 *  @brief VR视频
 */
@property(nonatomic, assign, readonly)BOOL vrMode;

/**
 *  @brief resumeData
 */
@property(nonatomic, strong, readonly)NSData * resumeData;

/**
 *  @brief userId
 */
@property(nonatomic, strong, readonly)NSString * userId;

/**
 *  @brief 视频id
 */
@property(nonatomic, strong, readonly)NSString * videoId;

/**
 *  @brief 跑马灯数据
 */
@property(nonatomic, strong, readonly)NSString * marqueeStr;

/**
 *  @brief 字幕类型,-1 无字幕 ,0 subtitle, 1 subtitle2, 2 双语
 */
@property(nonatomic, assign, readonly)NSInteger defaultSubtitle;

/**
 *  @brief 字幕模式,-1 无字幕 ,0 固定字号, 1 自适应模式
 */
@property(nonatomic, assign, readonly)NSInteger subtitlemodel;

/**
 *  @brief 字幕1
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle;

/**
 *  @brief 字幕2
 */
@property(nonatomic, strong, readonly)DWVideoSubtitleModel * subtitle2;

/**
 *  @brief 自定义LOGO
 */
@property(nonatomic, strong, readonly)DWVideoLogoModel * videoLogo;

/**
 *  @brief 自定义字段,根据自己需求适当添加,比如添加媒体图片,标题等
 */
@property(nonatomic, strong)NSDictionary * othersInfo;

/**
 *  @brief 解压状态,非点播业务不需要关注此值。0 未解压,1 解压中,2 解压完成,3 解压失败
 */
@property(nonatomic, assign)NSInteger decompressionState;

/**
 *  @brief 下载进度
 */
@property(nonatomic, strong ,readonly)DWDownloadProgress *progress;

/**
 *  @brief 下载进度更新block
 */
@property(nonatomic, copy)DWDownloadProgressBlock progressBlock;

/**
 *  @brief 下载状态更新block
 */
@property(nonatomic, copy)DWDownloadStateBlock stateBlock;

以下是具体DWDownloadProgress中,包含的字段及含义:

/**
 *  @brief 续传大小
 */
@property(nonatomic, assign, readonly)int64_t resumeBytesWritten;

/**
 *  @brief 每次写入的数量
 */
@property(nonatomic, assign, readonly)int64_t bytesWritten;

/**
 *  @brief 已下载的数量
 */
@property(nonatomic, assign, readonly)int64_t totalBytesWritten;

/**
 *  @brief 文件的总大小
 */
@property(nonatomic, assign, readonly)int64_t totalBytesExpectedToWrite;

/**
 *  @brief 下载进度
 */
@property(nonatomic, assign, readonly)float progress;

/**
 *  @brief 下载速度
 */
@property(nonatomic, assign, readonly)float speed;

/**
 *  @brief 下载剩余时间
 */
@property(nonatomic, assign, readonly)int remainingTime;

2.5 批量下载功能

通过创建DWBatchDownloadUtility对象,来批量获取DWVodVideoModel对象,进行下载。

具体数据及相关方法如下:

/**
 *  @brief 媒体类型,1为视频 2为音频 0为视频+音频,若不传该参数默认为视频
 */
@property(nonatomic,copy)NSString *mediatype;

/**
 *  @brief 授权验证码,需要的话请设置,默认为空
 */
@property(nonatomic,copy)NSString *verificationCode;

//注意! 回调方法可能不在主线程中,如果在里面进行UI操作,请回到主线程中进行
/**
 *  @brief 全部视频数据获取出错
 */
@property(nonatomic,copy)BatchDownloadUtilityErrorBlock errorBlock;

/**
 *  @brief 视频数据获取完成
 */
@property(nonatomic,copy)BatchDownloadUtilityFinishBlock finishBlock;

/*!
 * @method
 * @abstract 初始化DWBatchDownloadUtility
 * @discussion 会对视频数据进行去重操作,如果传入数组中有重复的视频id或获取某个视频失败,可能会导致最后输出的视频数据长度跟传入的视频id的数量不一致
 * @param userId 用户ID,不能为nil
 * @param key 用户秘钥,不能为nil
 * @param videoIds 视频id数组,不能为nil。最多同时获取10个视频id的播放地址,超出10个按10个获取
 * @result DWBatchDownloadUtility对象
*/
-(instancetype)initWithUserId:(NSString *)userId key:(NSString *)key AndVideoIds:(NSArray *)videoIds;

/*!
 * @method
 * @abstract 开始获取批量下载数据
 * @discussion 开始获取批量下载数据
 */
-(void)start;

3.上传功能

注意事项:通常情况下,不可对同一视频多次使用第一种初始化方式初始化上传,这样会造成大量重复视频,增加你后期管理视频的同事的工作量,且获得场景视频会根据你的付费套餐对每天的上传次数有不同的限制,超过最大上传次数,当天便无法上传视频。

3.1 上传功能的快速集成,请详见2.集成指南

初始化DWUploader对象,调用start方法,即可开始上传视频。

3.2 DWUploadSessionManager的使用

DWUploadSessionManager是上传管理类,所有有关上传的操作,都是通过此对象来进行的。可根据自己的业务逻辑,来自行修改上传相关的设置。

以下是具体的属性及方法:

/**
 *  @brief 上传数据列表
 */
@property(nonatomic,strong,readonly)NSArray <DWUploadModel *> * uploadModelList;

/**
 *  @brief 代理
 */
@property(nonatomic,weak) id <DWUploadSessionManagerDelegate> delegate;

/*!
 * @method
 * @abstract 初始化DWUploadSessionManager
 * @discussion 初始化DWUploadSessionManager
 * @result DWUploadSessionManager对象
 */
+(DWUploadSessionManager *)manager;

/*!
 * @method
 * @abstract 初始化上传对象
 * @discussion 初始化上传对象
 * @param userId 用户ID,不能为nil
 * @param apikey 用户秘钥,不能为nil
 * @param title 视频标题,不能为nil
 * @param description 视频描述
 * @param tag 视频标签
 * @param videoPath 视频路径,不能为nil
 * @param categoryId 视频分类
 * @param notifyURL 通知URL
 * @result DWUploadModel对象
 */
+(DWUploadModel *)createUploadModelWithUserId:(NSString *)userId
                                       Apikey:(NSString *)apikey
                                   VideoTitle:(NSString *)title
                             VideoDescription:(nullable NSString *)description
                                     VideoTag:(nullable NSString *)tag
                                    VideoPath:(NSString *)videoPath
                                   CategoryId:(nullable NSString *)categoryId
                                    NotifyURL:(nullable NSString *)notifyURL;

/*!
 * @method
 * @abstract 添加视频水印
 * @discussion 请在调用startWithUploadModel:方法前设置,否则不生效
 * @param uploadModel DWUploadModel对象
 * @param text 水印文字内容, 1-50个字符,数字、字母、汉字,不填写则文字水印不生效
 * @param corner 水印位置0,左上 1右上 2左下 3右下,默认3,非必填
 * @param offsetX X轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
 * @param offsetY Y轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
 * @param fontFamily 字体类型:0,微软雅黑 1宋体 2黑体,默认0,非必填
 * @param fontSize 字体大小,[0-100],默认12
 * @param fontColor 16进制字体颜色,如#FFFFFF,不能写#号,默认灰色D3D3D3,非必填
 * @param fontAlpha 透明度,[0-100],默认100,100为不透明,非必填
 * @result 返回结果
 */
-(BOOL)insertWaterMarkWithUploadModel:(DWUploadModel *)uploadModel
                                 Text:(NSString *)text
                               Corner:(NSNumber *)corner
                              OffsetX:(NSNumber *)offsetX
                              OffsetY:(NSNumber *)offsetY
                           FontFamily:(NSNumber *)fontFamily
                             FontSize:(NSNumber *)fontSize
                            FontColor:(NSString *)fontColor
                            FontAlpha:(NSNumber *)fontAlpha;

/*!
 * @method
 * @abstract 保存视频文件
 * @discussion 保存SDK所使用的视频文件,以供上传使用
 * @param videoPath 视频文件路径
 * @result SDK所需文件路径
 */
-(NSString *)moveToLocalWithVideoPath:(NSString *)videoPath;

/*!
 * @method
 * @abstract 开始上传任务
 * @discussion 开始上传任务
 * @param uploadModel DWUploadModel对象
 */
-(void)startWithUploadModel:(DWUploadModel *)uploadModel;

/*!
 * @method
 * @abstract 暂停上传任务
 * @discussion 暂停上传任务
 * @param uploadModel DWUploadModel对象
 */
-(void)suspendWithUploadModel:(DWUploadModel *)uploadModel;

/*!
 * @method
 * @abstract 继续上传任务
 * @discussion 继续上传任务
 * @param uploadModel DWUploadModel对象
 */
-(void)resumeWithUploadModel:(DWUploadModel *)uploadModel;

/*!
 * @method
 * @abstract 删除上传任务
 * @discussion 删除上传任务
 * @param uploadModel DWUploadModel对象
 */
-(void)deleteWithUploadModel:(DWUploadModel *)uploadModel;

/*!
 * @method
 * @abstract 事件透传
 * @discussion 获取appdelegate,handleEventsForBackgroundURLSession事件回调
 * @param identifier identifier
 * @param completionHandler completionHandler
 */
-(void)setUploadSession:(NSString *)identifier CompletionHandler:(void (^)())completionHandler;

3.3 上传功能的回调

DWUploadSessionManagerDelegate,方法说明如下:

/** 开始上传
 @param uploadModel 自身对象
 */
-(void)uploadSessionManagerBeginWithUploadModel:(DWUploadModel *)uploadModel;

/** 更新上传状态
 @param uploadModel 自身对象
 @param state 上传状态
 */
-(void)uploadSessionManagerUploadModel:(DWUploadModel *)uploadModel WithState:(DWUploadState)state;

/** 更新上传进度
 @param uploadModel 自身对象
 @param totalBytesSent 已上传文件大小
 @param expectedToSend 总文件大小
 */
-(void)uploadSessionManagerUploadModel:(DWUploadModel *)uploadModel totalBytesSent:(int64_t)totalBytesSent WithExpectedToSend:(int64_t)expectedToSend;

/** 上传失败回调
 @param uploadModel 自身对象
 @param error 错误信息
 */
-(void)uploadSessionManagerUploadModel:(DWUploadModel *)uploadModel WithError:(NSError *)error;

/** 后台任务完成时回调
 */
-(void)uploadBackgroundSessionCompletion;

3.4 DWUploadModel数据模型的使用

DWUploadModel对象对应具体的上传任务。

以下是具体DWUploadModel中,包含的字段及含义:

/**
 *  @brief 上传状态
 */
@property(nonatomic,assign,readonly)DWUploadState state;

/**
 *  @brief 视频标题
 */
@property(nonatomic,strong,readonly)NSString * title;

/**
 *  @brief 视频tag
 */
@property(nonatomic,strong,readonly)NSString * tag;

/**
 *  @brief 视频描述信息
 */
@property(nonatomic,strong,readonly)NSString * desc;

/**
 *  @brief 视频分类
 */
@property(nonatomic,strong,readonly)NSString * categoryId;

/**
 *  @brief 上传进度
 */
@property(nonatomic,assign,readonly)CGFloat progress;

/**
 *  @brief 上传文件总字节数
 */
@property(nonatomic,assign,readonly)int64_t fileSize;

/**
 *  @brief 已上传字节数
 */
@property(nonatomic,assign,readonly)int64_t totalSentBytes;

/**
 *  @brief 本次发送字节数
 */
@property(nonatomic,assign,readonly)int64_t sentBytes;

/**
 *  @brief 自定义参数
 */
@property(nonatomic,copy)NSDictionary * otherInfo;

/**
 *  @brief 视频id
 */
@property(nonatomic,strong,readonly)NSString * videoId;

/**
 *  @brief 视频回调地址
 */
@property(nonatomic,strong,readonly)NSString * notifyURL;

/**
 *  @brief 是否裁剪 @"1"为裁剪 @“0”不裁剪 不设置默认为不裁剪
 */
@property(nonatomic,copy)NSString * isCrop;

/**
 *  @brief ew
 */
@property(nonatomic,copy)NSString * ew;

/**
 *  @brief 账号id
 */
@property(nonatomic,strong,readonly)NSString * userId;

/**
 *  @brief 视频水印
 */
@property(nonatomic,strong,readonly)DWUploadWaterMarkModel * waterMark;

以下是具体DWUploadWaterMarkModel中,包含的字段及含义:

/**
 *  @brief 水印文字内容, 1-50个字符,数字、字母、汉字,不填写则文字水印不生效
 */
@property(nonatomic,strong,readonly)NSString * text;

/**
 *  @brief 水印位置0,左上 1右上 2左下 3右下,默认3,非必填
 */
@property(nonatomic,strong,readonly)NSNumber * corner;

/**
 *  @brief X轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
 */
@property(nonatomic,strong,readonly)NSNumber * offsetX;

/**
 *  @brief Y轴偏移像素值,要求大于0,默认值5,超出视频大小按默认值,非必填
 */
@property(nonatomic,strong,readonly)NSNumber * offsetY;

/**
 *  @brief 字体类型:0,微软雅黑 1宋体 2黑体,默认0,非必填
 */
@property(nonatomic,strong,readonly)NSNumber * fontFamily;

/**
 *  @brief 字体大小,[0-100],默认12
 */
@property(nonatomic,strong,readonly)NSNumber * fontSize;

/**
 *  @brief 16进制字体颜色,如#FFFFFF,不能写#号,默认灰色D3D3D3,非必填
 */
@property(nonatomic,strong,readonly)NSString * fontColor;

/**
 *  @brief 透明度,[0-100],默认100,100为不透明,非必填
 */
@property(nonatomic,strong,readonly)NSNumber * fontAlpha;

4.Demo的注意事项

Demo是使用SDK对接获得场景视频视频云的示例源码,Demo的设计旨在展示SDK各项功能的使用方法,Demo中的逻辑仅供参考,如果希望应用获得更好的使用体验,请根据自己的需求更改。

注意:仅可默认体验播放、下载相关的功能,若需进行上传功能的测试,请查看4.3。

4.1 默认播放列表

我们提供了一些视频数据,用户在运行demo以后,无需进行额外的设置,即可体验我们SDK的功能。

4.2 自定义播放列表

若默认播放列表不能满足需求,可通过修改网络请求或者使用本地数据的方式来修改播放列表。具体修改方式如下。

4.2.1 修改userId和APIKey

无论是通过哪种方式来修改播放列表,首先,都需要修改demo中的userId跟APIKey。请找到DWConfigurationManager.m文件,修改DWAccount_userId,DWAccount_apikey属性值即可。例:

self.DWAccount_userId = @"****************";
self.DWAccount_apikey = @"********************************";

4.2.2 网络数据获取播放列表

用户可通过修改demo中网络请求URL的方式,来修改播放列表中的数据。

//第一步 找到DWMainViewController.m 中的VIDEOINFOURL,并修改URL。
#define VIDEOINFOURL     @"https://****************"

//第二步 reloadNetworkData方法中,根据修改的URL获取数据,进行解析,赋值即可。
-(void)reloadNetworkData
{
    NSURLSession * session = [NSURLSession sharedSession];
    NSURL * url = [NSURL URLWithString:VIDEOINFOURL];
    
    NSURLSessionDataTask * task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        if (error) {
            return;
        }
        
        //根据接口,解析出需要使用的video数据数组。
        NSArray * vodList = ...
        //这里根据返回数据,自行对DWVodModel对象赋值即可。
        for (NSDictionary * vodDict in vodList) {
            DWVodModel * vodModel = [[DWVodModel alloc]init];
            vodModel.videoId = @"视频ID";
            vodModel.title = @"视频标题";
            vodModel.time = @"视频时长";
            vodModel.imageUrl = @"图片地址";
            [self.videoList addObject:vodModel];
        }
        
        dispatch_async(dispatch_get_main_queue(), ^{
            DWVodModel * vodModel = self.videoList.firstObject;
            [self.headerImageView sd_setImageWithURL:[NSURL URLWithString:vodModel.imageUrl] placeholderImage:[UIImage imageNamed:@"icon_placeholder.png"]];
            [self.collectionView reloadData];
        });
    }];
    
    [task resume];
}

4.2.3 本地数据获取播放列表

用户也可不通过网络请求,通过修改本地数据来修改播放列表。

若需要替换自己的VideoId,请在DWMainViewController.m中,注释掉网络请求的方法,并在reloadLoaclData方法中,自行填写的videoId,以及需要的展示数据即可。

- (void)viewDidLoad {
//    [self reloadNetworkData];
      [self reloadLoaclData];
}

-(void)reloadLoaclData
{
    //请自行替换数据
    NSArray * videos =  @[@"********************************",@"********************************",...];
    for (int i = 0; i < videos.count; i++) {
        DWVodModel * vodModel = [[DWVodModel alloc]init];
        vodModel.videoId = [videos objectAtIndex:i];
        vodModel.title = @"展示title";
        vodModel.time = @"展示time";
        vodModel.imageUrl = @"展示图片地址";
        [self.videoList addObject:vodModel];
    }
    
    [self.collectionView reloadData];
}

4.3 上传功能的使用

demo中提供的默认账号并无上传功能,若需体验SDK中的上传功能,请在选择完视频之后,填写账号下的userId,以及APIKey等信息,才能使用demo中的上传功能。

5.调试与反馈

5.1 SDK错误码

以下是错误码的详细说明:

枚举 code 详细描述
ERROR_INFO_NOTMATCH 1000 视频参数错误
ERROR_VIDEO_UNAVAILABLE 1001 视频不可用
ERROR_VIDEO_PROCESSING 1002 视频处理中
ERROR_VIDEO_DELETE 1003 视频已删除
ERROR_VIDEO_TRANFAILURE 1004 视频转码失败
ERROR_REQUEST_FAILURE 1005 网络请求失败
ERROR_VIDEO_ANALYSIS 1006 PlayInfo数据解析失败
ERROR_VIDEO_UNKNOW 1007 未知错误
ERROR_PLAYERSKIN_VIDEOUNAVAILABLE 1201 视频资源不存在
ERROR_PLAYERSKIN_LOCALUNAVAILABLE 1202 离线资源不存在
ERROR_PLAYERSKIN_DISABLEAUTOROTATE 1203 禁止手动旋转
ERROR_PLAYERSKIN_BUFFEREMPTY 1204 暂无缓冲数据
ERROR_PLAYERSKIN_BUFFERTIMEOUT 1205 缓冲超时
ERROR_PLAYERSKIN_LOADTIMEOUT 1206 加载超时
ERROR_AFINFO_NOTMATCH 1301 广告参数错误
ERROR_AFINFO_NOTSERVING 1302 该用户未投放广告
ERROR_AFINFO_TYPENOTEXIST 1303 该用户无type对应类型的广告位
ERROR_AFINFO_NOTAD 1304 该用户type类型下无广告
ERROR_AFINFO_DATA 1305 数据查询异常
ERROR_AFINFO_ANALYSIS 1306 广告数据解析失败
ERROR_BARRAGE_PARAMS 1400 弹幕参数错误
ERROR_BARRAGE_ANALYSIS 1401 弹幕数据解析失败
ERROR_PLAYER_CREATE 2000 播放器创建失败
ERROR_VIDEO_PLAYERROR 2001 播放失败
ERROR_QUALITY_NOTEXIST 2002 未查找到清晰度
ERROR_LOCAL_UNAVAILABLE 2003 本地资源不可用
ERROR_PLAYURL_UNAVAILABLE 2010 播放地址不可用/不存在
ERROR_GIF_UNASSOCIATION 2100 GIF未关联播放器
ERROR_EXRCISES_REQUEST 2302 课堂练习上报失败
ERROR_UPNP_SEARCH 2500 投屏数据获取失败
ERROR_UPNP_SUBSCRIPTION 2501 投屏订阅失败
ERROR_DOWNLOAD_UNAVAILABLE 3000 网络资源不存在
ERROR_DOWNLOAD_UNAUTHORIZED 3001 未获得下载授权
ERROR_DOWNLOAD_UNSUPPORTM3U8 3002 暂不支持m3u8视频格式下载
ERROR_DOWNLOAD_MORETHANMAXCOUNT 3040 超过下载最大并发数
ERROR_DOWNLOAD_ALREADYFAIL 3050 该任务已失败,请重新下载
ERROR_DOWNLOAD_MOVEFILE 3077 下载完成移动文件失败
ERROR_BATCHDOWNLOAD_NOTMATCH 3100 批量下载参数有误
ERROR_UPLOAD_NOTMATCH 4000 上传参数错误
ERROR_UPLOAD_NOTENOUGHSPACE 4001 用户剩余空间不足
ERROR_UPLOAD_SERVICEEXPIRED 4002 用户服务终止
ERROR_UPLOAD_PROCESSFAIL 4003 服务器处理错误
ERROR_UPLOAD_FREQUENTACCESS 4004 访问过于频繁
ERROR_UPLOAD_NOTPERMISSION 4005 用户服务无权限
ERROR_UPLOAD_FAIL 4100 上传失败
ERROR_UPLOAD_ANALYSIS 4150 上传数据解析失败
ERROR_UPLOAD_RECEIVE 4301 获取上传服务器失败
ERROR_UPLOAD_FILEDAMAGED 4302 上传文件已损坏
ERROR_UPLOAD_UNRECEIVESERVERANSWER 4400 获取服务器回调失败

5.2 通信日志的使用

SDK提供了DWLog模块用来打印HTTP通信日志,可以在App的任意位置开启或关闭打印HTTP通信日志等功能。下面是DWLog的使用方法:

// 开启 打印HTTP通信日志 功能
[DWLog setIsDebugHttpLog:YES];
// 关闭 打印HTTP通信日志 功能
[DWLog setIsDebugHttpLog:NO];
Clone repository
  • 1.概述
  • 2.集成指南
  • 3.模块介绍
  • 4.开发指南
  • 5.更新日志
  • 6.常见问题
  • 7.升级指南
  • Home
  • iOS 合规指南 云点播