一.動態流中的視頻播放
1.列表中視頻播放的控件實現
Android原生提供的視頻播放空間VideoView ,繼承自SurfaceView,SurfaceView會單獨一個窗口用來繪制,它不在View hierachy中,顯示也不受View的屬性控制,不能進行平移,縮放等變換。因此在ListView 或者RecyclerView中不適合用SurfaceView來視頻播。
由于SurfaceView的不足,需要引入Android在4.0中加入的TextureView,它并沒有創建一個單獨的窗口用來繪制,這使得它可以像一般的View一樣執行一些變換操作,設置透明度等,也很方便的放在其它ViewGroup中。
所以要在ListView或者RecyclerView中播放視頻,我們就需要實現基于TextureView的VideoView
二.列表中播放交互
timeline中的視頻播放必須支持以下一些特性:
1.自動播放及停止
通過Listview或者RecyclerView中滑動來判斷video item是否在windows中來判定自動播放及暫停,要點如下:
- 判斷滑動方向
- item可見高度比(60% ~ 90%)
- fling時忽略計算直到state -> idle
2.無聲播放
MediaPlayer來 setVolume(0,0)? 視頻云sdk支持
3.重新播放
設計緩存來支持
三.列表小視頻播放性能
1.播放控制線程設計
MediaPlayer的狀態圖如下:
mediaplayer_state_diagram.gif
MediaPlayer的prepare()、reset()、release()等操作都是耗時操作,不應該在UI線程中處理,解決辦法是單開PlayerHandler來處理所有操作,然后再將事件通知post到主線程中。
2.緩存設計
目前app里MV播放沒有緩存系統支持,導致每次重新播放都要重新加載,動態小視頻中必然需要引入一套緩存,這里可參考mp3播放緩存(分段緩存)來實現小視頻的緩存,提高用戶體驗,不需要內存緩存只需要文件緩存。
四.視頻云SDK接入
1.系統自帶的MediaPlayer來播放
缺點:
- 支持格式少
- 經常有用戶反饋黑屏、無聲音等問題
- 廠商修改導致不穩定
優點:
- 沿用當前MV播放方案,實現速度上會相對快一點
2.網易視頻云提供的播放SDK
- 整合自解碼播放、直播等so
- 穩定性測試