天天看點

流媒體伺服器二次開發對接微信小程式起播HLS流不成功的原因分析

這兩天有個開發者在使用我們的流媒體伺服器做微信小程式二次開發的時候遇到一些問題,現在我來給大家分享這個過程,如果以後還有開發者遇到類似問題,可參考本篇進行排查。

這位開發者的現場有200路錄影機需要接入流媒體伺服器,前期測試的時候接入的是100路,流媒體伺服器并沒有表現出壓力,但是後期持續增加到200路的時候,伺服器性能開始跟不上了,因為小程式這邊需要的流是HLS流,是以在伺服器上用記憶體虛拟出來1G的磁盤用作緩存,這樣大大提高了磁盤讀寫效率,另外考慮到并發量和出口帶寬的問題,采用了按需直播的方式。

為了協助這個開發者測試,對小程式并不了解的我非常敬業的用WINFORM寫了一個Demo,根據我們流媒體伺服器的接口定義,我簡單梳理了一下:先調用登入接口->然後調擷取通道直播連結->保活通道直播連結,搞定。

下面看DEMO:

流媒體伺服器二次開發對接微信小程式起播HLS流不成功的原因分析

但是在我連續跑了幾次之後,發現有點問題,有時候不能正常起播,有時候又可以,搞的非常郁悶,現在深扒一下整個過程:

HLS 的基本原理就是當采集推流端将視訊流推送到流媒體伺服器時,伺服器将收到的流資訊每緩存一段時間就封包成一個新的 ts 檔案,切片檔案(三片),同時伺服器會建立一個 m3u8 的索引檔案來維護最新幾個 ts 片段的索引。當播放端擷取直播時,它是從 m3u8 索引檔案擷取最新的 ts 視訊檔案片段來播放,進而保證使用者在任何時候連接配接進來時都會看到較新的内容,實作近似直播的體驗。

原來在按需直播的模式下,EasyNVR是在用戶端請求時再去錄影機拉流過來,這樣再加上上面的過程,因為接口傳回比視訊流快的多,是以再接口傳回直播流位址的時候,我們直接起播,這時候視訊流還未生成切片檔案,是以無法播。知道這個原理後,我們修改了代碼,在擷取直播連結後,等個2-3秒,然後起播,成功搞定,也再次出現之前的問題了。

流媒體伺服器二次開發對接微信小程式起播HLS流不成功的原因分析