前言
本文針對視頻播放及緩存方案進行調研,對于Android端常用的視頻播放器的緩存策略介紹及實現原理。
播放器直連
本地存儲形式緩存
流程圖
image
優點
實現簡單,邏輯易懂。
缺點
- 用戶播放視頻的時候等待時間較長,起播慢
- 需要大量的控制視頻播放的邏輯來進行輔助,與播放器代碼耦合嚴重
- 每次seek(用戶拖動進度條的行為)切源耗時,seek后會切換到從網絡上讀取狀態,體驗較慢。
AndroidVideoCache
在播放器與視頻源服務器之間加了一層代理服務器,截取視頻播放器發送的請求,根據截取的請求,向網絡服務器請求數據,然后寫到本地。本地代理服務器從文件中讀取數據并發送給播放器進行播放。
AndroidVideoCache實現原理
流程圖
AndroidVideCache流程圖
Seek過程解析
Seek階段
Seek階段總流程圖
Seek開始
image
Seek1
image
Seek2
image
補洞階段
補洞階段是對于Seek階段遺留下來的,片段小于20kb的下載長度進行補充到片段數組的過程。
在第二次播放時,如果文件中有空洞,無論片段再小,也會保存到片段中,最后當配置數組為{0, length}的時候,length為視頻長度大小,也會存到片段中。
優勢
- 數據流是本地代理控制,方便加入緩存、預加載、防盜鏈等業務邏輯。提高了視頻下載的成功率,減少了視頻緩沖時間,提升用戶體驗。
- 與播放器邏輯完全解耦,對于播放器只是一個地址。
Qzon
Qzone的日均視頻播放量破十億,其中Android端的總播放量占比超過70%。所以Qzone的實現方案對我們來說很有借鑒意義。
最初的傳統的本地代理方案
QZon
帶來的問題
- 視頻下載和播放的業務邏輯復雜,過多的邏輯和下載本身耦合。
- 不容易接入第三方下載器和對下載過程進行監控。
優化過程
優化主要從如下幾個方面入手:
視頻優化過程
防盜鏈預拉取
防盜鏈預拉取
緩存分片
這里主要解決的問題是,之前單個的順序存儲方式無法對于播放空洞(非順序播放場景,例如拖動、續播等)進行緩存,降低了緩存率和命中率。
緩存分片
私有通道方案
私有通道方案
流量控制
流量控制
H265編碼
H265是新一代視頻編碼標準,相比原有使用H264編碼的視頻,具有更高的壓縮比,在畫質近似的前提下,H265編碼的視頻文件體積只有H264的一半甚至更少,因此,播放H265編碼的視頻能極大減少帶寬消耗。
具體編碼相關內容,請看直播技術點之編解碼基礎(一)