IjkPlayer播放器秒開優化以及常用Option設置


https://blog.csdn.net/shareus/article/details/78585260

ijkplayer點播和直播視頻 問題 解決及優化

ijkplayer的編譯

gradle

現在可以直接使用gradle引入ijkplayer了。但是,如果需要對更多格式進行支持,還是需要自己編譯一次。

allprojects {
repositories {
jcenter()
}
}

dependencies {
# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.1.2'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.1.2'

# Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.1.2'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.1.2'
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.1.2'
compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.1.2'

# ExoPlayer as IMediaPlayer: optional, experimental
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.1.2'
}

---------------------
作者:李jianguo
來源:CSDN
原文:https://blog.csdn.net/zhangkaiyazky/article/details/79637820
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 

https://www.jianshu.com/p/843c86a9e9ad

https://www.cnblogs.com/renhui/p/6420140.html

ijkplayer和ffplay在打開rtmp串流視頻時,大多數都會遇到5~10秒的延遲,在ffplay播放時,如果加上-fflags nobuffer可以縮短播放的rtmp視頻延遲在1s內,而在IjkMediaPlayer中加入

mediaPlayer.setOption(1, "analyzemaxduration", 100L); mediaPlayer.setOption(1, "probesize", 10240L); mediaPlayer.setOption(1, "flush_packets", 1L); mediaPlayer.setOption(4, "packet-buffering", 0L); mediaPlayer.setOption(4, "framedrop", 1L); 

1: 設置是否開啟變調

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"soundtouch",isModifyTone?0:1); 

2:設置是否開啟環路過濾: 0開啟,畫面質量高,解碼開銷大,48關閉,畫面質量差點,解碼開銷小

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC,"skip_loop_filter",isSkipLoopFilter?0:48L); 

3:設置播放前的最大探測時間

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"analyzemaxduration",100L); 

4:設置播放前的探測時間 1,達到首屏秒開效果

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"analyzeduration",1); 

5:播放前的探測Size,默認是1M, 改小一點會出畫面更快

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"probesize",1024*10); 

6:每處理一個packet之后刷新io上下文

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT,"flush_packets",1L); 

7: 是否開啟預緩沖,一般直播項目會開啟,達到秒開的效果,不過帶來了播放丟幀卡頓的體驗

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"packet-buffering",isBufferCache?1:0); 

8:播放重連次數

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"reconnect",5); 

9:最大緩沖大小,單位kb

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"max-buffer-size",maxCacheSize); 

10:跳幀處理,放CPU處理較慢時,進行跳幀處理,保證播放流程,畫面和聲音同步

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

11:最大fps

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"max-fps",30); 

12:設置硬解碼方式

jkPlayer支持硬解碼和軟解碼。 軟解碼時不會旋轉視頻角度這時需要你通過onInfo的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去獲取角度,自己旋轉畫面。或者開啟硬解硬解碼,不過硬解碼容易造成黑屏無聲(硬件兼容問題),下面是設置硬解碼相關的代碼

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); 

13.SeekTo設置優化

某些視頻在SeekTo的時候,會跳回到拖動前的位置,這是因為視頻的關鍵幀的問題,通俗一點就是FFMPEG不兼容,視頻壓縮過於厲害,seek只支持關鍵幀,出現這個情況就是原始的視頻文件中i 幀比較少

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

14. 解決m3u8文件拖動問題 比如:一個3個多少小時的音頻文件,開始播放幾秒中,然后拖動到2小時左右的時間,要loading 10分鍾

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "fastseek");//設置seekTo能夠快速seek到指定位置並播放 

重要記錄,問題列表

1. 設置之后,高碼率m3u8的播放卡頓,聲音畫面不同步,或者只有畫面,沒有聲音,或者聲音畫面不同步

//某些視頻在SeekTo的時候,會跳回到拖動前的位置,這是因為視頻的關鍵幀的問題,通俗一點就是FFMPEG不兼容,視頻壓縮過於厲害,seek只支持關鍵幀,出現這個情況就是原始的視頻文件中i 幀比較少 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1); //播放前的探測Size,默認是1M, 改小一點會出畫面更快 mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10); 

小禮物走一走,來簡書關注我



作者:GexYY
鏈接:https://www.jianshu.com/p/843c86a9e9ad
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM