KTVHTTPCache
KTVHTTPCache 是一个强大的 HTTP 缓存框架,非常适合缓存多媒体资源。
流程图
特性
- 播放、下载和边播边缓存
- 支持预加载
- 支持 HLS
- 支持 AirPlay
- 支持 URL 映射
- 多并发,线程安全
- 强大的日志系统
- 缓存文件管理
- 低耦合高扩展性
系统要求
- iOS 12.0 或更高版本
- Xcode 11.0 或更高版本
支持的格式
支持所有基于 HTTP 协议传输的资源:
- 视频:MP4、TS、MOV、MXF、MPG、FLV、WMV、AVI、M4V、F4V、MPEG、3GP、ASF、MKV 等
- 音频:MP3、OGG、WAV、WMA、APE、FLAC、AAC、AC3、MMF、AMR、M4A、M4R、WV、MP2 等
- 支持 Apple HTTP Live Streaming (HLS) m3u8 索引文件
安装
使用 CocoaPods 安装
要使用 CocoaPods 将 KTVHTTPCache 集成到您的 Xcode 项目中,请在 Podfile 中指定:
pod 'KTVHTTPCache', '~> 3.0.0'
运行 pod install
使用 Carthage 安装
要使用 Carthage 将 KTVHTTPCache 集成到您的 Xcode 项目中,请在 Cartfile 中指定:
github "ChangbaDevs/KTVHTTPCache" ~> 3.0.0
运行 carthage update
来构建框架,然后将构建好的 KTVHTTPCache.framework
和 KTVCocoaHTTPServer.framework
拖入您的 Xcode 项目中。
设计原则
KTVHTTPCache 最初设计是为了实现在线播放时播放、下载和缓存多媒体资源的功能。从设计之初就严格遵循以下原则:
- 简单高效的 API,与业务端无耦合
- 最小化网络使用,分片存储,已加载的数据片段不再请求网络
- 播放过程中 Seek,已经播放过的部分不再请求网络
- 缓存全局共享,同一 URL 已经播放过的部分再次下载时不再请求网络
- 不依赖于播放器,支持 AVPlayer 或其他基于 FFmpeg 的播放器
- 完整的日志系统,全程可查可追踪问题
这个框架的本质是缓存 HTTP 请求,对传输内容没有限制。因此,应用场景不局限于在线音视频播放,也可用于文件下载、图片加载、普通网络请求等场景。
缓存策略
基于最小化网络使用的原则,数据按片段加载。有两种数据源:Network Source 和 File Source,分别用于下载网络数据和读取本地数据。通过比较 Request Header 中的 Range 与本地缓存状态动态生成数据加载策略。 例如,Request Header 中的 Range 为 0-1000,本地缓存中已经有了 200-500 和 700-800 两段数据。那么会相应生成 5 个 Source,分别是:
- Network Source: 0-199
- File Source : 200-500
- Network Source: 501-699
- File Source : 700-800
- Network Source: 801-1000
它们由 Source Manager 管理,对外只提供简单的读取 API。
使用方法
与 AVPlayer 一起使用
- 以下是与 AVPlayer 一起使用的示例。在实际项目中,不限于 AVPlayer,也可以与其他基于 FFmpeg 的播放器一起使用。
// 1.启动本地代理服务器
[KTVHTTPCache proxyStart:&error];
// 2.生成代理 URL
NSURL *proxyURL = [KTVHTTPCache proxyURLWithOriginalURL:originalURL];
// 3.使用代理URL创建AVPlayer。
AVPlayer *player = [AVPlayer playerWithURL:proxyURL];
预加载
- 使用KTVHCDataLoader并通过其代理实时获取预加载状态
// 可以通过Request Header中的Range参数控制预加载范围。
KTVHCDataRequest *request= [[KTVHCDataRequest alloc] initWithURL:URL headers:headers];
KTVHCDataLoader *loader = [KTVHTTPCache cacheLoaderWithRequest:request];
loader.delegate = self;
[loader prepare];
激活AirPlay
- 出于稳定性考虑,本地服务器默认只接受来自localhost的请求,这导致AirPlay默认处于非活动状态。可以使用以下API进行更改。
// 将bindToLocalhost设置为NO以激活AirPlay。
NSURL *proxyURL = [KTVHTTPCache proxyURLWithOriginalURL:originalURL bindToLocalhost:NO];
URL映射
- 如果指向同一资源的URL动态变化,可以使用以下API进行映射。
/**
* 例如:
* http://www.xxxx.com/video.mp4?token=1
* 和
* http://www.xxxx.com/video.mp4?token=2
* 虽然URL不同,但它们都指向同一个文件,可以在块中返回
* http://www.xxxx.com/video.mp4
* 以映射到同一个缓存
*/
[KTVHTTPCache encodeSetURLConverter:^NSURL *(NSURL *URL) {
return URL;
}];
网络配置
// 设置超时时间间隔。
[KTVHTTPCache downloadSetTimeoutInterval:30];
/**
* 出于安全/稳定性考虑,默认只启用以下Content-Type的响应:
* - text/x
* - video/x
* - audio/x
* - application/x-mpegURL
* - vnd.apple.mpegURL
* - application/mp4
* - application/octet-stream
* - binary/octet-stream
* 要开放更多类型,请使用此API设置
*/
[KTVHTTPCache downloadSetAcceptableContentTypes:contentTypes];
// 当默认不接受某个Content-Type类型时,会触发此处理程序。你可以自行决定是否接受。
[KTVHTTPCache downloadSetUnacceptableContentTypeDisposer:^BOOL(NSURL *URL, NSString *contentType) {
return NO;
}];
管理缓存数据
- 默认缓存空间为500m。用完后,启用淘汰机制,逐步淘汰最老的缓存数据。
// 如果URL已被完全缓存,在被本地服务器释放后,它将自动合并成一个完整的文件。
NSURL *fileURL= [KTVHTTPCache cacheCompleteFileURLWithURL:originalURL];
日志系统
// 获取指定URL的错误信息。
NSError *error = [KTVHTTPCache logErrorForURL:URL];
// 启用控制台输出日志。
[KTVHTTPCache logSetConsoleLogEnable:YES];
// 将日志写入文件。
[KTVHTTPCache logSetRecordLogEnable:YES];
NSString *logFilePath = [KTVHTTPCache logRecordLogFilePath];
许可证
KTVHTTPCache 在 MIT 许可下发布。
作者
- GitHub:Single
- 电子邮件:libobjc@gmail.com
作者开发的其他项目
- SGPlayer - 一个强大的iOS、macOS和tvOS媒体播放器框架。
- KTVVideoProcess - 一个高性能视频效果处理框架。