本文主要介紹采用RecyclerView配合PagerSnapHelper實現(xiàn)短視頻滑動播放內(nèi)容。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)絡空間、營銷軟件、網(wǎng)站建設(shè)、阿里地區(qū)網(wǎng)站維護、網(wǎng)站推廣。
主頁布局文件定義RecyclerView,為RecyclerView建立對應適配器。
適配器條目中添加視頻播放容器FrameLayout及封面ImageVIew.
PagerSnapHelper 結(jié)合 LinearLayoutManager 實現(xiàn)滑動管理,實現(xiàn)監(jiān)聽任務。
PagerSnapHelper can help achieve a similar behavior to
ViewPager. Set both RecyclerView and the items of the RecyclerView.Adapter to have android.view.ViewGroup.LayoutParams#MATCH_PARENT height and width and then attach PagerSnapHelper to the RecyclerView using #attachToRecyclerView(RecyclerView)}.
RecyclerView管理器為LinearLayoutManager 時,默認為縱向滑動,如果想采用橫向滑動,就設(shè)置其滑動方向為RecyclerView.HORIZONTAL。同理,我們也可以這樣采用setOrientation(RecyclerView.HORIZONTAL) 方法去改變滑動方向。
為RecyclerView 設(shè)置管理器PagerLayoutManager,設(shè)置其Adapter數(shù)據(jù)內(nèi)容,進行封面展示,且此時會回調(diào)onPageInitComplete()方法,進行首個視頻播放。對RecyclerView進行滑動,當頁面滑動結(jié)束后,會先回調(diào)管理器中onPageRelease()方法,此時可對進行中播放器進行停止釋放;然后,回調(diào)onPageSelected()方法,對選中頁面內(nèi)容進行展示播放。
當滑動后取消時,要進行判斷當前位置,避免當前頁視頻停止或重復播放。
初始化播放器內(nèi)容
開始播放視頻內(nèi)容,進行播放器視圖加載
停止播放,移除視圖
例子中采用了自定義空布局的播放器繼承自GSY開源播放器,單純進行視頻播放,當然也可以采用其它的播放器餃子或者IjkPlayer等。
布局文件
簡單的滑動播放這些就完成了,例子也只是僅僅提供了實現(xiàn)的方法和思路,供大家進行學習參考,實際使用中可以對其進一步地進行封裝及處理,接下來也會補充一些滑動播放適配器的數(shù)據(jù)加載處理以及多布局內(nèi)容展示等內(nèi)容。
Android使用FFmpeg播放視頻(一):視頻播放
Android NDK開發(fā):利用OpenSL ES實現(xiàn)聲音播放
這里我創(chuàng)建了兩個JNI函數(shù),一個是播放的,一個是釋放的如下:
這里我在用于播放的JNI函數(shù)中依次初始化了FFmpeg和OpenSLES
其中初始化FFmpeg的函數(shù)中的邏輯其實和使用FFmpeg播放視頻畫面中的邏輯差不多,主要區(qū)別就是要找到音頻的索引以及后面對于解析音頻的一些配置;而初始化OpenSLES基本就和之前使用OpenSLES播放PCM數(shù)據(jù)是一樣的,具體如下:
最后再加入釋放資源的邏輯即可
這里的案例源碼是和之前播放視頻畫面的分開了
VideoView是Android用來實現(xiàn)視頻播放的主要控件,VideoView內(nèi)部是使用MediaPlayer來對視頻文件進行控制的。但是他支持的格式比較單一,只支持mp4,avi,3gp等格式的視頻。
Android提供了常見的視頻編碼,解碼機制,使用Android自帶的MediaPlayer,MediaController等類可以很方便的實現(xiàn)視頻播放的功能。支持的視頻格式有MP4和3GP等。這些多媒體數(shù)據(jù)可以來自于Android應用的資源文件,也可以來自于外部存儲器上的文件,甚至可以是來自于網(wǎng)絡上的文件流。
1、MediaController+VideoView實現(xiàn)方式
這種方式是最簡單的實現(xiàn)方式。VideoView繼承了SurfaceView同時實現(xiàn)了MediaPlayerControl接口,MediaController則是安卓封裝的輔助控制器,帶有暫停,播放,停止,進度條等控件。通過VideoView+MediaController可以很輕松的實現(xiàn)視頻播放、停止、快進、快退等功能。
布局文件如下:
使用此實現(xiàn)方式的步驟:
1.加載指定的視頻文件
2.建立VideoView和MediaController之間的關(guān)聯(lián),這樣就不需要自己去控制視頻的播放、暫停等。讓MediaController控制即可。
3.VideoView獲取焦點。
2、MediaPlayer+SurfaceView+自定義控制器
雖然VideoView的實現(xiàn)方式很簡單,但是由于是自帶的封裝好的類,所以無論是播放器的大小、位置以及控制都不受我們控制。
這種實現(xiàn)方式步驟如下:
1.創(chuàng)建MediaPlayer對象,并讓它加載指定的視頻文件??梢允菓玫馁Y源文件、本地文件路徑、或者URL。
2.在界面布局文件中定義SurfaceView組件,并為SurfaceView的SurfaceHolder添加Callback監(jiān)聽器。
3.調(diào)用MediaPlayer對象的setDisplay(SurfaceHolder sh)將所播放的視頻圖像輸出到指定的SurfaceView組件。
4.調(diào)用MediaPlayer對象的prepareAsync()或prepare()方法裝載流媒體文件
5.調(diào)用MediaPlayer對象的start()、stop()和pause()方法來控制視頻的播放。
在實現(xiàn)第二步之前需要先給surfaceHolder設(shè)置一個callback,callback的3個回調(diào)函數(shù)如下:
3、MediaPlayer+SurfaceView+MediaController
第二種實現(xiàn)方式使用的是自定義控件,MediaPlayer+SurfaceView也可以使用系統(tǒng)自帶的MediaController控制器。
使用這個方式實現(xiàn),布局文件只需一個SurfaceView即可,其他的控件都交給MediaController控制器,布局文件如下:
實際過程中推薦大家使用B站的播放器ijkplayer非常好用!