RTMP直播累積延時和網(wǎng)絡抖動的優(yōu)化(卷一原理)

本文首發(fā)地址:開源實踐網(wǎng):RTMP直播累積延時和網(wǎng)絡抖動的優(yōu)化(卷一原理)

問題一 累積延時

對于交互性要求較高的直播業(yè)務來說取董,采集推流端和觀看端的延時太高是不可接受的。在 直播協(xié)議的選擇:RTMP vs. HLS 一文中提到了采用 RTMP 協(xié)議做直播業(yè)務,一般可以將延時控制在 1-3s 或者更低喂柒。但是如果在直播中發(fā)生卡頓婴程、播放暫停等情況時庄敛,也會不斷積累推流端和觀看端的延時伟叛。這種累積延時要怎么優(yōu)化呢略就?

一兄墅、優(yōu)化切換前后臺帶來的累積延時

在直播場景中踢星,有一種情況是切換前后臺造成累積延時。這里舉個例子:在前臺時隙咸,直播視頻在播放沐悦,然后退到后臺,此時暫停播放器五督,音視頻數(shù)據(jù)繼續(xù)緩存藏否,當回到前臺時,繼續(xù)從剛才退出時的視頻流數(shù)據(jù)開始播放充包,而實際的直播現(xiàn)在已經(jīng)不在這個時間點了秕岛。這段前后臺切換的時間里,就積累了一段延時误证。

對于這種延時改怎么處理呢继薛?

  1. 第一種方案是播放器采用視頻同步音頻的策略,然后退到后臺時保持音頻繼續(xù)播放(在 iOS 平臺需要開啟 App 的 Background Audio 能力來配合)愈捅。這樣可以保持音頻一直播放不產(chǎn)生延時遏考,而當回到前臺時,視頻同步音頻直接切換到最新時間戳即可蓝谨。
  2. 第二種方案是回到前臺時重新刷新直播灌具,重連直播流,這樣即可消滅累積延時譬巫。但是這種方案的問題是重連直播流的過程需要一定的時間咖楣,這樣回到前臺時會有卡頓,或者出現(xiàn)黑屏芦昔,尤其是當你的首屏加載優(yōu)化不夠時诱贿,這個卡頓或黑屏時間會較長。所以這種方案在你的首屏加載優(yōu)化的比較好的情況下可以采用。此外珠十,你可以退到后臺時截取視頻當前幀貼圖到直播間上料扰,從而當切回前臺時,防止黑屏焙蹭,優(yōu)化體驗晒杈,實踐效果還是不錯的。
二孔厉、優(yōu)化卡頓帶來的累積延時

在理想的情況下:網(wǎng)絡狀況良好拯钻;采集推流端、流媒體服務器撰豺、播放端均吞吐正常無阻塞说庭,可以不配置緩沖區(qū)。這時候推流端到播放端的延時將會很小郑趁,基本上就是網(wǎng)絡傳輸?shù)暮臅r刊驴。

但是在實際情況中,我們多多少少會遇到網(wǎng)絡不佳或網(wǎng)絡抖動的情況寡润,在這種網(wǎng)絡環(huán)境下捆憎,如果沒有緩沖策略,直播將發(fā)生卡頓梭纹。為了解決卡頓躲惰,通常會根據(jù)具體情況在采集推流端、流媒體服務器变抽、播放端增加緩沖策略础拨,而一旦發(fā)生緩沖,就意味著推流端到播放端的延時绍载。當卡頓情況多次出現(xiàn)诡宗,這樣的延時就會累積。

此外击儡,從 RTMP 協(xié)議層面上來講塔沃,累積延時本身是它的一個特征,因為 RTMP 是基于 TCP阳谍,所以不會丟包蛀柴,在網(wǎng)絡情況不佳的情況下超時重傳策略、緩沖策略等自然會帶來累積延時矫夯。
所以鸽疾,優(yōu)化卡頓帶來的累積延時首先是要優(yōu)化整個直播鏈條的網(wǎng)絡狀況去減少卡頓。從這個角度出發(fā)训貌,我們可以采用的策略包括:

  • 使用 CDN 分發(fā)網(wǎng)絡制肮。
  • 合理采用 CDN 邊緣節(jié)點推流。
  • 推流端、播放端使用 HTTPDNS 選擇網(wǎng)絡狀況最好的節(jié)點接入弄企。
  • 推流端實現(xiàn)碼率自適應策略,在網(wǎng)絡狀況不佳的情況下区拳,降低推流碼率來降低上行帶寬壓力拘领。
  • 流媒體服務器提供多檔位直播流服務,與此同時樱调,播放端實現(xiàn)直播流多檔位切換策略约素,在網(wǎng)絡狀況不佳的情況下,切換到低檔位直播流來降低下行帶寬壓力笆凌。

問題二 網(wǎng)絡抖動的優(yōu)化

除了這些外圣猎,我們還可以優(yōu)化各端的緩沖策略來降低累積延時。直播鏈條各端的緩沖區(qū)通常都是為了防止網(wǎng)絡抖動以及端上性能抖動產(chǎn)生卡頓乞而,但是各緩沖區(qū)的數(shù)據(jù)越多送悔,通常也意味著累積延時越大。所以在各端上爪模,我們還可以嘗試這些策略:

  • 在「卡頓」和「累積延時」這兩項體驗指標上尋找一個平衡點欠啤,在各端設(shè)置合適的緩沖區(qū)大小。
  • 在各端實現(xiàn)一些丟幀策略屋灌,當緩沖區(qū)超過一定閾值時洁段,開始丟幀。
  • 在播放端的緩沖區(qū)過大時共郭,嘗試斷開重連祠丝。
  • 服務端推流可以分高,中除嘹,低三種質(zhì)量的流写半,根據(jù)拉流端網(wǎng)絡質(zhì)量動態(tài)的切換

問題三 如何優(yōu)化弱網(wǎng)下推流端

推流端是整個數(shù)據(jù)的起點,如果推流端因為網(wǎng)絡原因推到服務端的視頻是卡頓的尉咕,那么接收端的視頻肯定也是卡頓的污朽,所有推流端出現(xiàn)問題,一般都是批量問題龙考。幸運的是蟆肆,在具體的業(yè)務中,推流端一般能夠保證設(shè)備性能和網(wǎng)絡質(zhì)量晦款。但如果不能保證炎功,在弱網(wǎng)環(huán)境下,為了保證推流的流暢性和低延時缓溅,我們需要弄一些策略使推流更流暢蛇损,一般有如下策略:

(1) 降幀率

網(wǎng)絡發(fā)送層發(fā)現(xiàn)發(fā)送速度過慢,反饋給camera采集模塊,通過抽幀的方式來降幀率淤齐,降低整體發(fā)送的碼率

(2) 降編碼碼率

網(wǎng)絡發(fā)送層發(fā)現(xiàn)發(fā)送速度過慢股囊,反饋給視頻編碼模塊,通過動態(tài)調(diào)整編碼器碼率更啄,來減小視頻編碼的輸出碼率稚疹。Android上的MediaCodec在4.3+版本上都是支持動態(tài)調(diào)整碼率的; x264以及ios上的VideoToolbox也是支持的

(3) 使用H.265編碼推流

使用H.265編碼推流可以節(jié)省40%帶寬祭务,可惜的是并不是所有手機都支持用H.265編碼格式播放内狗,所以需要針對手機型號進行推流。

(4) 丟幀

上面兩種方法义锥,反射弧比較長一點柳沙,它們從pipeline上來看,操作的模塊比較前面拌倍,生效比如慢一點赂鲤,取決于各個模塊間的緩沖的大小。丟幀策略的話直接作用于pipeline的末端柱恤,立即生效蛤袒。

RTMP發(fā)送線程循環(huán)從一個緩沖隊列里面讀取幀,然后發(fā)送膨更。為了方便作丟幀處理妙真,encoder采用baseline的profile,這樣荚守,緩沖隊列里面只存在I幀和P幀

如下 mVideoCount是這個緩沖隊列里面視頻幀的個數(shù)珍德,mVideoCapbility是這個緩沖隊列總的大小

if(mVideoCount >= mVideoCapbility/2){
  dropFrame(0.3f);
} else if(mVideoCount >= mVideoCapbility/3) {
  dropFrame(0.1f);
} else if(mVideoCount >= mVideoCapbility/4) {
  dropFrame(0.05f);
} else if(mVideoCount >= mVideoCapbility/5) {
  dropFrame(0.02f);
}

dropFrame的參數(shù)是丟幀的百分比,意思是相臨兩個gop之前丟掉的P幀的百分比矗漾。為了播放端不花屏锈候,從一個GOP的最后面的P幀開始丟

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市敞贡,隨后出現(xiàn)的幾起案子泵琳,更是在濱河造成了極大的恐慌,老刑警劉巖誊役,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获列,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛔垢,警方通過查閱死者的電腦和手機击孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹏漆,“玉大人巩梢,你說我怎么就攤上這事创泄。” “怎么了括蝠?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵鞠抑,是天一觀的道長。 經(jīng)常有香客問我忌警,道長搁拙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任慨蓝,我火速辦了婚禮感混,結(jié)果婚禮上端幼,老公的妹妹穿的比我還像新娘礼烈。我一直安慰自己,他們只是感情好婆跑,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布此熬。 她就那樣靜靜地躺著,像睡著了一般滑进。 火紅的嫁衣襯著肌膚如雪犀忱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天扶关,我揣著相機與錄音阴汇,去河邊找鬼。 笑死节槐,一個胖子當著我的面吹牛搀庶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铜异,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哥倔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揍庄?” 一聲冷哼從身側(cè)響起咆蒿,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚂子,沒想到半個月后沃测,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡食茎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年芽突,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董瞻。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡寞蚌,死狀恐怖田巴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挟秤,我是刑警寧澤壹哺,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站艘刚,受9級特大地震影響管宵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攀甚,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一箩朴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秋度,春花似錦炸庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至事期,卻和暖如春滥壕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兽泣。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工绎橘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唠倦。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓称鳞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牵敷。 傳聞我的和親對象是個殘疾皇子胡岔,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容