5. 视频下载
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(...) 方法来获取该实例,保证所有的下载任务统一管理。
获取downloader
PolyvDownloader downloader = PolyvDownloaderManager.getPolyvDownloader(vid, bitrate, fileType);设置视频下载的token回调
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包。
Last updated
Was this helpful?