開源播放器 ijkplayer (一) :使用Ijkplayer播放直播視頻

一、ijkplayer 編碼

IjkPlayer支持硬解碼和軟解碼。 軟解碼時不會旋轉視頻角度這時須要你經過onInfowhat == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去獲取角度,本身旋轉畫面。或者開啓硬解硬解碼,不過硬解碼容易形成黑屏無聲(硬件兼容問題),下面是設置硬解碼相關的代碼html

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);

二、ijkplayer 倍速播放

目前ijkplayer最新版本支持倍速播放(版本號0.7.7.1)。在早期版本對倍速播放支持的不是很好,只有6.0及以上的手機才能進行倍速播放。可是目前雖然全部的機型都支持倍速,可是6.0如下的手機明顯有聲調變化,這樣用戶體驗不是很好(針對變調的文章會在之後更新)。下面是最新的倍速設置代碼:android

public void setSpeed(float speed) { _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed); }

老版本代碼:ios

@TargetApi(Build.VERSION_CODES.M) public void setSpeed(float speed) { _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed); }

老版本代碼只能設置速度,不能獲取,因此基本上不能用(並且機型方面只支持6.0以上的機型)。git


更新:當前最新版本爲0.8.8,倍速功能可以在全部android機型上正常使用,倍速時可能也存在聲調問題,可是能夠經過設置參數來解決:
github

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", 1);

 此問題,本人也專門寫了一篇文章作了詳細的說明,文章地址爲:http://www.javashuo.com/article/p-byumtufv-eb.htmlcookie

三、ijkplayer的一些重要的視頻返回碼

int MEDIA_INFO_VIDEO_RENDERING_START = 3;//視頻準備渲染
int MEDIA_INFO_BUFFERING_START = 701;//開始緩衝
int MEDIA_INFO_BUFFERING_END = 702;//緩衝結束
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//視頻選擇信息
int MEDIA_ERROR_SERVER_DIED = 100;//視頻中斷,通常是視頻源異常或者不支持的視頻類型。
int MEDIA_ERROR_IJK_PLAYER = -10000,//通常是視頻源有問題或者數據格式不支持,好比音頻不是AAC之類的
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//數據錯誤沒有有效的回收

四、Ijkplayer調用seekTo存在的問題

ijkplyer 在播放部分視頻時,調用seekTo的時候,會跳回到拖動前的位置,這是由於視頻的關鍵幀的問題(GOP致使的),視頻壓縮比較高,而seek只支持關鍵幀,出現這個狀況就是原始的視頻文件中i幀比較少,播放器會在拖動的位置找最近的關鍵幀。因此,目前針對此問題ijkPlayer無解。架構

注:目前最新版0.8.8相對於以前的版原本說,seekTo的問題應該會小不少,可是不可避免的仍是會存在。ide

相關代碼:ui

setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);

5. Ijkplayer音視頻不一樣步問題

在開始使用過程中對rtmp視頻流進行播放,會出現嚴重的視頻音頻不一樣步現象,而且隨着播放的時間越長,視頻與音頻的差距越大。具體緣由是CPU在處理視頻幀的時候處理得太慢,默認的音視頻同步方案是視頻同步到音頻, 致使了音頻播放過快,視頻跟不上。編碼

{ "framedrop",                      "drop frames when cpu is too slow",
        OPTION_OFFSET(framedrop),       OPTION_INT(0, -1, 120) },

framedrop 控制着容許丟幀的範圍。能夠經過修改 framedrop 的數值來解決不一樣步的問題,framedrop 是在視頻幀處理不過來的時候丟棄一些幀達到同步的效果。具體設置:

player.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 5);

framedrop 的具體大小根據實際狀況而定, 通常丟太多幀也很差,會影響用戶的觀看體驗。

六、如何支持https連接播放?

若是你的項目要進行加密播放HLS協議的視頻,要想支持https,需要在普通編譯的基礎上,進行一些配置。

接下來咱們來編譯openssl

a). init openssl

$ cd .. 進入到ijkplayer的目下
$ ./init-android-openssl.sh 去遠程倉庫拉取openssl的遠程代碼,若是是iOS的,這裏是init-ios-openssl.h 

b). compile openssl

$ cd android/contrib
$ ./compile-openssl.sh clean
$ ./compile-openssl.sh all

通過以上步驟已經編譯好openssl了,而後咱們執行一下方法

$./compile-ffmpeg.sh clean
編譯ffmpeg軟解碼庫,這個過程會生成各類架構的ffmpeg 這個過程比較耗時
$./compile-ffmpeg.sh all

七、Ijkplayer使用小技巧

a. 下載速度能夠經過IjkMediaPlayer的 getTcpSpeed獲取。

b. 高分辨率開啓硬解碼,不支持的話會自動切換到軟解,就算開啓mediacodec,若是設備不支持,顯示的解碼器也是avcodec軟解。

c. IjkMediaPlayer.setOption可配置的對應頭文件參考:ff_ffplay_options

d. 設置cookie 能夠經過ijkPlayer的public void setDataSource(String path, Map<String, String> headers) 的header實現設置,參考ijkPlayer的issues-1150,headers也是在內部被轉化爲什麼issuses同樣的setOption方法

八、 基於ijkplayer的開源播放器推薦

GSYVideoPlayer

相關文章
相關標籤/搜索