基于KTVHTTPCache實現(xiàn)的視頻緩存和預(yù)加載

前言

KTVHTTPCache是唱吧開源的一套音視頻緩存框架冈欢。因目前所做的項目有視頻播放的需求,因此在某個版本的迭代中,接入了KTVHTTPCache潮饱,體驗不錯。
對于視頻播放緩存的方案诫给,常用的有Local HTTP ServerAVAssetResourceLoader 兩種香拉。本質(zhì)上都是截獲請求加載的url,再加入具體的視頻緩存邏輯中狂。有一個區(qū)別點在于AVAssetResourceLoader只能配合AVPlayer 使用凫碌。

KTVHTTPCache的結(jié)構(gòu)設(shè)計

KTVHTTPCacheHTTP ServerData Storage兩大模塊組成。前者負(fù)責(zé)與Client 交互吃型,后者負(fù)責(zé)資源加載及緩存處理证鸥。


HTTP ServerData StorageKTVHTTPCache 兩大重要組成部分, HTTP Server 主要負(fù)責(zé)與用戶交互勤晚,也就是最頂層枉层,最直接與用戶交互(比如下載數(shù)據(jù)),而 Data Storage 則在后面為 HTTP Server 提供數(shù)據(jù)赐写,數(shù)據(jù)主要從 DataSourcer 中獲取鸟蜡,如果本地有數(shù)據(jù),它會從 KTVHCDataFileSource 中獲取挺邀,反之會從 KTVHCDataNetworkSource中讀取數(shù)據(jù)揉忘,這里會走下載邏輯(KTVHCDownload)跳座。

工作流程如下
1.Client發(fā)出的請求被 HTTP Srever 接收到,HTTP Server 通過分析 HTTP Request 創(chuàng)建用于訪問 Data StorageData Request 對象泣矛。
2.HTTP Server 使用 Data Request 創(chuàng)建 Data Reader疲眷,并以此作為從Data Storage 獲取數(shù)據(jù)的通道。
3.Data Reader 分析 Data Request 中的 Range 創(chuàng)建對應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)源 Data Network Source 和文件數(shù)據(jù)源 Data File Source您朽,并通過 Data Sourcer 進(jìn)行管理狂丝。
4.Data Sourcer開始加載數(shù)據(jù)。
5.Data ReaderData Sourcer 讀取數(shù)據(jù)并通過 HTTP Server 回傳給 Client哗总。

HttpServer

這層設(shè)計比較簡單几颜,主要是用了 CocoaHTTPServer 來作為本地的 HttpServerHttpServer 說白了就是一個手機(jī)端的服務(wù)器讯屈,用來與用戶(作者說的 client)交互蛋哭,用戶提出數(shù)據(jù)加載需求后,它會從不同的地方來獲取數(shù)據(jù)源涮母,如果本地沒有會從網(wǎng)絡(luò)中下載數(shù)據(jù)谆趾。它主要的作用是 hook 播放器的網(wǎng)絡(luò)請求,進(jìn)行數(shù)據(jù)的加載哈蝇。它主要的類如圖:

  • KTVHCHTTPServer:是一個單例棺妓,用來管理 HttpServer 服務(wù),負(fù)責(zé)開啟或關(guān)閉服務(wù)炮赦;
  • KTVHCHTTPConnection:它繼承于 HTTPConnection怜跑,表示一個連接,它主要為 HttpServer 提供 Response吠勘。
  • KTVHCHTTPRequest:一個請求性芬,也就是一個數(shù)據(jù)模型;
  • KTVHCHTTPResponse:一個 Response剧防;
  • KTVHCHTTPResponsePing:主要用來 ping 時的 Response植锉;
  • KTVHCHTTPURL:主要用來處理 URL,比如把原 Url 生成 proxy url峭拘;
DataStroage

主要用來緩存數(shù)據(jù)俊庇,加載數(shù)據(jù),也就是提供數(shù)據(jù)給 HttpServer鸡挠。上面代碼中關(guān)鍵的一句代碼 [KTVHCHTTPResponse responseWithConnection:self dataRequest:dataRequest]辉饱,它會在這個方法的內(nèi)部使用KTVHCDataStorage 生成一個 KTVHCDataReader,負(fù)責(zé)讀取數(shù)據(jù)拣展。生成 KTVHCDataReader 后通過 [self.reader prepare] 來準(zhǔn)備數(shù)據(jù)源 KTVHCDataSourcer彭沼,這里主要有兩個數(shù)據(jù)源,KTVHCDataFileSourceKTVHCDataNetworkSource备埃,它實現(xiàn)了協(xié)議 KTVHCDataSourceProtocol姓惑。KTVHCDataNetworkSource 會通過 KTVHCDownload 下載數(shù)據(jù)褐奴。

  • KTVHCDataStorage: 是一個單例,它負(fù)責(zé)管理整個緩存于毙,比如讀取敦冬、保存和合并緩存;
  • KTVHCDataReader:主要用來讀取數(shù)據(jù)望众;
  • KTVHCDataRequest:用來請求數(shù)據(jù)匪补,表示一個請求;
  • KTVHCDataResponse:一個數(shù)據(jù)響應(yīng)烂翰;
  • KTVHCDataReader:讀取數(shù)據(jù);
  • KTVHCDataCacheItem:緩存數(shù)據(jù)模型蚤氏,表一個緩存項甘耿;
  • KTVHCDataCacheItemZone:緩存區(qū),一個緩存項中會有多個緩存區(qū)竿滨,比如0-99佳恬,100-299 等;
  • KTVHCDataSourcer:數(shù)據(jù)源中心于游,負(fù)責(zé)處理不同數(shù)據(jù)源毁葱,它包含有一個數(shù)據(jù)隊列 KTVHCDataSourceQueue
  • KTVHCDataSourceQueue:數(shù)據(jù)隊列贰剥;
  • KTVHCDataSourceProtocol:一個協(xié)議倾剿,作為數(shù)據(jù)源時需要實現(xiàn)這個協(xié)議;
  • KTVHCDataFileSource:本地數(shù)據(jù)源蚌成,實現(xiàn)了 KTVHCDataSourceProtocol 協(xié)議前痘;
  • KTVHCDataNetworkSource:網(wǎng)絡(luò)數(shù)據(jù)源,實現(xiàn)了KTVHCDataSourceProtocol 協(xié)議担忧;
  • KTVHCDataUnit:數(shù)據(jù)單元芹缔,相當(dāng)于一個緩存目錄,比如一個視頻的緩存瓶盛;
  • KTVHCDataUnitItem:數(shù)據(jù)單元項最欠,緩存目錄下不同片段的緩存;
  • KTVHCDataUnitPool:數(shù)據(jù)單元池惩猫,它是一個單例芝硬,含有一個 KTVHCDataUnitQueue
  • KTVHCDataUnitQueue:數(shù)據(jù)單元隊列帆锋,保存了多個 KTVHCDataUnit吵取,它會以 archive 的方式緩存到本地;
接入緩存
- (void)initCache {
    NSError *error = nil;
    [KTVHTTPCache proxyStart:&error];
    if (error) {
        NSLog(@"Proxy Start Failure, %@", error);
    }
    // 設(shè)置緩存最大容量
    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捺氢。

實現(xiàn)預(yù)加載

當(dāng)播放視屏列表時藻丢,最好在播放當(dāng)前視頻時,能夠預(yù)加載下幾個即將要播放的視頻摄乒。
可以使用NSOperationQueue操作隊列在實現(xiàn)在后臺提前預(yù)加載待播放的視頻悠反。在當(dāng)前視頻的鏈接配置完畢時,可以根據(jù)業(yè)務(wù)實際需要馍佑,將下一個或下幾個視頻url用NSOperation加到NSOperationQueue中斋否,在后臺進(jìn)行預(yù)加載,這樣當(dāng)用戶滑動視頻拭荤,下一個視頻就已經(jīng)是提前預(yù)加載好的了茵臭。當(dāng)然,這里只是簡單提供思路舅世,項目中使用NSOperationQueue也是很方便就能實現(xiàn)的旦委,可以控制最大并發(fā)數(shù)量,是預(yù)加載當(dāng)前index前面的視頻還是后面的視頻雏亚,弱網(wǎng)是否執(zhí)行預(yù)加載缨硝,具體的預(yù)加載邏輯還是要結(jié)合業(yè)務(wù)來操作。

讀懂「 唱吧KTVHTTPCache 」設(shè)計思想

唱吧 iOS 音視頻緩存處理框架

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罢低,一起剝皮案震驚了整個濱河市查辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奕短,老刑警劉巖宜肉,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翎碑,居然都是意外死亡谬返,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門日杈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遣铝,“玉大人,你說我怎么就攤上這事莉擒∧鹫ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵涨冀,是天一觀的道長填硕。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么扁眯? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任壮莹,我火速辦了婚禮,結(jié)果婚禮上姻檀,老公的妹妹穿的比我還像新娘命满。我一直安慰自己,他們只是感情好绣版,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布胶台。 她就那樣靜靜地躺著,像睡著了一般杂抽。 火紅的嫁衣襯著肌膚如雪诈唬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天默怨,我揣著相機(jī)與錄音讯榕,去河邊找鬼。 笑死匙睹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的济竹。 我是一名探鬼主播痕檬,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼送浊!你這毒婦竟也來了梦谜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤袭景,失蹤者是張志新(化名)和其女友劉穎唁桩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耸棒,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡荒澡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了与殃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单山。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幅疼,靈堂內(nèi)的尸體忽然破棺而出米奸,到底是詐尸還是另有隱情,我是刑警寧澤爽篷,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布悴晰,位于F島的核電站,受9級特大地震影響逐工,放射性物質(zhì)發(fā)生泄漏铡溪。R本人自食惡果不足惜漂辐,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佃却。 院中可真熱鬧者吁,春花似錦、人聲如沸饲帅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灶泵。三九已至育八,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赦邻,已是汗流浹背髓棋。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留惶洲,地道東北人按声。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像恬吕,于是被迫代替她去往敵國和親签则。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容