播放器 SDK 支持下载功能。用户可在有网络的条件下将视频下载至本地,随后在无网络的环境下观看。SDK 支持下载 DirectUrl 视频源和 Vid 视频源,并提供开始、暂停、恢复、删除等控制下载任务的方法。
说明
需要特别注意的是,初始化代码的时序对下载功能是否能正常工作有直接影响:
startWithConfiguration(<sdkConfig>) 方法之前调用。startWithConfiguration(<sdkConfig>) 方法之前调用。startWithConfiguration(<sdkConfig>) 方法之后调用。示例代码如下:
// 开启 HLS 下载功能。可选,如业务中无需下载 HLS 视频,可跳过。 TTVideoEngineDownloadTaskManager.enableHlsProxy(true); // 必填,设置下载文件存储路径 String platformDir; if (Platform.isIOS) { platformDir = (await getApplicationDocumentsDirectory()).path; } else { platformDir = (await getDownloadsDirectory())!.path; } platformDir = "$platformDir/xxxx"; TTVideoEngineDownloadTaskManager.setDownloadDirectory(platformDir); // 初始化 SDK FlutterTTSDKManager.startWithConfiguration(sdkConfig); // 选填,设置最大并发下载数,默认值为 1 TTVideoEngineDownloadTaskManager.setMaxDownloadOperationCount(3); // 选填,设置空闲磁盘空间大小的限制,默认值 1G TTVideoEngineDownloadTaskManager.setLimitFreeDiskSize(1024 * 1024 * 1024); // 默认支持缓存最多 50 个视频。如业务超出此限制,需进行以下设置 TTVideoEngineDownloadTaskManager.setLimitFreeDiskCount(500); // 加载所有预加载任务 TTVideoEngineDownloadTaskManager.loadAllTask();
SDK 支持播放 DirectUrl 视频源和 Vid 视频源。与之对应,SDK 也提供了不同数据源的下载能力。
// 传入 urls、cacheKey、videoId,其中 urls 和 cacheKey 必填,cacheKey 需和视频源一一对应 TTVideoEngineDownloadURLTask task = TTVideoEngineDownloadURLTask(urls: <urls>, cacheKey: <cachekey>, videoId: <videoId>); task.resume();
// 传入 videoId、playAuthToken 和目标清晰度 // codecType:指定需下载的视频编码格式,默认下载 H.264 TTVideoEngineDownloadVidTask task = TTVideoEngineDownloadVidTask( videoId: <videoId>, playAuthToken: <playAuthToken>, resolution: <resolution>, codecType: <codecType>); task.resume();
通过以下方法控制单个下载任务:
// 开始/恢复单个下载任务。 // 支持断点续传。 task.resume(); // 暂停单个下载任务,支持断点续传。 task.suspend(); // 删除单个下载任务。 // 下载任务被删除后,任务会停止,同时 TTVideoEngineDownloadTaskManager 将不再管理这个任务。 task.invalidateAndCancel();
通过以下方法控制所有下载任务:
// 开始/恢复所有下载任务 TTVideoEngineDownloadTaskManager.resumeAllTask(); // 暂停所有下载任务 TTVideoEngineDownloadTaskManager.suspendAllTask(); // 删除所有下载任务 TTVideoEngineDownloadTaskManager.removeAllTask();
/** * 下载任务完成回调。 * @param task 当前下载任务。 * @param error 错误。error 为 null 则为下载任务成功,否则为下载任务失败。 */ TTVideoEngineDownloadTaskManager.onComplete = (TTVideoEngineDownloadTask task, TTError? error) { print('Download-onComplete: $task, $error'); }; /** * 下载任务进度更新回调。 * @param task 当前下载任务。 * - downloadTask.countOfBytesReceived 当前下载任务已下载的数据总量(HLS 不适用,见下方注意点) * - downloadTask.countOfBytesExpectedToReceive 当前下载任务需要下载的总数据量(HLS 不适用,见下方注意点) * - progress 当前下载任务进度 0.0~1.0 */ TTVideoEngineDownloadTaskManager.onProgress = (TTVideoEngineDownloadTask task, double progress) { print('Download-onProgress: $task, $progress'); }; /** * 下载任务开始/恢复回调。 * @param downloadTask 当前下载任务。 * @param fileOffset 已下载的数据量。 * @param expectedTotalBytes 该任务要下载的总数据量。 */ TTVideoEngineDownloadTaskManager.onResume = (TTVideoEngineDownloadTask task, int fileOffset, int expectedTotalBytes) { print('Download-onResume: $task, $fileOffset, $expectedTotalBytes'); }; /** * 下载任务状态变更回调。 * @param task 当前下载任务。 * @param state 当前下载任务状态: * - init(0):初始化。 * - waiting(1): 等待中。 * - running(2): 运行中。 * - suspended(3): 暂停。 * - canceling(4): 正在取消。 * - completed(5): 完成。 */ TTVideoEngineDownloadTaskManager.onStateChanged = (TTVideoEngineDownloadTask task, TTVideoEngineDownloadState state) { print('Download-onStateChanged: $task, $state'); };
说明
如果下载的媒体类型为 HLS(M3U8),SDK 无法获知整个视频的文件大小, 回调中的 countOfBytesReceived 和 countOfBytesExpectedToReceive 数值并不准确。 因此,对于 HLS(M3U8) 您仅可以通过 task.progress 获取下载的进度。
SDK 内部已处理下载缓存与播放的协同关系。您需要调用 enablePlayCachedSource 开启离线播放已下载视频,SDK 会优先播放已经下载的视频,即使它们尚未完全下载完成。
参考以下示例代码播放 DirectUrl 视频源:
// 设置source前,开启离线播放已下载视频 player.enablePlayCachedSource(); // 注意 cacheKey 与下载时使用的 cacheKey 一致 TTVideoEngineUrlSource source = TTVideoEngineUrlSource.initWithURLS(<urls>, <cacheKey>); player.setMediaSource(source);
参考以下示例代码播放 Vid 视频源:
// 设置 source 前,开启离线播放已下载视频 player.enablePlayCachedSource(); // 注意 resoluton 与下载时使用的 resolution 一致 TTVideoEngineVidSource source = TTVideoEngineVidSource.init(vid: <vid>, playAuthToken: <playAuthToken>, resolution: <resolutionType>); player.setMediaSource(source);