基於Live555實現RtspServer及高清高分辨率和高碼率視頻傳輸優化

基於Live555實現RtspServer及高清高碼率視頻傳輸優化

最近作了一些pc和嵌入式平臺的RTSP服務器項目,大多數的要求是簡單可是功能全面,而且性能還要強勁。綜合考慮後,基本都是在基於live555的基礎上進行開發,在進行Live555自己的優化以及程序內部視頻數據傳輸的優化後,不只實現了需求並且性能還超出預期,實現了10Mbps高碼率的1080p以上高分辨率高清視頻的流暢直播。這裏將一些優化點分享一下:html

爲何基於Live555開發

其實以前我就已經開發過一個RTSP Server程序,而且寫了一篇文章進行了介紹「一個RtspServer的設計與實現和RTSP2.0簡介」,不過當時開發的目的除了實現RTSP直播之外,主要目的仍是簡化代碼以方便定製,所以並無徹底實現RTSP協議裏的全部交互細節,要在它的基礎上擴展全面,可能會拖延項目進展。基於項目考慮,選擇了本身比較瞭解也認爲比較優秀的RTSP開源項目Live555做爲基礎,開發RTSP Server程序。服務器

Live555是一個跨平臺的流媒體解決方案,以C++爲開發語言,實現了RTSP包括服務器-客戶端的整套結構,而且支持H.264, H.265, MPEG, AAC等多種視頻和音頻編碼,是很知名的一個開源項目。做爲RTSP Server,源碼裏只有對於本地文件的視頻源,不過它的擴展性強,能夠在Live555提供的一些基類基礎上開發出適合本身項目需求的服務程序。網絡

Live555架構和RTSP數據流程

Live555的核心模塊

RTSP服務器和客戶端的交互流程

Live555流媒體模塊及服務端的處理流程

Live555的流媒體模塊基本分爲Source和Sink兩大部分,固然他們也有一個共同的基類Medium。對服務器來講,Source爲數據來源,Sink爲數據輸出,視頻數據就經過MediaSource傳遞給MediaSink,最終經過RTPInterface網絡傳輸給客戶端。一下爲服務端所用到的模塊以及繼承關係:session

如同上圖所示意的,經過完成本身的ServerMediaSubsession和MediaSource來實現將須要直播的H.264編碼數據傳遞給live555,以實現RTSP直播。架構

高碼率視頻數據傳輸的優化點

對高清高碼率的視頻畫面,每一幀的視頻數據就會比較大,這個數值每每會超出live555內部默認的內存處理大小,由於對於live555的優化,主要就是集中在內存緩衝大小的擴大,以及避免內存數據拷貝。如下爲根據實際開發和測試所總結出來的有效的優化點:socket

  1. 擴展幀解析buffer大小,即BANK_SIZE,默認值爲150k,根據傳輸的H264數據幀大小,至少設置爲300k。不然超出大小,可能會被Live555拋棄。
  2. 增長OutPacketBuffer::maxSize大小,一樣爲了容納超大幀數據,不然可能會致使數據丟失。
  3. 在RTPInterface中,增長socket發送緩衝區大小,即increaseSendBufferTo函數的參數值
  4. 對MultiFramedRTPSink::sendPacketIfNecessary中,能夠直接調用sendNext嘗試組建RTP報文發送數據包,這樣修改的優勢是已讀取的數據會被儘快發送出去,不過也多佔用一些線程時間。
  5. 對於應用程序將數據從本身的線程傳遞給Live555的時候,應該儘可能減小內存拷貝,最好是經過內存池的形式,以免拷貝內存阻塞Live555事件循環

通過以上修改,以及應用程序內部代碼的優化,在實際應用中,已經實現了10Mbps高碼率的1080p以上高分辨率高清視頻的流暢直播。函數


haibindev.cnblogs.com,合做請聯繫QQ。(轉載請註明做者和出處~)性能

相關文章
相關標籤/搜索