Polyv SDK 提供了一套视频下载的 SDK,只要导入依赖就可以直接调用,实现视频下载功能。
implementation 'com.easefun.polyv:polyvDownload:2.19.1'//SDK下载功能`
导入完成后,有几个重要的类:
PolyvDownloaderManager
下载管理器。里面封装了对视频下载的操作,如startAll()
。
PolyvDownloader
视频下载具体实现类。里面具体实现了下载的逻辑等。
开发者通过这几个类,基本可以实现对视频下载的控制。
1 下载设置
1.1 设置保存目录
确保在启动的 Application 中设置好下载保存目录。
PolyvSDKClient.getInstance().setDownloadDir(downloadDir);
若需要兼容旧下载视频目录,则需要设置辅助存储目录列表。新接入SDK不需要,可跳过这部分。
PolyvDevMountInfo.getInstance().init(context, new PolyvDevMountInfo.OnLoadCallback() {
@Override
public void callback() {
//是否有可移除的存储介质(例如 SD 卡)或内部(不可移除)存储可供使用。
if (!PolyvDevMountInfo.getInstance().isSDCardAvaiable()) {
return;
}
//可移除的存储介质(例如 SD 卡),需要写入特定目录/storage/sdcard1/Android/data/包名/。
ArrayList<File> subDirList = new ArrayList<>();
String externalSDCardPath = PolyvDevMountInfo.getInstance().getExternalSDCardPath();
if (!TextUtils.isEmpty(externalSDCardPath)) {
StringBuilder dirPath = new StringBuilder();
dirPath.append(externalSDCardPath).append(File.separator).append(MUITL_DOWNLOAD_DIR);
File saveDir = new File(dirPath.toString());
if (!saveDir.exists()) {
saveDir.mkdirs();//创建下载目录
}
subDirList.add(saveDir);
}
//如果没有可移除的存储介质(例如 SD 卡),那么一定有内部(不可移除)存储介质可用,都不可用的情况在前面判断过了。
File saveDir = new File(PolyvDevMountInfo.getInstance().getInternalSDCardPath() + File.separator + MUITL_DOWNLOAD_DIR);
if (!saveDir.exists()) {
saveDir.mkdirs();//创建下载目录
}
subDirList.add(saveDir);
//设置"辅助存储目录列表"
PolyvSDKClient.getInstance().setSubDirList(subDirList);
}
}, true);
这是为了兼容旧版下载视频路径而设计。调用SDK中的接口播放视频,删除视频会从“辅助存储目录列表”中查找本地视频文件。通过设置“辅助存储目录列表”,可以兼容下载视频在手机可移除的存储介质(例如 SD 卡)和内部(不可移除)存储中。为了保证逻辑统一性,没有设置“下载文件保存目录setDownloadDir(File)
”不会单独使用“辅助存储目录列表setSubDirList(subDirList)
”进行相关活动。
注意: 如果想要保存下载视频至SD卡,可能会出现SD卡接触不良,SD卡坏了,SD卡的状态错误等导致的问题。我们在开发中也遇到了SD卡没有权限写入的问题,但是我们确定APP是有赋予 android.permission.WRITE_EXTERNAL_STORAGE
权限的。有些是系统问题,有些是SD卡本身的问题,这些问题需要通过重新拔插SD卡或者更换SD卡来解决。开发者若设置保存至SD卡需了解这些情况。
1.2 设置最大并发下载数
设置最大并发下载数,决定多少个视频能同时下载。默认是1。设置为负数和0是没有限制。
//在 Appication 中设置
PolyvDownloaderManager.setDownloadQueueCount(1);
2 视频下载
2.1 下载任务
每一个视频下载任务,都会对应一个 PolyvDownloader
。而 PolyvDownloaderManager
会根据 VID 生成 key 把 PolyvDownloader
实例存到 Map<key,PolyvDownloader> 里面,如果没有该实例就创建一个。所以PolyvDownloaderManager
管理着所有的下载任务,开发者不应该直接去创建 PolyvDownloader
,而是应当通过 PolyvDownloader.getPolyvDownloader(...)
方法来获取该实例,保证所有的下载任务统一管理。
PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType);
downloader.setDownloaderTokenRequestListener(new IPLVDownloaderTokenRequestListener() {
@Override
public String onRequestToken(@NotNull String videoId, int bitRate) {
// 返回视频下载的token
return token;
}
});
通过设置视频下载的 token 回调,您可以接入 IP 白名单控制,最大限度地保证视频的安全,可以参考版权保护最佳实践以获得更多关于视频安全性的信息。
downloader.start(getApplicationContext);
2.2 参数说明
下载任务可以常见几个重要的参数vid, bitrate, filetype
等。
vid 是在后台上传视频成功后,由后台自动生成在视频列表中的。VID是视频的唯一识别标志。
bitrate 码率。也可以认为是清晰度。我们封装了枚举类型的码率以及相关的一些方法在PolyvBitRate.java
中,可以直接使用。
filetype 文件类型。PolyvDownloader
中定义了几个下载的文件类型。FILE_VIDEO, FILE_AUDIO, FILE_PPT
。可以按情况下载对应的文件。
2.3 下载控制
对于下载任务的批量操作,可以使用 PolyvDownloaderManager
。
PolyvDownloaderManager.startAll(context);//开启所有下载任务
PolyvDownloaderManager.stopAll(); //停止全部下载任务
PolyvDownloaderManager.releaseDownload();//释放所有当前的下载任务,清空下载队列
PolyvDownloaderManager.isWaitingDownload(vid,bitRate);//是否等待下载中
对于详细的下载任务,可以获取 PolyvDownloader
实例操作。
//获取downloader
PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType);
downloader.start(context);//开始下载
downloader.stop();//停止下载
downloader.delete();//删除音频/视频文件(根据FileType决定),删除之前会做stop操作
更多的操作可查看API 文档。
3 下载回调
对于下载任务PolyvDownloader
,我们开放了多种下载回调。
/**
* 下载速度监听回调,主线程中回调
*/
public interface IPolyvDownloaderSpeedListener {
/**
* @param speed byte(字节)
*/
@MainThread
void onSpeed(int speed);
}
/**
* 下载监听回调,主线程中回调
*/
public interface IPolyvDownloaderProgressListener2 {
/**
* 下载进度
* @param current - 已下载视频文件大小
* @param total - 视频文件大小
*/
@MainThread
void onDownload(long current ,long total);
/**
* 下载完成成功
* @param bitrate 下载视频的码率
*/
@MainThread
void onDownloadSuccess(int bitrate);
/**
* 下载失败
* @param errorReason 失败原因
*/
@MainThread
void onDownloadFail(@NonNull PolyvDownloaderErrorReason errorReason);
}
/**
* 下载开始监听回调。
* @author Lion 2017-8-1
*/
public interface IPolyvDownloaderStartListener {
/**
* 开始回调,{@link PolyvDownloader#start()}或者{@link PolyvDownloader#start(Context)}中开始了下载,就回调。若没有回调此方法,就表示在下载队列中,处于等待状态。
*/
@MainThread
void onStart();
}
更多下载回调可查看API 文档com.easefun.polyvsdk.download.listener
包。