ijkplayer系列2:ijkplayer java層面源碼分析

00. Java入口類IjkMediaPlayer

IMediaPlayer定義了所有MediaPlayer相關的公共方法和常量,要了解ijkplayer能爲我們做些什麼事,主要看這個接口的方法。接口中沒有提供註釋,而是在其實現類IjkMediaPlayer中提供了註釋信息,下面我們就着這些註釋信息以及實踐中得到的一些結論瞭解下ijkplayer究竟都能做些什麼事情。
IjkMediaPlayer實現了IMediaPlayer的所有方法,並且和Native的交互都在這裏處理。我們使用ijkplayer來開發項目,一般來說只需要使用到該類。

構造函數

IjkMediaPlayer提供了兩個構造函數,分別如下:

IjkMediaPlayer()
IjkMediaPlayer(IjkLibLoader libLoader)

第二個構造函數的參數表示本地庫的加載器,如非特殊情況我們都使用默認的,也就是傳null或者直接使用第一個構造函數。

設置顯示控件(Surface)

即設置視頻sink(輸出目標),ijkPlayer提供了兩個方法,分別如下:

setDisplay(SurfaceHolder sh)
setSurface(Surface surface)

當只需要音頻輸出時,不要調用這兩個方法。
另外,如果使用setSurface()設置sink,則調用setScreenOnWhilePlaying()沒有效果,該方法的作用是使得播放時屏幕常亮,SurfaceHolder有提供屏幕常亮的方法,而Surface沒有。如果使用了setSurface()方法,那麼屏幕常亮的邏輯就要由外部自己處理。

設置數據源(Data Source)

ijkPlayer支持多種數據源,所有設置數據源的方法都是setDataSource(),通過參數類型來區分數據源,所有setDataSource的重載方法如下:

// 從content provider中獲取數據
setDataSource(Context context, Uri uri)
setDataSource(Context context, Uri uri, Map<String, String> headers)

// 從文件描述符中獲取數據
setDataSource(FileDescriptor fd)

// 從file(本地文件)、http、rtsp、rtmp服務器中獲取數據
setDataSource(String path)
setDataSource(String path, Map<String, String> headers)

// 自定義數據源
setDataSource(IMediaDataSource mediaDataSource)
顯然,如果我們使用rtmp協議做流媒體開發時使用的是第三類方法。相信大家都注意到了,一些方法裏面會有個headers參數,這些參數我們後續再另外討論。

設置屏幕常亮

使用setScreenOnWhilePlaying(boolean screenOn)方法實現,僅當設置sink時使用setDisplay()方法生效,常亮功能在播放時生效。

01.簡易類圖(只把一些重要的類標記出來)

在這裏插入圖片描述
說明:
ijkplayer 集成了三種播放器實現:
AndroidMediaPlayer:即安卓系統自帶的播放器 MediaPlayer,基於 MediaCodec、AudioTrack 等安卓系統 API.
IjkExoMediaPlayer:即谷歌新推出的 ExoPlayer,同樣是基於 MediaCodec、AudioTrack 等安卓系統 API,但相比 MediaPlayer 具有支持 DASH、高級 HLS、自定義擴展等優點。
IjkMediaPlayer:基於 FFmpeg 的 ffplay,集成了 MediaCodec 硬解碼器、Opengl 渲染方式等。

一般而言, ijkplayer 就是指 IjkMediaPlayer,本文分析的對象就是 IjkMediaPlayer.
對 Android 而言,音頻輸出支持 AudioTrack、OpenSL ES 方式;視頻輸出支持 NativeWindow、OpenGL ES 方式。

  • IJK中提供了多個播放器的實現,包括IJK、系統mediaplayer、exoplayer
  • IJK看源碼,還是得深入C語言層面去看,多數都是C語言,java層代碼量很少,核心方法都是調用的navtive方法
  • MediaInfo。
  • IjkTrackInfo。
  • Surface。
  • SurfaceHolder。


參考資料

ijkplayer項目結構

ijkplayer 源碼分析(上)
https://yhaolpz.github.io/ijkplayer-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/

ijkplayer框架深入剖析
https://www.jianshu.com/p/daf0a61cc1e0

ijkplayer 學習筆記
https://yhaolpz.github.io/ijkplayer-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

ijkplayer中遇到的問題彙總

ijkplayer中遇到的問題彙總
https://www.jianshu.com/p/496257563f69

關於Android用Ijkplayer拉流的視頻比例問題
https://www.jianshu.com/p/542e8e8c4770

IJKPlayer問題集錦之不定時更新
https://www.jianshu.com/p/220b00d00deb

ijkplayer中遇到的問題彙總
https://juejin.im/post/5bc7e689f265da0adc18fb7a

Android MediaPlayer:getDuration()在prepare()後返回0
http://cn.voidcc.com/question/p-xwtgrfpw-xt.html

IjkPlayer播放器秒開優化以及常用Option設置
https://www.jianshu.com/p/843c86a9e9ad

ijk seek不準,會回跳的問題

https://blog.csdn.net/weixin_33894640/article/details/94117716

此方案確實可行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章