基於ijkPlayer學習視訊播放器實現(一)
在工作中,對視訊播放器相關開發知識斷斷續續也學習過不少,按需求完成過一些定製化開發,但感覺還是沒有成體系的學習過,藉此給自己挖個坑,學習一下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檔案為例,簡單介紹一下幾個過程:
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開發進階文章
相關文章
- 基於 Bilibili/ijkplayer 的視訊播放器(Update)播放器
- 基於 IJKPlayer-concat 協議的視訊無縫拼接技術實現協議
- IOS 整合 Bilibili IJKPlayer播放器,播放rtmp視訊流iOS播放器
- iOS 基於AVPlayer自定義視訊播放器iOS播放器
- android 基於ijkplayer專案進行的播放器Android播放器
- Android 實現視屏播放器、邊播邊快取功能、外加鏟屎(IJKPlayer)Android播放器快取
- 如何基於 Flutter 快速實現一個視訊通話應用Flutter
- 基於 Agora SDK 實現 Windows 端的一對一視訊通話(基於3.6.2版本)GoWindows
- 如何基於 ZEGO SDK 實現 Flutter 一對一音視訊聊天應用?GoFlutter
- 如何基於 ZEGO SDK 實現 Windows 一對一音視訊聊天應用GoWindows
- Android多媒體之視訊播放器(基於MediaPlayer)Android播放器
- ffmpeg播放器實現詳解 - 視訊顯示播放器
- Electron實現跨平臺全能視訊播放器播放器
- 基於Flutter實現的仿開眼視訊AppFlutterAPP
- 基於 WebRTC 和 WebVR 實現 VR 視訊通話WebVR
- ijkplayer 音視訊同步流程分析
- 音視訊學習(一)-- 基礎知識準備
- 如何基於 ZEGO SDK 實現 Android 一對一音視訊聊天應用GoAndroid
- 視訊採集:iOS平臺基於AVCaptureDevice的實現iOSAPTdev
- 基於聲網 Flutter SDK 實現多人視訊通話Flutter
- iOS基於Socket.io即時通訊IM實現,WebRTC實現視訊通話iOSWeb
- 基於環信實現實時視訊語音通話功能
- IJKPlayer視訊直播-編譯和使用編譯
- 視訊編解碼學習之一:理論基礎
- 應用於實時視訊通訊的深度學習演算法深度學習演算法
- 基於ffmpeg+SDL的加密視訊播放器的開發(三)加密播放器
- Dplayer Html5 彈幕視訊播放器的實現HTML播放器
- 基於深度學習分析與檢索海量短視訊內容深度學習
- ijkplayer 播放器狀態解析播放器
- 視訊播放器播放器
- 基於 Electron 做視訊會議的兩種實現方式
- 基於 Agora SDK 實現 iOS 端的多人視訊互動GoiOS
- 用MediaPlayer+TextureView封裝一個完美實現全屏、小視窗的視訊播放器View封裝播放器
- 音視訊學習筆記(一)筆記
- 基於FFmpeg和Qt實現簡易影片播放器QT播放器
- 從零開始仿寫一個抖音App——基於FFmpeg的極簡視訊播放器APP播放器
- 基於 Agora SDK 實現 Windows 端的多人視訊互動(基於3.6.2版本)GoWindows
- MediaCodec、OpenGL、OpenSL/AudioTrack 實現一款簡單的視訊播放器播放器