srs流媒體服務(wù)器丟失參數(shù)集以及metadata的解決辦法

  • 2018.10.31 更新
    更新日志: 此次更新增加了metadata的判斷憔杨,更新原因:
    metadata什么時候會發(fā)送北戏? 2種情況:
  1. 剛連接的時候
  2. metadata發(fā)送變化的時候
    那么在長時間的跑機中,時間戳的調(diào)整上會出現(xiàn)問題环葵,equeue進來的時候如果沒有對metadata的類型加以判斷调窍,則會丟失metadata,從而導(dǎo)致客戶端無法解碼播放
    所以张遭,需要增加metadata的判斷
  • 2018.10.25 更新
    更新日志: 從0開始檢查邓萨,避免當(dāng)0為參數(shù)集的時候清理掉,從而導(dǎo)致丟失
  • 現(xiàn)象
    推流端切換分辨率菊卷,結(jié)果播放端花屏了缔恳,之所以花屏,查看了下rtmp幀洁闰,少了參數(shù)集歉甚。
    那么等到下一個參數(shù)集到來的時候,就立即好了扑眉,這個好理解
  • 原因
    問題是纸泄,丟失的參數(shù)集為什么會丟失呢赖钞?
    一般情況下, 參數(shù)集都是在I幀前的聘裁,后面的I幀沒有丟雪营,反倒是前面的參數(shù)集丟失了
    來看下面這段代碼:
void SrsMessageQueue::shrink()
{
    int iframe_index = -1;
    
    // issue the first iframe.
    // skip the first frame, whatever the type of it,
    // for when we shrinked, the first is the iframe,
    // we will directly remove the gop next time.
    for (int i = 1; i < (int)msgs.size(); i++) {
        SrsSharedPtrMessage* msg = msgs[i];

       if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
            // the max frame index to remove.
            iframe_index = i;
            break;
        }        

        if (msg->header.is_video()) {
            if (SrsFlvCodec::video_h264_is_spspps(msg->payload, msg->size) ||
                    SrsFlvCodec::video_h265_is_sequence_header(msg->payload, msg->size)) {
                // the max frame index to remove.
                iframe_index = i;
                
                // set the start time, we will remove until this frame.
                av_start_time = msg->header.timestamp;
                
                break;
            }
        }
    }
   
    // no iframe, for audio, clear the queue.
    // it is ok to clear for audio, for the shrink tell us the queue is full.
    // for video, we clear util the I-Frame, for the decoding must start from I-frame,
    // for audio, it's ok to clear any data, also we can clear the whole queue.
    // @see: https://github.com/winlinvip/simple-rtmp-server/issues/134
    if (iframe_index < 0) {
        clear();
        return;
    }
    
    srs_trace("video_h264_is_sequence_header: shrink the cache queue, size=%d, removed=%d, max=%.2f",
        (int)msgs.size(), iframe_index, queue_size_ms / 1000.0);
    
    // remove the first gop from the front
    for (int i = 0; i < iframe_index; i++) {
        SrsSharedPtrMessage* msg = msgs[i];
        srs_freep(msg);
    }
    msgs.erase(msgs.begin(), msgs.begin() + iframe_index);
}

在這里面有清掉幀數(shù)據(jù)的操作,并且是從1開始的衡便,也就是說卓缰,不管數(shù)據(jù)0的類型是什么,萬一這個0恰好就是參數(shù)集砰诵,那就清理掉了

  • 修復(fù)方法
for (int i = 0; i < (int)msgs.size(); i++) {
        SrsSharedPtrMessage* msg = msgs[i];
        
        if (msg->header.is_video()) {
            if (SrsFlvCodec::video_h264_is_spspps(msg->payload, msg->size) ||
                    SrsFlvCodec::video_h265_is_sequence_header(msg->payload, msg->size)) {
                // the max frame index to remove.
                iframe_index = i;
                
                // set the start time, we will remove until this frame.
                av_start_time = msg->header.timestamp;
                
                break;
            }
        }
    }

 if (0 == iframe_index) {
        return;
    }

shrink 部分征唬,需要去掉循環(huán),否則有可能會一直在這里循環(huán)導(dǎo)致cpu飆升

if (av_end_time - av_start_time > queue_size_ms) {
        shrink();
    }

這里從0開始茁彭,就是為了避免當(dāng)0為參數(shù)集的時候也清理掉

  • 一個沒查到的問題
    什么時候會調(diào)用這個shrink呢总寒?如下代碼
while (av_end_time - av_start_time > queue_size_ms) {
        shrink();
    }

經(jīng)過測試,當(dāng)av_start_time=0的時候理肺,會進入這段代碼摄闸,但是在av_start_time能夠賦值的地方都看過了,實在是沒有找到為0的時候妹萨,到現(xiàn)在依然沒有查出來

哪位朋友知道答案年枕,望不吝賜教

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乎完,隨后出現(xiàn)的幾起案子熏兄,更是在濱河造成了極大的恐慌,老刑警劉巖树姨,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摩桶,死亡現(xiàn)場離奇詭異,居然都是意外死亡帽揪,警方通過查閱死者的電腦和手機硝清,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來转晰,“玉大人芦拿,你說我怎么就攤上這事〔樾希” “怎么了蔗崎?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侠坎。 經(jīng)常有香客問我蚁趁,道長裙盾,這世上最難降的妖魔是什么实胸? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任他嫡,我火速辦了婚禮,結(jié)果婚禮上庐完,老公的妹妹穿的比我還像新娘钢属。我一直安慰自己,他們只是感情好门躯,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布淆党。 她就那樣靜靜地躺著,像睡著了一般讶凉。 火紅的嫁衣襯著肌膚如雪染乌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天懂讯,我揣著相機與錄音荷憋,去河邊找鬼。 笑死褐望,一個胖子當(dāng)著我的面吹牛勒庄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘫里,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼实蔽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谨读?” 一聲冷哼從身側(cè)響起局装,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劳殖,沒想到半個月后贼邓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闷尿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年塑径,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片填具。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡统舀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劳景,到底是詐尸還是另有隱情誉简,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布盟广,位于F島的核電站闷串,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筋量。R本人自食惡果不足惜烹吵,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一碉熄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肋拔,春花似錦锈津、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窿吩,卻和暖如春茎杂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纫雁。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工蛉顽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人先较。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓携冤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闲勺。 傳聞我的和親對象是個殘疾皇子曾棕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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