本文介绍如何接入 iOS 点播 SDK 的下载功能,包含功能介绍、前提条件、集成步骤等内容。
iOS 点播 SDK 提供下载功能,支持用户在播放器中将视频缓存至本地观看。iOS 点播 SDK 支持下载 DirectUrl 视频源和 Vid 视频源,并提供开始、暂停、恢复、删除等控制下载任务的方法。
在接入下载功能前,您需要阅读集成准备以及快速开始 - 初始化点播 SDK 章节,确保已经完成 SDK 的初始化。
说明
如需下载 HLS 视频,请集成 iOS 点播 SDK 1.37.1.7 或以上版本。
使用下载功能前,您需要先在点播 SDK 初始化过程中对下载功能进行一些必要的配置,例如是否开启下载 HLS 视频的能力、设置下载路径。此外您还可以设置最大并发数和空闲磁盘空间大小的限制等。
注意
需要特别注意的是,初始化代码的时序对下载功能是否能正常工作有直接影响:
如果您需要下载 HLS 视频,需要在初始化点播 SDK 之前开启 HLSProxyModule
,从而开启 HLS 下载功能。此方法必须在 [TTSDKManager startWithConfiguration:]
方法之前调用。
设置下载文件存储路径,需要在 [TTSDKManager startWithConfiguration:]
方法之前调用。
其他下载配置则需要在 [TTSDKManager startWithConfiguration:]
方法之后调用。
示例代码如下:
- (void)initTTSDK { // 开启 HLS 下载功能。可选,如业务中无需下载 HLS 视频,可跳过。 [TTVideoEngine.ls_localServerConfigure setOptionForKey:@(VEKKeyHLSProxyProtocolEnable_BOOL) value:@YES]; // 必填,设置下载文件存储路径 [TTVideoEngine ls_localServerConfigure].downloadDirectory = @"xxxxx"; // 初始化点播 SDK [TTSDKManager startWithConfiguration:configuration]; // 选填,设置最大并发下载数,默认值为 1 [TTVideoEngineDownloader shareLoader].maxDownloadOperationCount = 3; // 选填,设置空闲磁盘空间大小的限制,默认值 1G // 当前设为 1G,如果剩余磁盘大小不足 1G,则返回 TTVideoEngineErrorNotEnoughDiskSpace 错误 [TTVideoEngineDownloader shareLoader].limitFreeDiskSize = 1024 * 1024 * 1024; // iOS 点播 SDK 默认支持缓存最多 50 个视频,如业务超出此限制,需进行以下设置 [TTVideoEngine setGlobalForKey:VEGSKeyPlayerVideoModelMaxCache_NSInteger value:@(500)]; }
点播 SDK 支持播放 DirectUrl 视频源和 Vid 视频源。与之对应,点播 SDK 也提供了不同数据源的下载能力。创建新的下载任务之前,建议您调用 getAllTasksWithCompletionHandler
方法获取已有下载任务。点播 SDK 会自动保存未完成的下载任务,在对应业务启动时调用可以获取先前被中断的下载任务。您可以在 getAllTasksWithCompletionHandler
的 block 中创建下载任务,以保证调用顺序。
说明
视频源的参数说明详见快速开始 - 设置播放数据源章节。
getAllTasksWithCompletionHandler
需要在主线程调用。
[[TTVideoEngineDownloader shareLoader] getAllTasksWithCompletionHandler:^(NSArray<__kindof TTVideoEngineDownloadTask *> * _Nonnull tasks) { TTVideoEngineDownloadURLTask *urlTask = [[TTVideoEngineDownloader shareLoader] urlTask:@[urlString] key:key videoId:nil]; [urlTask resume]; }];
[[TTVideoEngineDownloader shareLoader] getAllTasksWithCompletionHandler:^(NSArray<__kindof TTVideoEngineDownloadTask *> * _Nonnull tasks) { TTVideoEngineDownloadVidTask *vidTask = [[TTVideoEngineDownloader shareLoader] vidTask:videoID playAuthToken:token resolution:TTVideoEngineResolutionTypeSD]; [vidTask resume]; }];
通过以下方法控制单个下载任务:
// 开始/恢复单个下载任务。 // 支持断点续传。 [task resume]; // 暂停单个下载任务,支持断点续传。 // 此方法需要在主线程调用。 [task suspend]; // 删除单个下载任务。 // 下载任务被删除后,任务会停止,同时 TTVideoEngineDownloader 将不再管理这个任务。 // 此接口为异步操作,您需要在 `getAllTasksWithCompletionHandler` 的回调中检查是否被删除。 [task invalidateAndCancel];
通过以下方法控制所有下载任务:
// 暂停所有下载任务。 // 此方法必须在 `getAllTasksWithCompletionHandler` 之后调用。 - (void)suspendAllTasks; // 开始/恢复所有下载任务。 // 此方法必须在 `getAllTasksWithCompletionHandler` 之后调用。 - (void)resumeAllTasks; // 删除所有下载任务。 // 此方法必须在 `getAllTasksWithCompletionHandler` 之后调用。 - (void)removeAllTasks;
注意
下载任务删除后,该任务对应的视频文件也会被删除。
下载任务的完成情况、进度和状态等信息都需要通过实现 TTVideoEngineDownloaderDelegate
中的方法来获取,示例代码如下:
// 设置回调接收 [TTVideoEngineDownloader shareLoader].delegate = self;
/** * 下载任务完成回调。 * @param downloadTask 当前下载任务。 * @param error 错误。error 为 null 则为下载任务成功,否则为下载任务失败。 */ - (void)VideoEngineDownloader:(TTVideoEngineDownloader *)downloader downloadTask:(TTVideoEngineDownloadTask *)downloadTask didCompleteWithError:(nullable NSError *)error; /** * 下载任务进度更新回调。 * @param downloadTask 当前下载任务。 * - downloadTask.countOfBytesReceived 当前下载任务已下载的数据总量(HLS 不适用,见下方注意点) * - downloadTask.countOfBytesExpectedToReceive 当前下载任务需要下载的总数据量(HLS 不适用,见下方注意点) * - downloadTask.progress 当前下载任务进度 0.0~1.0 * @param bytesWritten 本次回调新增下载的数据量,单位为 Byte。 * @param timeMs 当前时间。 */ - (void)VideoEngineDownloader:(TTVideoEngineDownloader *)downloader downloadTask:(TTVideoEngineDownloadTask *)downloadTask writeData:(int64_t)bytesWritten timeInterval:(double)timeMS; /** * 下载任务开始/恢复回调。 * @param downloadTask 当前下载任务。 * @param fileOffset 已下载的数据量。 * @param expectedTotalBytes 该任务要下载的总数据量。 */ - (void)VideoEngineDownloader:(TTVideoEngineDownloader *)downloader downloadTask:(TTVideoEngineDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes; /** * 下载任务状态变更回调。 * @param downloadTask 当前下载任务。 * @param downloadState 当前下载任务状态: * - TTVideoEngineDownloadStateInit(0):初始化。 * - TTVideoEngineDownloadStateWaiting(1): 等待中。 * - TTVideoEngineDownloadStateRunning(2): 运行中。 * - TTVideoEngineDownloadStateSuspended(3): 暂停。 * - TTVideoEngineDownloadStateCanceling(4): 正在取消。 * - TTVideoEngineDownloadStateCompleted(5): 完成。 */ - (void)VideoEngineDownloader:(TTVideoEngineDownloader *)downloader downloadTask:(TTVideoEngineDownloadTask *)downloadTask stateChanged:(TTVideoEngineDownloadState)downloadState;
注意
如果下载的媒体类型为 HLS(M3U8),SDK 无法知道整个视频的文件大小, 回调中的 countOfBytesReceived
和 countOfBytesExpectedToReceive
数值并不准确。 因此,对于 HLS(M3U8) 您仅可以通过 - [TTVideoEngineDownloadTask progress]
获取下载的进度。
SDK 内部已经处理了下载缓存与播放的联动关系。SDK 会优先播放已经下载的视频,即使它们尚未完全下载完成,因此您播放时无需额外设置。
参考以下示例代码播放 DirectUrl 视频源:
// 播放已下载的 HLS 视频前必须设置以下 option [self.videoEngine setOptionForKey:VEKKeyIsAllowAllExtensions value:@1]; // 注意 cacheKey 与下载时使用的 cacheKey 一致 TTVideoEngineUrlSource *urlSource = [[TTVideoEngineUrlSource alloc] initWithUrl:videoUrl cacheKey:cacheKey]; [self.videoEngine setVideoEngineVideoSource:urlSource]; [self.videoEngine play];
参考以下示例代码播放 Vid 视频源:
// 离线播放已下载的视频前必须设置以下 option [self.videoEngine setOptionForKey:VEKKeyModelCacheVideoInfoEnable_BOOL value:@(YES)]; [self.videoEngine setOptionForKey:VEKKeyPlayerVideoModelPriority_ENUM value:@(TTVideoEngineVideoModelUseLocal)]; // 播放已下载的 HLS 视频前必须设置以下 option [self.videoEngine setOptionForKey:VEKKeyIsAllowAllExtensions value:@1]; // 注意 resoluton 与下载时使用的 resolution 一致 TTVideoEngineVidSource *vidSource = [[TTVideoEngineVidSource alloc] initWithVid:vid playAuthToken:playAuthToken resolution:resolution]; [self.videoEngine setVideoEngineVideoSource:vidSource]; [self.videoEngine play];
以下是下载任务完成回调中可能会返回的错误码及其说明:
枚举值 | 错误码 | 说明 |
---|---|---|
TTVideoEngineErrorNetworkNotAvailable | -9960 | 网络不可用。 |
TTVideoEngineErrorSaveTaskItem | -9949 | 保存下载任务失败,数据库发生错误,建议删除该项下载。 |
TTVideoEngineErrorWriteFile | -9948 | 写文件失败,检查下载目录的写入权限。如权限正常,建议用户删除该下载项,重新开始下载。 |
TTVideoEngineErrorNotEnoughDiskSpace | -9947 | 磁盘空间不足。 |
TTVideoEngineErrorURLUnavailable | -9945 | 下载地址不可用,检查下载任务的 URL,建议更换 URL 进行重试。 |
TTVideoEngineErrorServiceInaccessible | -9944 | 表示 URL 请求返回 500 等错误,无法下载资源。建议更换 URL 或提示无法下载(服务不可用)。 |
TTVideoEngineErrorExistedTask | -9943 | 下载任务已存在,不能重复添加。 |