? ? ? ?最近的項目需要實現(xiàn)視頻的播放功能,底層的播放實現(xiàn)需要兼容常規(guī)的url視頻源播放和基于搜狐SDK的視頻源播放(視頻id),通過了解視頻播放的相關(guān)知識點,總結(jié)了一下視頻相關(guān)知識。?
播放器控件相關(guān)知識點匯總:
一:播放器相關(guān)基礎(chǔ)知識點介紹
二:Android中視頻播放器的選擇
三:實現(xiàn)視頻播放的幾種方式介紹
四:播放器控件相關(guān)開源項目介紹
五:播放器的常見使用場景
六:手?jǐn)]播放器控件遇到的問題
七:播放器不同模塊代碼的解耦
八:播放器控件實現(xiàn)思路建議
九:遇到相關(guān)疑難雜癥
十:擴(kuò)展閱讀
一:播放器相關(guān)基礎(chǔ)知識點介紹
? ? ? 視頻播放的流程常規(guī)的視頻播放分為傳輸,解封裝,解碼,繪制四個步驟,以下按播放網(wǎng)站上(HTTP)的mp4文件為例,簡單介紹一下幾個過程:

HTTP傳輸:
描述:播放器使用HTTP協(xié)議把MP4下載下來,這部分需求一般需要邊下邊播,服務(wù)器的HttpServer一定要支持HTTPSeek,因為播放的過程中需要跳轉(zhuǎn)到不同的位置下載內(nèi)容,比如MP4結(jié)構(gòu)中的moov元數(shù)據(jù)信息在很多視頻文件中都被放置在文件末尾了。
MP4解封包:
描述:這部分我們常見的封包格式就是mp4,視頻編碼后H264數(shù)據(jù)被拆分為多個片段封包到mp4中,解封包就是從mp4中解析出H264視頻裸碼流的過程。
H264解碼:
描述:視頻解碼就是將h264裸碼流解析成視頻像素數(shù)據(jù)的過程(一般是yuv,也可以是rgba,類似于將jpg圖片解碼為bitmap數(shù)據(jù)。h264格式可以使用Android系統(tǒng)提供MediaCoder硬解碼,也可以使用FFMpeg進(jìn)行軟解碼。
FFmpeg介紹:
描述:是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。
硬解碼和軟解碼:
一、軟解碼和硬解碼如何區(qū)分
軟解碼:使用CPU進(jìn)行解碼
硬解碼:使用非CPU進(jìn)行解碼,如顯卡GPU、專用的DSP、FPGA、ASIC芯片等
二、軟解碼和硬解碼比較
軟解碼:實現(xiàn)直接、簡單,參數(shù)調(diào)整方便,升級易,但CPU負(fù)載重,性能較硬解碼低,低碼率下質(zhì)量通常比硬解碼要好一點。
硬解碼:性能高,低碼率下通常質(zhì)量低于硬解碼器,但部分產(chǎn)品在GPU硬件平臺移植了優(yōu)秀的軟解碼算法(如X264)的,質(zhì)量基本等同于軟解碼。
優(yōu)缺點對比:

結(jié)論:
1、根據(jù)項目的需要,現(xiàn)在幾乎所有的設(shè)備都支持硬解碼和軟解碼,之前更多的人愿意選擇軟解碼,更大的原因是因為硬件解碼支持的格式較少,而軟解碼對于格式是不受限制的。
2、現(xiàn)在隨著硬件的不斷提高,解碼技術(shù)的不斷成熟和完善,我是更傾向硬解碼,但硬件提升的同時,CPU也在不斷的優(yōu)化和提高,現(xiàn)在也不需要像之前那樣盡可能節(jié)省CPU,現(xiàn)在處于性能過剩的時代,CPU已經(jīng)很難處于負(fù)荷狀態(tài),選擇軟解碼或者硬解碼都是沒有誰對誰錯,剛剛圖上已經(jīng)貼出和標(biāo)記兩者的優(yōu)點,根據(jù)項目需要選擇。
圖像渲染:SurfaceView、TextureView、GLSurfaceView、SurfaceTexture的區(qū)別
一、SurfaceView
? ? ? ?是一個可以在子線程中更新UI的View,且不會影響到主線程。它為自己創(chuàng)建了一個窗口(window),就好像在視圖層次(View Hierarchy)上穿了個“洞”,讓繪圖層(Surface)直接顯示出來。但是,和常規(guī)視圖(view)不同,它沒有動畫或者變形特效,一些View的特性也無法使用。
概括:
1、SurfaceView獨立于視圖層次(View Hierarchy),擁有自己的繪圖層(Surface),但也沒有一些常規(guī)視圖(View)的特性,如動畫等。
2、SurfaceView的實現(xiàn)中具有兩個繪圖層(Surface),即我們所說的雙緩沖機(jī)制。我們的繪制發(fā)生在后臺畫布上,并通過交換前后臺畫布來刷新畫面,可避免局部刷新帶來的閃爍,也提高了渲染效率。
3、SurfaceView中的SurfaceHolder是Surface的持有者和管理控制者。
4、SurfaceHolder.Callback的各個回調(diào)發(fā)生在主線程。
二、GLSurfaceView
? ? ? ?繼承SurfaceView,除了擁有SurfaceView所有特性外,還加入了EGL(EGL是OpenGL ES和原生窗口系統(tǒng)之間的橋梁) 的管理,并自帶了一個單獨的渲染線程。
概括:
1、繼承自SurfaceView,擁有其所有特性。
2、加入了EGL管理,是SurfaceView應(yīng)用OpenGL ES的典型場景。
3、有單獨的渲染線程GLThread。
4、單獨出了Renderer接口負(fù)責(zé)實際渲染,不同的Renderer實現(xiàn)相當(dāng)于不同的渲染策略,使用方式靈活(策略模式)。
三、SurfaceTexture
? ? ? ?Android3.0(API 11)新加入的一個類,不同于SurfaceView會將圖像顯示在屏幕上,SurfaceTexture對圖像流的處理并不直接顯示,而是轉(zhuǎn)為GL外部紋理。
概括:
1、SurfaceTexture可以從圖像流(相機(jī)、視頻)中捕獲幀數(shù)據(jù)用作OpenGL ES外部紋理(GL_TEXTURE_EXTERNAL_OES),實現(xiàn)無縫連接。
2、我們可以很方便的對這個外部紋理進(jìn)行二次處理(如添加濾鏡等)。
3、輸出目標(biāo)是Camera或MediaPlayer時,可以用SurfaceTexture代替SurfaceHolder,這樣圖像流將把所有幀傳給SurfaceTexture而不是顯示在設(shè)備上。
4、使用updateTexImage()方法更新最新的圖像。
四、TextureView
? ? ? TextureView是Android4.0(API 14)引入,它必須使用在開啟了硬件加速的窗體中。除了擁有SurfaceView的特性外,它還可以進(jìn)行像常規(guī)視圖(View)那樣進(jìn)行平移、縮放等動畫。
概括:
1、必須開啟硬件加速(這個默認(rèn)就是開啟的)。
2、可以像常規(guī)視圖(View)那樣使用它,包括進(jìn)行平移、縮放等操作。
3、TextureView重載了draw()方法,主要是使用SurfaceTexture中收到的圖像數(shù)據(jù)作為紋理更新到對應(yīng)的HardwareLayer中。
4、通過SurfaceTextureListener接口讓使用者知道SurfaceTexture的各種狀態(tài)。
SurfaceView對比TextureView:

Open GL,Open GL ES與Android EGL介紹:
介紹:OpenGL ES(OpenGL for Embedded Systems,以下簡稱OpenGL)
介紹:是OpenGL三維圖形API的子集,針對手機(jī)、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計。該API由Khronos集團(tuán)定義推廣,Khronos是一個圖形軟硬件行業(yè)協(xié)會,該協(xié)會主要關(guān)注圖形和多媒體方面的開放標(biāo)準(zhǔn)。
Android EGL:
介紹:EGL是介于諸如OpenGL或OpenVG的Khronos渲染API與底層本地平臺窗口系統(tǒng)的接口,是OpenGL ES和本地窗口系統(tǒng)(Native Window System)之間的通信接口,它被用于處理圖形管理、表面/緩沖捆綁、渲染同步及支援使用其他KhronosAPI進(jìn)行的高效、加速、混合模式2D和3D渲染。
EGL的主要功能:
EGL是用來管理繪圖表面(Drawing surfaces),并且提供了如下的機(jī)制
1、與本地窗口系統(tǒng)進(jìn)行通信
2、查找繪圖表面可用的類型和配置信息
3、創(chuàng)建繪圖表面
4、同步OpenGL ES 2.0和其他的渲染API(Open VG、本地窗口系統(tǒng)的繪圖命令等)
5、管理渲染資源,比如材質(zhì)
二:Android中視頻播放器的選擇
1、MediaPlayer
描述:在Android系統(tǒng)中對于視頻播放器有原生的實現(xiàn)MediaPlayer,以及將MediaPlayer和SurfaceView封裝在一起的VideoView,兩者都只是使用硬解碼播放,基本上只支持本地和HTTP協(xié)議的視頻播放,擴(kuò)展性都很差,只適合最簡單的視頻播放需求。
2、ExoPlayer
描述:谷歌后來有開源了一個播放器項目[ExoPlayer])(https://github.com/google/ExoPlayer),提供了更好的擴(kuò)展性和定制能力,并加入了對DASH和HLS等直播協(xié)議的支持,但也只支持硬解碼,如果項目中只需要支持對H264格式的視頻播放,以及流媒體協(xié)議比較常規(guī)(比如HTTP,HLS),基于ExoPlayer定制也是不錯的選擇。?
? ? ? ?與Android內(nèi)置的MediaPlayer相比,ExoPlayer具有許多優(yōu)點:
1、支持HTTP上的動態(tài)自適應(yīng)流DASH和SmoothStreaming。
2、支持高級的HLS特點,例如正確的處理#EXT-X-DISCONTINUITY標(biāo)簽。
3、能夠無縫的合并,串聯(lián),循環(huán)播放媒體文件。
4、能夠被高度擴(kuò)展和定制,以適用不同的場景,ExoPlayer專門設(shè)計了這一點,大部分組件都可以自己替換。(可以自定義視頻緩存,視頻進(jìn)度實時回調(diào))
5、各個組件可以自定義,還可以接入ffmpeg組件,基本能滿足99.9%的需求。(具體詳情去官網(wǎng)了解)
缺點:
1、在某些設(shè)備上播放音頻,ExoPlayer可能會比MediaPlayer消耗更多的電量。
2、最低支持版本4.4?
3、實現(xiàn)比較復(fù)雜
3、ijkplayer
描述:ijkplayer是Bilibili公司開源的播放器實現(xiàn),整合了FFMpeg,ExoPlayer,MediaPlayer等多種實現(xiàn),提供了類似于MediaPlayer的API,可以實現(xiàn)軟硬解碼自由切換,自定義TextureView實現(xiàn),同時得益于FFMpeg的能力,也能支持多種流媒體協(xié)議(RTSP,RTMP,HLS等),多種視頻編碼格式(h264, mpeg4,mjpeg),具有很高的靈活性,可以定制實現(xiàn)自己特色的播放器(比如支持視頻縮放,視頻翻轉(zhuǎn)等)。
三:實現(xiàn)視頻播放的幾種方式介紹
一:MediaController+VideoView實現(xiàn)方式(靈活度低,SDK已包含)
介紹:這種方式是最簡單的實現(xiàn)方式,VideoView繼承了SurfaceView同時實現(xiàn)了MediaPlayerControl接口,MediaController則是安卓封裝的輔助控制器,帶有暫停,播放,停止,進(jìn)度條等控件。通過VideoView+MediaController可以很輕松的實現(xiàn)視頻播放、停止、快進(jìn)、快退等功能,雖然VideoView的實現(xiàn)方式很簡單,但是由于是自帶的封裝好的類,所以無論是播放器的大小、位置以及控制都不受我們控制。
二:MediaPlayer+SurfaceView+MediaController(靈活度中,SDK已包含)

描述:MediaController是安卓封裝的輔助控制器,帶有暫停,播放,停止,進(jìn)度條等控件,播放實現(xiàn)使用SurfaceView作為播放容器實現(xiàn),播放的控制使用MediaPlayer實現(xiàn),這種方式由于使用了MediaController,同樣無法定制播放器控件,不過使用MediaPlayer實現(xiàn)播放,提供了視頻播放時更多的回調(diào)函數(shù),可以實現(xiàn)更多元化的需求,例如:回調(diào)播放視頻的寬高,視頻播放開始,停止,完成等回調(diào)。
三:MediaPlayer+SurfaceView+自定義控制器(靈活度高,SDK已包含)
描述:使用MediaPlayer實現(xiàn)視頻播放,可以提供視頻播放時狀態(tài)的多種回調(diào),然后不使用MediaController,而是使用自定義的控制器,實現(xiàn)更加靈活的界面需求。
四:使用Exo,IJKPlayer,F(xiàn)FMPEG等開源實現(xiàn)(靈活度極高,接入相對復(fù)雜,引入外部jar,aar或者M(jìn)odule)
描述:與Android內(nèi)置的MediaPlayer相比,ExoPlayer具有許多優(yōu)點:
1、支持HTTP上的動態(tài)自適應(yīng)流DASH和SmoothStreaming。
2、支持高級的HLS特點,例如正確的處理#EXT-X-DISCONTINUITY標(biāo)簽。
3、能夠無縫的合并,串聯(lián),循環(huán)播放媒體文件。
4、能夠被高度擴(kuò)展和定制,以適用不同的場景,ExoPlayer專門設(shè)計了這一點,大部分組件都可以自己替換。(例如:視頻緩存的定制)
5、各個組件可以自定義,還可以接入ffmpeg組件,基本能滿足99.9%的需求。(具體詳情去官網(wǎng)了解)
五:使用愛奇藝,騰訊,優(yōu)酷,搜狐視頻SDK(靈活度取決于SDK開放接口)
描述:視頻播放的相關(guān)數(shù)據(jù)及狀態(tài),不同的SDK會有不同的接口設(shè)計,接入一般有官方demo,定制的東西相對較少,接入相對簡單,一般使用視頻資源id標(biāo)識資源。
四:播放器控件相關(guān)開源項目介紹
一:ijkplayer(26.5k)
項目地址:https://github.com/Bilibili/ijkplayer
介紹:Ijkplayer是Bilibili發(fā)布的基于FFplay的輕量級Android/iOS視頻播放器。實現(xiàn)了跨平臺功能,API易于集成;編譯配置可裁剪,方便控制安裝包大??;支持硬件加速解碼,更加省電;提供Android平臺下應(yīng)用彈幕集成的解決方案。
二:ExoPlayer(15.6k)
項目地址:https://github.com/google/ExoPlayer
介紹:這款由YouTube開發(fā)的播放器真的是非常強(qiáng)大。對于自定義播放器非常友好,里面講很多模塊抽象成獨立的組件可供使用者自行定制,當(dāng)然官方也提供了一些默認(rèn)的實現(xiàn)。
優(yōu)點:
1、在不同Android版本和不同的手機(jī)設(shè)備上擁有更統(tǒng)一的行為表現(xiàn),更少的設(shè)備差異帶來的問題。
2、作為一個獨立的庫,可以很輕易的升級。
3、可以根據(jù)用戶的需求方便的對播放器行為進(jìn)行定制和擴(kuò)展,ExoPlayer中的很多組件都支持自定義和擴(kuò)展。
4、支持播放視頻列表,并且可以支持對視頻的裁剪、合并,以及循環(huán)播放設(shè)置。
5、支持更多的視頻格式,包括MediaPlayer不支持的DASH、SmoothStreaming。
6、支持Widevine功能,這個功能可以下載和播放經(jīng)過Google加密的視頻文件。
7、能夠方便的集成額外的擴(kuò)展庫,比如IMA擴(kuò)展庫。
缺點:
1、相比于Android原生的MediaPlayer,ExoPlayer將顯著的消耗更多的電量
2、集成ExoPlayer將對你的APP包體增加幾百KB的大小
三:GSYVideoPlayer(14.1k)
項目地址:https://github.com/CarGuo/GSYVideoPlayer
介紹:視頻播放器,支持基本的拖動,聲音、亮度調(diào)節(jié),支持邊播邊緩存,支持視頻本身自帶rotation的旋轉(zhuǎn)(90,270之類),重力旋轉(zhuǎn)與手動旋轉(zhuǎn)的同步支持,支持列表播放,直接添加控件為封面,列表全屏動畫。
主要特點:
1、支持基本的拖動,聲音、亮度調(diào)節(jié)。
2、支持邊播邊緩存,使用了AndroidVideoCache。(https://github.com/danikula/AndroidVideoCache)
3、支持視頻本身自帶rotation的旋轉(zhuǎn)。
4、增加了重力旋轉(zhuǎn)與手動旋轉(zhuǎn)的同步支持。
5、支持列表播放。
6、直接添加控件為封面。
7、全屏和播放等的動畫效果。
8、列表的全屏效果優(yōu)化,多種配置模式。
9、列表的小窗口播放,可拖動。
10、網(wǎng)絡(luò)視頻加載速度。
11、鎖定/解鎖全屏點擊功能。
12、支持快播和慢播。
13、調(diào)整顯示比例:默認(rèn)、16:9、4:3。
14、調(diào)整不同清晰度的支持。
15、支持IJKPlayer和EXOPlayer切換。
16、進(jìn)度條小窗口預(yù)覽(測試)。
17、Https支持。
18、連續(xù)播放一個列表的視頻。
19、支持全屏與非全屏兩套布局切換
20、彈幕支持
四:JieCaoVideoPlayer(10.1k)
項目地址:https://github.com/lipangit/JieCaoVideoPlayer(JiaoZiVideoPlayer)
介紹:節(jié)操視頻播放器是一個讓開發(fā)者可以三兩行代碼就能集成到應(yīng)用中的視頻播放框架,并且提供了開放的接口來滿足不同開發(fā)者的不同需求。
JiaoZiVideo主要特點:
1、可以完全自定義UI和任何功能
2、一行代碼切換播放引擎,支持的視頻格式和協(xié)議取決于播放引擎,android.media.MediaPlayerijkplayer
3、完美檢測列表滑動
4、可實現(xiàn)全屏播放,小窗播放
5、能在ListView、ViewPager和ListView、ViewPager和Fragment等多重嵌套模式下全屏工作
6、可以在加載、暫停、播放等各種狀態(tài)中正常進(jìn)入全屏和退出全屏
7、多種視頻適配屏幕的方式,可鋪滿全屏,可以全屏剪裁
8、重力感應(yīng)自動進(jìn)入全屏
9、全屏后手勢修改進(jìn)度和音量。
10、Home鍵退出界面暫停播放,返回界面繼續(xù)播放。
Android主流開源視頻播放器對比:(時間節(jié)點:2019年6月)

優(yōu)缺點對比:

市面上熱度最高的開源播放器就是ijkplayer和Exoplayer,其他大多數(shù)是在它們的基礎(chǔ)上進(jìn)行二次封裝。

五:播放器的常見使用場景
場景一:一個Activity就顯示一個視頻控件

解析:如果需要實現(xiàn)點擊全屏顯示功能,需要添加輔助類:OrientationUtils,實現(xiàn)該
場景轉(zhuǎn)屏相關(guān)邏輯實現(xiàn)。(參考開源項目:GSYVideoPlayer)
場景二:視頻控件嵌套在列表的中

解析:當(dāng)視頻控件嵌套在列表里面時的注意點:
1、列表滑動無法看到視頻時,視頻停止播放。
2、列表控件全屏播放時,需要停止列表中的小視頻播放,把全屏視頻布局覆蓋在界面頂部,并播放全屏視頻。
3、需要在列表Adapter中,添加視頻相關(guān)邏輯,例如全屏按鈕點擊時,列表刷新等操作需要添加輔助類:GSYVideoHelper和內(nèi)部類GSYVideoHelper.GSYVideoHelperBuilder實現(xiàn)該場景下的視頻播放實現(xiàn)。
場景三:在詳情頁,視頻控件固定在頂部

解析:如果需要實現(xiàn)手動和屏幕旋轉(zhuǎn)時,全屏播放視頻,需要添加輔助類OrientationUtils。
實現(xiàn)相關(guān)功能如:
1、在進(jìn)入界面視頻未開始播放時,禁止手機(jī)的旋轉(zhuǎn)功能。(不然會亂屏)
2、需要在視頻開始播放后,開啟手機(jī)旋轉(zhuǎn)功能。
3、需要OrientationUtils類在onConfigurationChanged函數(shù)中,傳入播放器對象實現(xiàn)屏幕旋轉(zhuǎn)的監(jiān)聽。
六、手?jǐn)]播放器控件遇到的問題匯總
5.1、全屏播放的實現(xiàn)(注意狀態(tài)欄與導(dǎo)航欄的系統(tǒng)版主適配)
5.2、音頻焦點搶占問題(注意系統(tǒng)版主適配)
5.3、橫豎屏手動和被動切換注意點
5.4、Activity或Fragment在不同狀態(tài)下的,視頻控件如何適配,關(guān)閉屏幕,來電,切換到后臺,退出等處理。
(與Activity與Fragment生命周期的聯(lián)動)
5.5、自定義時間進(jìn)度條的實現(xiàn)(ProgressTimeBar)
5.6、兼容不同底層播放能力(EXO,F(xiàn)FMPEG,SohuSdk等)
5.7、不同狀態(tài)在是否需要自動息屏
5.8、不同狀態(tài)的切換(使用Visible與InVisible或使用addView與removeView)
5.9、視頻的自動寬高適配
七:播放器不同模塊代碼的解耦
6.1、底層播放能力的解耦,單獨實現(xiàn),使用策列模式實現(xiàn)(EXO和SohuSdk,后續(xù)添加不同的視頻源SDK)
6.2、手勢操作的解耦(滑動調(diào)節(jié),單擊,雙擊的監(jiān)聽與響應(yīng)事件)
6.3、各種響應(yīng)對話框單獨分離出來
6.4、視頻狀態(tài)的控制相關(guān)操作(暫停,繼續(xù)等操作)

八、播放器控件實現(xiàn)思路建議(個人理解,僅供參考)
1、如果在Android與IOS需要有統(tǒng)一的標(biāo)準(zhǔn),并需要對特定流媒體協(xié)議,特定視頻編碼有一定的要求,建議優(yōu)先參考ijkPlayer。
2、如果只需要實現(xiàn)底層播放,且項目視頻播放模塊需要大量定制功能的話,建議查看ExoPlayer和jiaoziPlayer,大量定制功能需要自己實現(xiàn)。
3、如果需要一個較為完善,已經(jīng)實現(xiàn)了常見視頻播放控件的相關(guān)功能(愛奇藝,優(yōu)酷,騰訊視頻的視頻控件),并實現(xiàn)了播放器控件的各種場景下的使用demo,GSYPlayer是首選,此外,GSY也有實現(xiàn)了對EXO和IJKPlayer的封裝實現(xiàn)分支。
九:遇到相關(guān)疑難雜癥(持續(xù)更新)
問題一:在調(diào)節(jié)亮度和音量時,彈出的對話框使用getContext()或外部傳入的Context,在使用外部傳入的Context時,對話框布局底部會被截取一小段。
解決方案:統(tǒng)一使用getContext()獲取。
問題二:在Activity中的Ondestroy中執(zhí)行視頻控件的Release()函數(shù),發(fā)現(xiàn)如果在release()函數(shù)中才放棄音頻焦點的話,會使得Activity的OnDestroy會延遲執(zhí)行,甚至退出Activity,重新啟動其他Activity時,其他Activity都初始化了,銷毀的Activity的OnDestroy函數(shù)還沒有執(zhí)行。
解決方案:在視頻控件的OnPause中就放棄音頻焦點。
十:擴(kuò)展閱讀
1、https://blog.csdn.net/u010072711/article/details/51517170(Android視頻播放器實現(xiàn)小窗口和全屏狀態(tài)切換)
2、https://blog.csdn.net/qq_25955641/article/details/89790669(Android播放器的三種實現(xiàn)方法)
3、https://blog.csdn.net/liuzhi0724/article/details/81318816?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1(Android實現(xiàn)視頻播放的3種實現(xiàn)方式)
4、https://www.itdecent.cn/p/53581512ba3f(github上十二款最著名的Android播放器開源項目)
5、https://blog.csdn.net/qq_34895720/article/details/101511876(Android中視頻播放器的選擇,MediaPlayer、ExoPlayer、ijkplayer簡單對比)
6、http://www.voidcn.com/article/p-ktividrq-tk.html(MP4文件格式解析)
7、https://www.itdecent.cn/p/291ff6ddc164(TextureView+SurfaceTexture+OpenGLES來播放視頻(三)
8、https://blog.csdn.net/charleslei/article/details/44599041(簡單談?wù)動簿幋a和軟編碼)
9、https://blog.csdn.net/pangpang123654/article/details/78125038?utm_medium=distribute.pc_relevant.
none-task-blog-baidujs-1(硬解碼與軟解碼的選擇)
10、https://blog.csdn.net/afei__/article/details/100023701?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase(淺談SurfaceView、TextureView、GLSurfaceView、SurfaceTexture)
11、https://blog.csdn.net/m475664483/article/details/52998445(SurfaceTexture,TextureView,SurfaceView和GLSurfaceView的區(qū)別)
12、https://blog.csdn.net/aa642531/article/details/93230076(Android主流開源視頻播放器對比)
13、https://zhuanlan.zhihu.com/p/115220766(Android OpenGL ES系列連載:(06)EGL)