-
Notifications
You must be signed in to change notification settings - Fork 224
离线下载
点播离线播放是一个非常普遍的需求,用户可以在有网络的地方先下载好视频,等到了无网络的环境可以再次观看。SDK提供了播放本地文件的能力,但仅限于mp4和flv这种单一文件格式,HLS流媒体因为无法保存到本地,所以不能本地播放。现在,您可以通过TXVodDownloadManager将HLS下载到本地,以实现离线播放HLS的能力
TXVodDownloadManager被设计为单例,因此您不能创建多个下载对象。用法如下
#import "TXVodDownloadManager.h" // 该头文件在TXLiteAV中
TXVodDownloadManager *downloader = [TXVodDownloadManager shareInstance];
[downloader setDownloadPath:"<指定您的下载目录>"];
开始下载有两种方式:url和fileid。url方式非常简单,只需要传入下载地址即可
[downloader startDownloadUrl:@"http://1253131631.vod2.myqcloud.com/26f327f9vodgzp1253131631/f4bdff799031868222924043041/playlist.m3u8"];
fileid下载至少需要传入appId和fileId
TXPlayerAuthParams *auth = [TXPlayerAuthParams new];
auth.appId = 1252463788;
auth.fileId = @"4564972819220421305";
TXVodDownloadDataSource *dataSource = [TXVodDownloadDataSource new];
dataSource.auth = auth;
[downloader startDownload:dataSource];
在接收任务信息前,需要先设置回调delegate
downloader.delegate = self;
可能收到的任务回调有:
- -[TXVodDownloadDelegate onDownloadStart:] 任务开始,表示SDK已经开始下载。
- -[TXVodDownloadDelegate onDownloadProgress:] 任务进度,下载过程中,SDK会频繁回调此接口,你可以在这里更新进度显示
- -[TXVodDownloadDelegate onDownloadStop:] 任务停止,当您调用是stopDownload停止下载,收到此消息表示停止成功
- -[TXVodDownloadDelegate onDownloadFinish:] 下载完成,收到此回调表示已全部下载。此时下载文件可以给TXVodPlayer播放
- -[TXVodDownloadDelegate onDownloadError:errorMsg:] 下载错误,下载过程中遇到网络断开会回调此接口,同时下载任务停止。所有错误码请参考TXDownloadError。 由于downloader可以同时下载多个任务,所以回调接口里带上了TXVodDownloadMediaInfo对象,您可以访问url或dataSource判断下载源,同时还可以获取到下载进度、文件大小等信息。
枚举 | 值 | 说明 |
---|---|---|
TXDownloadAuthFaild | -5001 | fileid鉴权失败 |
TXDownloadNoFile | -5003 | 无此清晰度文件 |
TXDownloadFormatError | -5004 | 格式不支持 |
TXDownloadDisconnet | -5005 | 网络断开 |
TXDownloadHlsKeyError | -5006 | 获取HLS解密key失败 |
TXDownloadPathError | -5007 | 下载目录访问失败 |
停止下载请调用-[TXVodDownloadManager stopDownload:]方法,参数为-[TXVodDownloadManager sartDownloadUrl:]返回的对象。SDK支持断点续传,当下载目录没有发生改变时,下次下载同一个文件时会从上次停止的地方重新开始。
如果您不需要重新下载,请调用-[TXVodDownloadManager deleteDownloadFile:]方法删除文件,以释放存储空间。
收到-[TXVodDownloadDelegate onDownloadFinish:]
后,参数TXVodDownloadMediaInfo中的playPath即本地播放文件地址,可直接给播放器播放。
通过fileid下载可以选择需要的清晰度,设置TXVodDownloadDataSource的quality即可。quality的定义如下
typedef NS_ENUM(NSInteger, TXVodQuality) {
///原画
TXVodQualityOD = 0,
///流畅
TXVodQualityFLU,
///标清
TXVodQualitySD,
///高清
TXVodQualityHD,
///全高清
TXVodQualityFHD,
///2K
TXVodQuality2K,
///4K
TXVodQuality4K,
};
其中,TXVodQualityOD从原始地址开始下载;其它都是从转码地址下载。
另一种下载清晰度的方式是通过templateName。模板名在点播后台可以看到(不清楚模板名,请向客服咨询)。
当templateName和quality同时存在时,将优先使用templateName;若不能找到对应的清晰度,则会寻找quality。如果都没有,抛出TXDownloadNoFile错误。建议两个选项都设置
下载过程中,SDK不会尝试去解码数据。如果您下载的文件是加密hls,这有必要校验key是否正确,否者下载下来的文件可能无法播放。
我们将校验交给用户,您需要实现下面回调方法
/**
* 下载HLS,遇到加密的文件,将解密key给外部校验
* @param mediaInfo 下载对象
* @param url Url地址
* @prarm data 服务器返回
* @return 0 - 校验正确,继续下载;否则校验失败,抛出下载错误(dk获取失败)
*/
- (int)hlsKeyVerify:(TXVodDownloadMediaInfo *)mediaInfo url:(NSString *)url data:(NSData *)data;
若不实现,默认不校验。
TXVodDownloadManager提供headers接口,设置自定义header在此添加。
- 支持断点下载吗?
支持断点下载,只要下载url或fileid没有改变。
- 如何并发任务下载?
多次调用下载开始接口下载不同文件,内部会为每个下载任务开启一个线程。
- 出现TXDownloadAuthFaild鉴权失败错误
查看log中getplayinfo关键字,看是否能在浏览器中打开。如果否,则是鉴权参数错误。 如果能返回数据,请在TXPlayeAuthBuilder打开https,部分系统会要求必须是http连接。