如果使用httpSever作為本地代理服務(wù)器,如果只緩存一個(gè)視頻是沒有問題的,如果緩存多個(gè)視頻互相切換,本地代理服務(wù)器提供的數(shù)據(jù)很不穩(wěn)定,crash概率非常大。
這里我采用ios7以后系統(tǒng)自帶的方法實(shí)現(xiàn)視頻邊下邊播,這里的邊下邊播不是單獨(dú)開一個(gè)子線程去下載,而是把視頻播放的數(shù)據(jù)給保存到本地。簡(jiǎn)而言之,就是使用一遍的流量,既播放了視頻,也保存了視頻。
用到的框架:<AVFoundation/AVFoundation.h>用到的播放器:AVplayer
先說一下avplayer自身的播放原理,當(dāng)我們給播放器設(shè)置好url等一些參數(shù)后,播放器就會(huì)向url所在的服務(wù)器發(fā)送請(qǐng)求(請(qǐng)求參數(shù)有兩個(gè)值,一個(gè)是offset偏移量,另一個(gè)是length長(zhǎng)度,其實(shí)就相當(dāng)于NSRange一樣),服務(wù)器就根據(jù)range參數(shù)給播放器返回?cái)?shù)據(jù)。這就是大致的原理,當(dāng)然實(shí)際的過程還是略微比較復(fù)雜。
實(shí)現(xiàn)方案:
1.需要在視頻播放器和服務(wù)器之間添加一層類似代理的機(jī)制,視頻播放器不再直接訪問服務(wù)器,而是訪問代理對(duì)象,代理對(duì)象去訪問服務(wù)器獲得數(shù)據(jù),之后返回給視頻播放器,同時(shí)代理對(duì)象根據(jù)一定的策略緩存數(shù)據(jù)。
2.AVURLAsset中的resourceLoader可以實(shí)現(xiàn)這個(gè)機(jī)制,resourceLoader的delegate就是上述的代理對(duì)象。
3.視頻播放器在開始播放之前首先檢測(cè)是本地cache中是否有此視頻,如果沒有才通過代理獲得數(shù)據(jù),如果有,則直接播放本地cache中的視頻即可。