IjkPlayer播放器秒開優(yōu)化以及常用Option設(shè)置

ijkplayer和ffplay在打開rtmp串流視頻時(shí),大多數(shù)都會(huì)遇到5~10秒的延遲,在ffplay播放時(shí),如果加上-fflags nobuffer可以縮短播放的rtmp視頻延遲在1s內(nèi),而在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: 設(shè)置是否開啟變調(diào)

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

2:設(shè)置是否開啟環(huán)路過濾: 0開啟,畫面質(zhì)量高,解碼開銷大,48關(guān)閉,畫面質(zhì)量差點(diǎn),解碼開銷小

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

3:設(shè)置播放前的最大探測時(shí)間

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

4:設(shè)置播放前的探測時(shí)間 1,達(dá)到首屏秒開效果

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

5:播放前的探測Size,默認(rèn)是1M, 改小一點(diǎn)會(huì)出畫面更快

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

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

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

7: 是否開啟預(yù)緩沖,一般直播項(xiàng)目會(huì)開啟,達(dá)到秒開的效果,不過帶來了播放丟幀卡頓的體驗(yàn)

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

8:播放重連次數(shù)

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

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

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

10:跳幀處理,放CPU處理較慢時(shí),進(jìn)行跳幀處理,保證播放流程,畫面和聲音同步

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

11:最大fps

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

12:設(shè)置硬解碼方式

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

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設(shè)置優(yōu)化

某些視頻在SeekTo的時(shí)候,會(huì)跳回到拖動(dòng)前的位置,這是因?yàn)橐曨l的關(guān)鍵幀的問題,通俗一點(diǎn)就是FFMPEG不兼容,視頻壓縮過于厲害,seek只支持關(guān)鍵幀,出現(xiàn)這個(gè)情況就是原始的視頻文件中i 幀比較少

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

14. 解決m3u8文件拖動(dòng)問題 比如:一個(gè)3個(gè)多少小時(shí)的音頻文件,開始播放幾秒中,然后拖動(dòng)到2小時(shí)左右的時(shí)間,要loading 10分鐘

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

重要記錄,問題列表

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

//某些視頻在SeekTo的時(shí)候,會(huì)跳回到拖動(dòng)前的位置,這是因?yàn)橐曨l的關(guān)鍵幀的問題,通俗一點(diǎn)就是FFMPEG不兼容,視頻壓縮過于厲害,seek只支持關(guān)鍵幀,出現(xiàn)這個(gè)情況就是原始的視頻文件中i 幀比較少
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", 1);
//播放前的探測Size,默認(rèn)是1M, 改小一點(diǎn)會(huì)出畫面更快
mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probesize", 1024 * 10);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容