基於ijkPlayer學習視訊播放器實現(一)

weixin_33860553發表於2017-08-30

在工作中,對視訊播放器相關開發知識斷斷續續也學習過不少,按需求完成過一些定製化開發,但感覺還是沒有成體系的學習過,藉此給自己挖個坑,學習一下ijkPlayer播放器的實現,把這個系列文章完成。

Android中視訊播放器的選擇

MediaPlayer

在Android系統中對於視訊播放器有原生的實現MediaPlayer, 以及將MediaPlayer,SurfaceView封裝在一起的VideoView, 兩者都只是使用硬解播放,基本上只支援本地和HTTP協議的視訊播放,擴充套件性都很差,只適合最簡單的視訊播放需求。

ExoPlayer

谷歌後來有開源了一個播放器專案[ExoPlayer])(https://github.com/google/ExoPlayer), 提供了更好的擴充套件性和定製能力,並加入了對DASH和HLS等直播協議的支援,但也只支援硬碼,如果專案中只需要支援對H264格式的視訊播放,以及流媒體協議比較常規(比如HTTP,HLS),基於ExoPlayer定製也是不錯的選擇。

ijkplayer

ijkplayer是Bilibili公司開源的播放器實現,整合了FFMpeg, ExoPlayer, MediaPlayer等多種實現,提供了類似於MediaPlayer的API,可以實現軟硬解碼自由切換,自定義TextureView實現,同時得益於FFMpeg的能力,也能支援多種流媒體協議(RTSP,RTMP,HLS等),多種視訊編碼格式(h264, mpeg4, mjpeg),具有很高的靈活性,可以定製實現自己特色的播放器(比如支援視訊縮放,視訊翻轉等)。

視訊播放的流程

常規的視訊播放分為傳輸,解封裝,解碼,繪製四個步驟,以下按播放網站上(HTTP)的mp4檔案為例,簡單介紹一下幾個過程:

18501-fddeeed93e027c28.png
視訊播放過程.png
  • HTTP傳輸
    播放器使用HTTP協議把MP4下載下來,這部分需求一般需要邊下邊播,伺服器的HttpServer一定要支援HTTP Seek,因為播放的過程中需要跳轉到不同的位置下載內容,比如MP4結構中的moov後設資料資訊在很多視訊檔案中都被放置在檔案末尾了。

  • MP4解封包
    這部分我們常見的封包格式就是mp4, 視訊編碼後h264資料被拆分為多個片段封包到mp4中,解封包就是從mp4中解析出h264視訊裸碼流的過程。需要對Mp4格式有更多瞭解,可以參考MP4檔案格式解析

  • H264解碼
    視訊解碼就是將h264裸碼流解析成視訊畫素資料的過程(一般是yuv,也可以是rgba,類似於將jpg圖片解碼為bitmap資料。h264格式可以使用Android系統提供MediaCoder硬解碼,也可以使用FFMpeg進行軟解碼。
    奉上一篇能把H264格式結構講清楚的文章:深入淺出理解視訊編碼H264結構

  • OpenGL繪製
    就是繪製就是將解析為yuv格式的視訊資料繪製到螢幕上的過程,一般使用OpenGL繪製。OpenGL相關繪製的知識點相對比較複雜,這方面目前我也還在學習中。這裡有篇文章可以參考TextureView+SurfaceTexture+OpenGL ES來播放視訊


掃一掃下方二維碼,關注我的微信公眾號(APP開發進階),第一時間獲得Android開發進階文章

18501-f280c3070f9c43d0.jpg
APP開發進階

相關文章