ijkplayer中遇到的問題彙總

在作音視頻播放的時候,不少公司使用的是開源的ijkplayer播放器,ijkplayer底層是基於ffmpeg,在某機型上面可能經常遇到各類問題。今天整理了你們在使用ijkplayer中遇到的問題,以及根據ijkplayer社區issue和solution方案。以下:html

一、直播技術總結(三)ijkplayer的一些問題優化記錄 blog.csdn.net/hejjunlin/a…java

二、視頻直播技術(四):使用Ijkplayer播放直播視頻 www.cnblogs.com/renhui/p/64…android

三、IJKPlayer問題集錦之不定時更新- www.jianshu.com/p/220b00d00…git

四、直播技術總結(三)ijkplayer的一些問題優化記錄- blog.csdn.net/hejjunlin/a…github

五、ijkplayer rtmp秒開 ijkplayer設置rtmp秒開,可讓rtmp加載時間從5~10秒縮短到1s之內,以達到秒開且低延遲的目的:緩存

IjkMediaPlayer ijkMediaPlayer = null;  
ijkMediaPlayer = new IjkMediaPlayer();  
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);  
ijkMediaPlayer.setOption(1, "probesize", 10240L);  
ijkMediaPlayer.setOption(1, "flush_packets", 1L);  
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);  
ijkMediaPlayer.setOption(4, "framedrop", 1L); 
複製代碼

六、ijkplayer實時 播放rtmp等實時性要求很高的流媒體時候,會出現10S左右的延遲,緣由是由於加了緩衝區處理,能夠把其緩存設置變小,達到實時的效果:bash

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);  
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);  
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);  
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 8);  
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);  
ijkMediaPlayer.setOption(1, "probesize", 10240L);  
ijkMediaPlayer.setOption(1, "flush_packets", 1L);  
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);  
ijkMediaPlayer.setOption(4, "framedrop", 1L);
複製代碼

七、快速起直播流: 直播技術總結(五)如何快速起播直播流- blog.csdn.net/hejjunlin/a… 這裏優化後者,主要修改兩個參數,一個是probesize,一個是analyzeduration,分別用來控制其讀取的數據量大小和時長。減小 probesize 和 analyzeduration 能夠下降avformat_find_stream_info的函數耗時,達到起播快微信

ijkMediaPlayer.setOption(1,"analyzemaxduration",xxx);
ijkMediaPlayer.setOption(1,"probesize",xxx);
複製代碼

八、卡頓優化和秒開,弱網優化cookie

九、ijkplayer丟幀的處理方案https://www.jianshu.com/p/ecf51ee32589 直播的延遲,若是延遲過大,能夠採起兩種策略,一種是丟幀,一種是追幀。咱們能夠考慮丟音頻包來實現,音頻包不不在關鍵幀的問題,丟起來比較好操做,而後由於視頻同步到音頻,因此視頻會追幀,也會跟上來。網絡

十、使用Ijkplayer倍速變調問題解決方案- www.cnblogs.com/renhui/p/65…

public void setSpeed(float speed) {
    _setPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, speed);
}
public float getSpeed(float speed) {
    return _getPropertyFloat(FFP_PROP_FLOAT_PLAYBACK_RATE, .0f);
}
複製代碼

十一、ijkPlayer中的錯誤碼:

IJKMEDIA: SDL_JNI_DetachThreadEnv
ijkplayer如何斷掉握手 Android ? ijkplayer如何釋放鏈接  Android ?
/*
 * Do not change these values without updating their counterparts in native
 */
int MEDIA_INFO_UNKNOWN = 1;//未知信息
int MEDIA_INFO_STARTED_AS_NEXT = 2;//播放下一條
int MEDIA_INFO_VIDEO_RENDERING_START = 3;//視頻開始整備中,準備渲染
int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700;//視頻日誌跟蹤
int MEDIA_INFO_BUFFERING_START = 701;//開始緩衝中 開始緩衝
int MEDIA_INFO_BUFFERING_END = 702;//緩衝結束
int MEDIA_INFO_NETWORK_BANDWIDTH = 703;//網絡帶寬,網速方面
int MEDIA_INFO_BAD_INTERLEAVING = 800;//
int MEDIA_INFO_NOT_SEEKABLE = 801;//不可設置播放位置,直播方面
int MEDIA_INFO_METADATA_UPDATE = 802;//
int MEDIA_INFO_TIMED_TEXT_ERROR = 900;
int MEDIA_INFO_UNSUPPORTED_SUBTITLE = 901;//不支持字幕
int MEDIA_INFO_SUBTITLE_TIMED_OUT = 902;//字幕超時
int MEDIA_INFO_VIDEO_INTERRUPT= -10000;//數據鏈接中斷,通常是視頻源有問題或者數據格式不支持,好比音頻不是AAC之類的
int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//視頻方向改變,視頻選擇信息
int MEDIA_INFO_AUDIO_RENDERING_START = 10002;//音頻開始整備中
int MEDIA_ERROR_SERVER_DIED = 100;//服務掛掉,視頻中斷,通常是視頻源異常或者不支持的視頻類型。
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//數據錯誤沒有有效的回收
int MEDIA_ERROR_IO = -1004;//IO 錯誤
int MEDIA_ERROR_MALFORMED = -1007;
int MEDIA_ERROR_UNSUPPORTED = -1010;//數據不支持
int MEDIA_ERROR_TIMED_OUT = -110;//數據超時
Error (-10000,0)
複製代碼

十二、ijkplayer 使用經驗:

a、IJKPlayer 不像系統播放器會給你旋轉視頻角度,因此你須要經過onInfo的what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED去獲取角度,本身旋轉畫面;或者開啓硬解硬解碼,不過硬解碼容易形成黑屏無聲,諸位慎重啊O__O "…。

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);
複製代碼

b、IJKPlayer 出現黑色有聲音沒圖像,看看你的視頻編碼是否是H264,pixel format是否存在,音頻編碼是否是AAC?默認IJKPlayer是不支持3pg(支持它幹啥(?-?*)?),不支持mepg(好比這個庫RecordVideoDemo ),不支持AMR。因此若是你真的想要支持,那麼參考這個#1961,打開mpeg支持,從新編ffmpeg,而後經過硬解碼播放mpeg;或者經過系統的錄製VideoRecord;或者選另外的JAVACV錄製封裝FFmpegRecorder。

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec_mpeg4", 1);
複製代碼

c、快進和慢放接口,只支持API23以上,23如下的支持,是須要本身配置ffmpeg支持avfilter,不過可能會出現聲音顫抖等問題,官方說不穩定,參考#1690。 Tryavfilter but the audio sounds shaking = = For avfilter, only support software decoder.

d、暫停的時候,退到後臺再回到前臺,畫面黑了?這時候我的處理方式是,能夠在暫停的時候,經過TextureView.getBitmap(point.x, point.y);獲取到暫停的畫面,用ImageView顯示它,在onSurfaceTextureUpdated的時候隱藏ImageView,來實現畫面的銜接。

e、一些視頻返回碼

int MEDIA_INFO_VIDEO_RENDERING_START = 3;//視頻準備渲染
int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//數據錯誤沒有有效的回收
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之類的
    MediaPlayer Error (-10000,0), 視頻播放過程當中出錯了,多是視頻的緣由,播放器內部錯誤
複製代碼

f、某些視頻在SeekTo的時候,會跳回到拖動前的位置,這是由於視頻的關鍵幀的問題,通俗一點就是FFMPEG不兼容,視頻壓縮過於厲害,seek只支持關鍵幀,出現這個狀況就是原始的視頻文件中i 幀比較少,播放器會在拖動的位置找最近的關鍵幀,目前麼,IJKPlayer無解。

g、下載速度能夠經過IjkMediaPlayer的getTcpSpeed獲取。

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

i、ijkMediaPlayer.setOption可配置的對應頭文件參考:ff_ffplay_options。

j、緩衝進度條不到100,官方表示我就不保證都100,因此通常我都是: //95這個數值可能不許確,有些時候可能還須要低一些 if (secProgress > 95) secProgress = 100;

k、上面a、b、f的問題,在IJK封裝的EXOPlayer和MediaPlayer都不會有問題,兼容上確實強過IJKPlayer,可是它們在細節上,卻沒有IJK處理的好,如EXOPlayer:退到後再回到前臺、切換渲染控件的黑屏一段時間問題,除了用seekto以外目前沒發現其餘辦法,這樣的體驗讓我最後仍是選擇IJKPlayer。

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

1三、ijkplayer常見問題以及解決方案

a、ijkplayer播放rtmp直播流,延遲明顯- github.com/Bilibili/ij… b、全屏播放 c、有時候會開始直播時出現黑屏 d、有時候會出現花屏 e、解碼方式設置 f、如何區分點播直播 g、是否須要開啓硬件加速 h、How to set up only listen to the sound does not show video?- github.com/Bilibili/ij… i、如何設置後臺播放 j、視頻加載速度慢 The traffic speed is mostly depending on the quality of video CDN, not player itself. k、怎麼靜音 和非靜音 mute/unmute system volume.There is no mute/unmute API in ijkplayer. l、視頻黑屏,可是有聲音 肯定下視頻源的編碼方式,ijk默認只帶了h264解碼code m、適配問題,對於不一樣的cpu架構,須要編譯不一樣的so庫 n、播放視頻有的設備聲畫不一樣步 o、如何查看m3u8時長

cat game05.m3u8 | grep EXTINF | wc -l 32
p、how to change the video quality? 
Video quality is determined when being encoded.I don’t think it can be changed by player.
複製代碼

q、爲何往前拖動進度條後,還會日後退幾秒 seek只支持關鍵幀,出現這個狀況就是原始的視頻文件中i 幀比較少,播放器會在拖動的位置找最近的關鍵幀。 r、how to change URL when ijkplayer is playing RTMP video Create new player. s、怎樣添加字幕呢? 若是但願字幕時間精確,能夠在native層作解析和時間同步,到了時間後回調給java層,通常字幕文件加載都是在java層作的,解析文件格式,而後按照時間區間來顯示。 t、如何設置硬解?

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, 「mediacodec」, 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "http-detect-range-support", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV32);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "analyzeduration", "2000000");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "probsize", "4096");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 0);
複製代碼

u、http重定向到rtmp/Https,ijkplayer沒法播放視頻

ijkMediaPlayer.setOption( IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_clear", 1);
複製代碼

v、android mediaPlayer error (-38,0) prepare()調用報錯解決辦法: 出現這個錯誤發如今mediaPlayer.reset()後調用了mediaPlayer.getDuration()在沒有給mediaPlayer對象設置數據源以前,是不能使用getDuration等這些方法的.須要檢查一下在設置MediaPlayer的數據源時,使用的是那種方式:

  • 一、在初始化MediaPlayer時,經過create方法設置數據源。則不能寫MediaPlayer.prepare()方法,這時,會報錯。
  • 二、若是是使用MediaPlayer構造函數初始化MediaPlayer,而後經過setDataSource方法設置數據源時,就須要在start()以前,使用MediaPlayer.prepare()方法,對數據源進行一次編譯。可以避免出現(-38,0)這種錯誤。

參考資料:

歡迎關注個人微信公衆號「碼農突圍」,音視頻、多媒體技術乾貨
相關文章
相關標籤/搜索