基于KTVHTTPCache实现的视频缓存和预加载

前言

KTVHTTPCache是唱吧开源的一套音视频缓存框架。因目前所做的项目有视频播放的需求,因此在某个版本的迭代中,接入了KTVHTTPCache,体验不错。
对于视频播放缓存的方案,常用的有Local HTTP ServerAVAssetResourceLoader 两种。本质上都是截获请求加载的url,再加入具体的视频缓存逻辑。有一个区别点在于AVAssetResourceLoader只能配合AVPlayer 使用。

KTVHTTPCache的结构设计

KTVHTTPCacheHTTP ServerData Storage两大模块组成。前者负责与Client 交互,后者负责资源加载及缓存处理。


HTTP ServerData StorageKTVHTTPCache 两大重要组成部分, HTTP Server 主要负责与用户交互,也就是最顶层,最直接与用户交互(比如下载数据),而 Data Storage 则在后面为 HTTP Server 提供数据,数据主要从 DataSourcer 中获取,如果本地有数据,它会从 KTVHCDataFileSource 中获取,反之会从 KTVHCDataNetworkSource中读取数据,这里会走下载逻辑(KTVHCDownload)

工作流程如下
1.Client发出的请求被 HTTP Srever 接收到,HTTP Server 通过分析 HTTP Request 创建用于访问 Data StorageData Request 对象。
2.HTTP Server 使用 Data Request 创建 Data Reader,并以此作为从Data Storage 获取数据的通道。
3.Data Reader 分析 Data Request 中的 Range 创建对应的网络数据源 Data Network Source 和文件数据源 Data File Source,并通过 Data Sourcer 进行管理。
4.Data Sourcer开始加载数据。
5.Data ReaderData Sourcer 读取数据并通过 HTTP Server 回传给 Client

HttpServer

这层设计比较简单,主要是用了 CocoaHTTPServer 来作为本地的 HttpServerHttpServer 说白了就是一个手机端的服务器,用来与用户(作者说的 client)交互,用户提出数据加载需求后,它会从不同的地方来获取数据源,如果本地没有会从网络中下载数据。它主要的作用是 hook 播放器的网络请求,进行数据的加载。它主要的类如图:

  • KTVHCHTTPServer:是一个单例,用来管理 HttpServer 服务,负责开启或关闭服务;
  • KTVHCHTTPConnection:它继承于 HTTPConnection,表示一个连接,它主要为 HttpServer 提供 Response。
  • KTVHCHTTPRequest:一个请求,也就是一个数据模型;
  • KTVHCHTTPResponse:一个 Response;
  • KTVHCHTTPResponsePing:主要用来 ping 时的 Response;
  • KTVHCHTTPURL:主要用来处理 URL,比如把原 Url 生成 proxy url;
DataStroage

主要用来缓存数据,加载数据,也就是提供数据给 HttpServer。上面代码中关键的一句代码 [KTVHCHTTPResponse responseWithConnection:self dataRequest:dataRequest],它会在这个方法的内部使用KTVHCDataStorage 生成一个 KTVHCDataReader,负责读取数据。生成 KTVHCDataReader 后通过 [self.reader prepare] 来准备数据源 KTVHCDataSourcer,这里主要有两个数据源,KTVHCDataFileSourceKTVHCDataNetworkSource,它实现了协议 KTVHCDataSourceProtocolKTVHCDataNetworkSource 会通过 KTVHCDownload 下载数据。

  • KTVHCDataStorage: 是一个单例,它负责管理整个缓存,比如读取、保存和合并缓存;
  • KTVHCDataReader:主要用来读取数据;
  • KTVHCDataRequest:用来请求数据,表示一个请求;
  • KTVHCDataResponse:一个数据响应;
  • KTVHCDataReader:读取数据;
  • KTVHCDataCacheItem:缓存数据模型,表一个缓存项;
  • KTVHCDataCacheItemZone:缓存区,一个缓存项中会有多个缓存区,比如0-99,100-299 等;
  • KTVHCDataSourcer:数据源中心,负责处理不同数据源,它包含有一个数据队列 KTVHCDataSourceQueue
  • KTVHCDataSourceQueue:数据队列;
  • KTVHCDataSourceProtocol:一个协议,作为数据源时需要实现这个协议;
  • KTVHCDataFileSource:本地数据源,实现了 KTVHCDataSourceProtocol 协议;
  • KTVHCDataNetworkSource:网络数据源,实现了KTVHCDataSourceProtocol 协议;
  • KTVHCDataUnit:数据单元,相当于一个缓存目录,比如一个视频的缓存;
  • KTVHCDataUnitItem:数据单元项,缓存目录下不同片段的缓存;
  • KTVHCDataUnitPool:数据单元池,它是一个单例,含有一个 KTVHCDataUnitQueue
  • KTVHCDataUnitQueue:数据单元队列,保存了多个 KTVHCDataUnit,它会以 archive 的方式缓存到本地;
接入缓存
- (void)initCache {
    NSError *error = nil;
    [KTVHTTPCache proxyStart:&error];
    if (error) {
        NSLog(@"Proxy Start Failure, %@", error);
    }
    // 设置缓存最大容量
    long long maxLength = 300 * 1024 * 1024;
    [KTVHTTPCache cacheSetMaxCacheLength:maxLength];
}

- (void)useCacheUrl {
NSString *proxyURLString = [KTVHTTPCache proxyURLStringWithOriginalURLString:URLString];
[AVPlayer playerWithURL:[NSURL URLWithString: proxyURLString]];

KTVHTTPCache的接入特别简单,几乎零成本,可以配置最大缓存容量。需要注意的是,播放使用的url是从KTVHTTPCache取出来的url

实现预加载

当播放视屏列表时,最好在播放当前视频时,能够预加载下几个即将要播放的视频。
可以使用NSOperationQueue操作队列在实现在后台提前预加载待播放的视频。在当前视频的链接配置完毕时,可以根据业务实际需要,将下一个或下几个视频url用NSOperation加到NSOperationQueue中,在后台进行预加载,这样当用户滑动视频,下一个视频就已经是提前预加载好的了。当然,这里只是简单提供思路,项目中使用NSOperationQueue也是很方便就能实现的,可以控制最大并发数量,是预加载当前index前面的视频还是后面的视频,弱网是否执行预加载,具体的预加载逻辑还是要结合业务来操作。

读懂「 唱吧KTVHTTPCache 」设计思想

唱吧 iOS 音视频缓存处理框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容