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