防丟失衫嵌,所以記錄一下所禀。
參數(shù)相關(guān)
IJKFFOptions參數(shù)說明
//打開h265硬解
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-hevc", 1);
/*-------------CodecOption-------------*/
//解碼參數(shù),畫面更清晰
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_loop_filter"];
[options setCodecOptionIntValue:IJK_AVDISCARD_DEFAULT forKey:@"skip_frame"];
//以下是直播取募、點播參數(shù)設(shè)置不同
if (直播) {
// Param for living
//最大緩存大小是3秒,可以依據(jù)自己的需求修改
[options setPlayerOptionIntValue:3000 forKey:@"max_cached_duration"];
//無限讀
[options setPlayerOptionIntValue:1 forKey:@"infbuf"];
//關(guān)閉播放器緩沖
[options setPlayerOptionIntValue:0 forKey:@"packet-buffering"];
} else {
// Param for playback
[options setPlayerOptionIntValue:0 forKey:@"max_cached_duration"];
[options setPlayerOptionIntValue:0 forKey:@"infbuf"];
[options setPlayerOptionIntValue:1 forKey:@"packet-buffering"];
}
/*-------------PlayerOption-------------*/
//在視頻幀處理不過來的時候丟棄一些幀達到同步的效果
//跳幀開關(guān),如果cpu解碼能力不足宁仔,可以設(shè)置成5,否則會引起音視頻不同步峦睡,也可以通過設(shè)置它來跳幀達到倍速播放
[options setPlayerOptionIntValue:5/*0*/ forKey:@"framedrop"];
//最大fps
[options setPlayerOptionIntValue:30 forKey:@"max-fps"];
//幀速率(fps) 可以改翎苫,確認非標準楨率會導(dǎo)致音畫不同步,所以只能設(shè)定為15或者29.97
[options setPlayerOptionIntValue:29.97 forKey:@"r"];
//設(shè)置音量大小榨了,256為標準音量煎谍。(要設(shè)置成兩倍音量時則輸入512,依此類推)
[options setPlayerOptionIntValue:512 forKey:@"vol"];
//指定最大寬度
[options setPlayerOptionIntValue:960 forKey:@"videotoolbox-max-frame-width"];
//開啟/關(guān)閉 硬解碼(硬件解碼CPU消耗低龙屉。軟解呐粘,更穩(wěn)定)
[options setPlayerOptionIntValue:0 forKey:@"videotoolbox"];
//是否有聲音
[options setPlayerOptionIntValue:1 forKey:@"an"];
//是否有視頻
[options setPlayerOptionIntValue:1 forKey:@"vn"];
//每處理一個packet之后刷新io上下文
[options setPlayerOptionIntValue:1 forKey:@"flush_packets"];
//是否禁止圖像顯示(只輸出音頻)
[options setPlayerOptionIntValue:1 forKey:@"nodisp"];
//
[options setPlayerOptionIntValue:0 forKey:@"start-on-prepared"];
//
[options setPlayerOptionIntValue:@"fcc-_es2" forKey:@"overlay-format"];
//
[options setPlayerOptionIntValue:3 forKey:@"video-pictq-size"];
//
[options setPlayerOptionIntValue:25 forKey:@"min-frames"];
/*-------------FormatOption-------------*/
//如果是rtsp協(xié)議,可以優(yōu)先用tcp(默認是用udp)
[options setFormatOptionValue:@"tcp" forKey:@"rtsp_transport"];
//播放前的探測Size转捕,默認是1M, 改小一點會出畫面更快
[options setFormatOptionIntValue:1024*16*0.5 forKey:@"probsize"];
//播放前的探測時間
[options setFormatOptionIntValue:50000 forKey:@"analyzeduration"];
//自動轉(zhuǎn)屏開關(guān)
[options setFormatOptionIntValue:0 forKey:@"auto_convert"];
//重連次數(shù)
[options setFormatOptionIntValue:1 forKey:@"reconnect"];
//超時時間作岖,timeout參數(shù)只對http設(shè)置有效。若果你用rtmp設(shè)置timeout瓜富,ijkplayer內(nèi)部會忽略timeout參數(shù)鳍咱。rtmp的timeout參數(shù)含義和http的不一樣。
[options setFormatOptionIntValue:30 * 1000 * 1000 forKey:@"timeout"];
//
[options setFormatOptionIntValue:@"nobuffer" forKey:@"fflags"];
//
[options setFormatOptionIntValue:@"ijkplayer" forKey:@"user-agent"];
//
[options setFormatOptionIntValue:0 forKey:@"safe"];
//
[options setFormatOptionIntValue:0 forKey:@"http-detect-range-support"];
//
[options setFormatOptionIntValue:4628439040 forKey:@"ijkapplication"];
//
[options setFormatOptionIntValue:6176477408 forKey:@"ijkiomanager"];
注意
skip_loop_filter參數(shù)相關(guān)
// for codec option 'skip_loop_filter' and 'skip_frame'
typedef enum IJKAVDiscard {
/* We leave some space between them for extensions (drop some
* keyframes for intra-only or drop just some bidir frames). */
IJK_AVDISCARD_NONE =-16, ///< discard nothing
IJK_AVDISCARD_DEFAULT = 0, ///< discard useless packets like 0 size packets in avi
IJK_AVDISCARD_NONREF = 8, ///< discard all non reference
IJK_AVDISCARD_BIDIR = 16, ///< discard all bidirectional frames
IJK_AVDISCARD_NONKEY = 32, ///< discard all frames except keyframes
IJK_AVDISCARD_ALL = 48, ///< discard all
} IJKAVDiscard;
前面兩個都看得懂
第三個是拋棄非參考幀(I幀)
第四個是拋棄B幀
第五個是拋棄除關(guān)鍵幀以外的与柑,比如B谤辜,P幀
第六個是拋棄所有的幀,這我就奇怪了价捧,之前Android默認的就是48丑念,難道把所有幀都丟了?
那就沒有視頻幀了结蟋,所以應(yīng)該不是這么理解脯倚,應(yīng)該是skip_loop_filter和skip_frame的對象要過濾哪些幀類型。
skip_loop_filter這個是解碼的一個參數(shù),叫環(huán)路濾波推正,設(shè)置成48和0恍涂,圖像清晰度對比,0比48清楚植榕,理解起來就是再沧,0是開啟了環(huán)路濾波,過濾的是大部分尊残,而48基本沒啟用環(huán)路濾波炒瘸,所以清晰度更低,但是解碼性能開銷小
skip_loop_filter(環(huán)路濾波)簡言之:
a:環(huán)路濾波器可以保證不同水平的圖像質(zhì)量寝衫。
b:環(huán)路濾波器更能增加視頻流的主客觀質(zhì)量顷扩,同時降低解碼器的復(fù)雜度。
具體參考:
http://blog.csdn.net/h514434485/article/details/52241778
http://www.cnblogs.com/TaigaCon/p/5500110.html
skip_frame我沒完全理解意思慰毅,應(yīng)該是等同上面這個類似隘截。
相關(guān)問題以及解決方案
1、達不到秒開事富,首屏顯示慢技俐,后來把播放前探測時間改為1
//播放前的探測時間
[options setFormatOptionIntValue:1 forKey:@”analyzeduration”];
2、音畫不同步统台,有同事發(fā)現(xiàn)在模擬器的情況下音畫不同步雕擂,剛開始理解以為是CPU處理畫面處理不過來,所以加了framedrop參數(shù) 做了丟幀處理贱勃,后來才明白是因為模擬器處理效率低井赌,不需要做丟幀處理
//開啟硬解碼(硬件解碼CPU消耗低。軟解贵扰,更穩(wěn)定)
[options setPlayerOptionIntValue:1 forKey:@”videotoolbox”];
3仇穗、延遲產(chǎn)生的原因以及優(yōu)化
- 產(chǎn)生原因
保證直播的流暢性是指在直播過程中保證播放不發(fā)生卡頓,卡頓是指在播放過程中聲音和畫面出現(xiàn)停滯戚绕,非常影響用戶體驗纹坐。造成卡頓的原因有幾種情況:
(1) 推流端網(wǎng)絡(luò)抖動導(dǎo)致數(shù)據(jù)無法發(fā)送到服務(wù)器,造成播放端卡頓;
(2) 播放端網(wǎng)絡(luò)抖動導(dǎo)致數(shù)據(jù)累積在服務(wù)器上拉不下來舞丛,造成播放卡頓耘子。
由于從服務(wù)器到播放器的網(wǎng)絡(luò)情況復(fù)雜,尤其是在3G和帶寬較差的WIFI環(huán)境下球切,抖動和延遲經(jīng)常發(fā)生谷誓,導(dǎo)致播放不流暢,播放不流暢帶來的負面影響就是延時增大吨凑。如何在網(wǎng)絡(luò)抖動的情況下保證播放的流暢性和實時性是保障直播性能的難點捍歪。 - 流暢度優(yōu)化
目前主流的直播協(xié)議是RTMP、HTTP-FLV和HLS,都是基于TCP的長連接糙臼。在播放的過程中庐镐,若播放端所處的網(wǎng)絡(luò)環(huán)境在一個較佳的狀態(tài),此時播放會很流暢弓摘。若網(wǎng)絡(luò)環(huán)境不是很穩(wěn)定焚鹊,經(jīng)常會發(fā)生抖動,如果播放端沒有做特殊處理韧献,可能會經(jīng)常發(fā)生卡頓,嚴重的甚至?xí)霈F(xiàn)黑屏研叫。而移動直播由于其便捷性锤窑,用戶可以隨時隨地發(fā)起和觀看直播,我們無法保證用戶的網(wǎng)絡(luò)一直處于一個非常好的狀態(tài)嚷炉,所以渊啰,在網(wǎng)絡(luò)不穩(wěn)定的情況下保證播放的流暢度是非常重要的。
為了解決這個問題申屹,首先播放器需要將拉流線程和解碼線程分開绘证,并建立一個緩沖隊列用于緩沖音視頻數(shù)據(jù)。拉流線程將從服務(wù)器上獲取到的音視頻流放入隊列哗讥,解碼線程從隊列中獲取音視頻數(shù)據(jù)進行解碼播放嚷那,隊列的長度可以調(diào)整。當網(wǎng)絡(luò)發(fā)生抖動時杆煞,播放器無法從服務(wù)器上獲取到數(shù)據(jù)或獲取數(shù)據(jù)的速度較慢魏宽,此時隊列中緩存的數(shù)據(jù)可以起到一個過渡的作用,讓用戶感覺不到網(wǎng)絡(luò)發(fā)生了抖動决乎。
當然這是對于網(wǎng)絡(luò)發(fā)生抖動的情況所采取的策略队询,如果播放端的網(wǎng)絡(luò)遲遲不能恢復(fù)或者服務(wù)器的邊緣結(jié)點 出現(xiàn)宕機,則需要應(yīng)用層進行重連或調(diào)度构诚。
4蚌斩、軟硬編解碼的選擇
軟編解碼:使用CPU進行編解碼,大多使用FFmpeg來編碼和解壓音視頻數(shù)據(jù)范嘱;
硬編解碼:主要使用非CPU進行編解碼送膳,如GPU等。在使用中彤侍,大多直接調(diào)用系統(tǒng)API進行音視頻編解碼處理肠缨。
序號 | 優(yōu)點 | 缺點 | |
---|---|---|---|
1 | 軟編解碼 | 在不同的設(shè)備、系統(tǒng)版本中兼容性極高盏阶;解碼時晒奕,色彩還原度更高;編解碼過程可擴展性強; | CPU占用高脑慧,手機易發(fā)熱魄眉,耗電量大。 |
2 | 硬編解碼 | 系統(tǒng)占用少闷袒,執(zhí)行效率高坑律。 | 兼容性低,需根據(jù)硬件廠商和系統(tǒng)版本單獨適配囊骤;可控性比較差晃择; |
綜合以上情況,在推流方面也物,iOS系統(tǒng)和硬件設(shè)備統(tǒng)一性高宫屠,使用全硬編方案效果更好;Android因機型繁雜滑蚯,支持程度不一浪蹂,推薦4.3以上使用硬編。在播放解碼方面告材,iOS硬解和軟解支持性都較高坤次,軟解功耗更高,但是在部分細節(jié)方面表現(xiàn)較優(yōu)斥赋,可控性強缰猴,具體視項目情況選擇;Android推薦4.1版本以上使用硬解灿渴,以下版本使用軟解洛波。