Skip to content

离线下载

ZERO edited this page Apr 5, 2019 · 2 revisions

功能介绍

点播离线播放是一个非常普遍的需求,用户可以在有网络的地方先下载好视频,等到了无网络的环境可以再次观看。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错误。建议两个选项都设置

校验HLS Key

下载过程中,SDK不会尝试去解码数据。如果您下载的文件是加密hls,这有必要校验key是否正确,否者下载下来的文件可能无法播放。

我们将校验交给用户,您需要实现下面回调方法

/**
 * 下载HLS,遇到加密的文件,将解密key给外部校验
 * @param mediaInfo 下载对象
 * @param url Url地址
 * @prarm receive 服务器返回
 * @return 0 - 校验正确,继续下载;否则校验失败,抛出下载错误(dk获取失败)
 */
int  hlsKeyVerify(TXVodDownloadMediaInfo mediaInfo, String url, byte[] receive);

若不实现,默认不校验。

HTTP Header

TXVodDownloadManager提供headers接口,设置自定义header在此添加。

常见问题

  • 支持断点下载吗?

支持断点下载,只要下载url或fileid没有改变。

  • 如何并发任务下载?

多次调用下载开始接口下载不同文件,内部会为每个下载任务开启一个线程。

  • 出现TXDownloadAuthFaild鉴权失败错误

查看log中getplayinfo关键字,看是否能在浏览器中打开。如果否,则是鉴权参数错误。 如果能返回数据,请在TXPlayeAuthBuilder打开https,部分系统会要求必须是http连接。