google搜索“iOS視頻變下邊播”,有好幾篇博客寫到了實(shí)現(xiàn)方法揉忘,其實(shí)只有一篇,其他都是copy的端铛,不過他們都是使用的本地代理服務(wù)器的方式泣矛,原理很簡單,但是缺點(diǎn)也很明顯禾蚕,需要自己寫一個本地代理服務(wù)器或者使用第三方庫httpSever您朽。如果使用httpSever作為本地代理服務(wù)器,如果只緩存一個視頻是沒有問題的换淆,如果緩存多個視頻互相切換哗总,本地代理服務(wù)器提供的數(shù)據(jù)很不穩(wěn)定,crash概率非常大倍试。
這里我采用ios7以后系統(tǒng)自帶的方法實(shí)現(xiàn)視頻邊下邊播讯屈,這里的邊下邊播不是單獨(dú)開一個子線程去下載,而是把視頻播放的數(shù)據(jù)給保存到本地县习。簡而言之耻煤,就是使用一遍的流量具壮,既播放了視頻,也保存了視頻哈蝇。
用到的框架:<AVFoundation/AVFoundation.h>
用到的播放器:AVplayer
先說一下avplayer自身的播放原理棺妓,當(dāng)我們給播放器設(shè)置好url等一些參數(shù)后,播放器就會向url所在的服務(wù)器發(fā)送請求(請求參數(shù)有兩個值炮赦,一個是offset偏移量怜跑,另一個是length長度,其實(shí)就相當(dāng)于NSRange一樣)吠勘,服務(wù)器就根據(jù)range參數(shù)給播放器返回數(shù)據(jù)性芬。這就是大致的原理,當(dāng)然實(shí)際的過程還是略微比較復(fù)雜剧防。
下面進(jìn)入主題
產(chǎn)品需求:
1.支持正常播放器的一切功能植锉,包括暫停、播放和拖拽
2.如果視頻加載完成且完整峭拘,將視頻文件保存到本地cache俊庇,下一次播放本地cache中的視頻,不再請求網(wǎng)絡(luò)數(shù)據(jù)
3.如果視頻沒有加載完(半路關(guān)閉或者拖拽)就不用保存到本地cache
實(shí)現(xiàn)方案:
1.需要在視頻播放器和服務(wù)器之間添加一層類似代理的機(jī)制鸡挠,視頻播放器不再直接訪問服務(wù)器辉饱,而是訪問代理對象,代理對象去訪問服務(wù)器獲得數(shù)據(jù)拣展,之后返回給視頻播放器彭沼,同時代理對象根據(jù)一定的策略緩存數(shù)據(jù)。
2.AVURLAsset中的resourceLoader可以實(shí)現(xiàn)這個機(jī)制备埃,resourceLoader的delegate就是上述的代理對象姓惑。
3.視頻播放器在開始播放之前首先檢測是本地cache中是否有此視頻,如果沒有才通過代理獲得數(shù)據(jù)按脚,如果有挺益,則直接播放本地cache中的視頻即可。
視頻播放器需要實(shí)現(xiàn)的功能
1.有開始暫停按鈕
2.顯示播放進(jìn)度及總時長
3.可以通過拖拽從任意位置開始播放視頻
4.視頻加載中的過程和加載失敗需要有相應(yīng)的提示