? ? ? ? 最近的項目中用到了視頻播放的緩存技術(shù)公给,通俗的講就是視頻邊下載邊播放 已經(jīng)下載的部分需要緩存起來,下次播放或者快進蜘渣、快退或者無網(wǎng)絡時到播放到緩存的部分可以直接播放不用下載淌铐。?
? ? ? 找了一下相關(guān)的技術(shù)發(fā)現(xiàn)在iOS中官方支持的比較靈活能夠自定義的也就是AVPlayer了,但是它所能支持的格式比不多蔫缸,還好我的項目中夠用了腿准。當然還有其他的方式,比如Ijkplayer 但是它本身比不支持緩存拾碌,需要自己去添加吐葱,相比之下的難度大了不少。不過AVPlayer 也有先天的不足校翔,后面會講到弟跑。
在使用AVPlayer 之前我在網(wǎng)上找了很多的資料,可惜沒有找到一個可以處理緩存碎片的方法防症。只能是自己去寫一個了孟辑。緩存的難點在于碎片化,不是連續(xù)的中間需要去請求數(shù)據(jù)告希。要順序操作下來扑浸。
最初我實際操作了一段時間發(fā)現(xiàn)只要完成下載后的數(shù)據(jù) 跟碎片數(shù)據(jù)段的融合,和對碎片數(shù)據(jù)段的讀區(qū)兩個算法這個方案就解決了燕偶,現(xiàn)在回頭看看真是too young too simple 喝噪,后面AVPlayer 播放不流暢的坑耗費了我更多的時間。
當然 上面提到的兩套算法是核心指么,關(guān)于如何對AVPlayer 使用緩存酝惧,不是本文介紹的重點請先熟悉它的流程榴鼎。 首先如果沒有緩存那就直接創(chuàng)建了比較簡單。 把loader 下發(fā)的request 根據(jù) 它請求的區(qū)間段 利用前面提到的算法晚唇,返回一個 數(shù)組巫财,里面是 @{start,end,isNull} 字典 數(shù)據(jù)的區(qū)間段,表明數(shù)據(jù)段的開始哩陕,截止平项,和是否儲存,
然后加入到一個隊列中(NSOperation)悍及,每一個數(shù)據(jù)段都創(chuàng)建一個NSOperation 闽瓢,在NSOperation 中對已經(jīng)下載的部分把數(shù)據(jù)取出來直接返回給request隶症。對于沒有下載的去下載醋界,下載完成后用算法對碎片數(shù)據(jù)進行融合伴找。
以上就是最基本的流程坯癣,比較讓人頭疼的是AVPlayer 的特性,比如視頻已經(jīng)是完整時拖刃,它下發(fā)的request 請求的是整個視頻的數(shù)據(jù)薯演,然后一次性把這些數(shù)據(jù)返回給它贸诚,會讓播放器卡住 不再播放耻姥∠郏可能是因為數(shù)據(jù)量比較大。AVPlayer 對播放器的狀態(tài) 提示不是很清楚咏闪,而且很有限曙搬。
?好了先寫這些 ? 這是我項目的地址 ?感覺有用的記得給個星摔吏!
https://github.com/taohailong/AVPlayerCache.git
用pod添加
pod 'AVPlayerCacheLibrary', :git => 'https://github.com/taohailong/AVPlayerCache.git'