基於Live555實現RtspServer及高清高碼率視頻傳輸優化
最近做了一些pc和嵌入式平台的RTSP服務器項目,大多數的要求是簡單但是功能全面,並且性能還要強勁。綜合考慮后,基本都是在基於live555的基礎上進行開發,在進行Live555本身的優化以及程序內部視頻數據傳輸的優化后,不僅實現了需求而且性能還超出預期,實現了10Mbps高碼率的1080p以上高分辨率高清視頻的流暢直播。這里將一些優化點分享一下:
為什么基於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網絡傳輸給客戶端。一下為服務端所用到的模塊以及繼承關系:
如同上圖所示意的,通過完成自己的ServerMediaSubsession和MediaSource來實現將需要直播的H.264編碼數據傳遞給live555,以實現RTSP直播。
高碼率視頻數據傳輸的優化點
對高清高碼率的視頻畫面,每一幀的視頻數據就會比較大,這個數值往往會超出live555內部默認的內存處理大小,因為對於live555的優化,主要就是集中在內存緩沖大小的擴大,以及避免內存數據拷貝。以下為根據實際開發和測試所總結出來的有效的優化點:
- 擴展幀解析buffer大小,即BANK_SIZE,默認值為150k,根據傳輸的H264數據幀大小,至少設置為300k。否則超出大小,可能會被Live555拋棄。
- 增加OutPacketBuffer::maxSize大小,同樣為了容納超大幀數據,否則可能會導致數據丟失。
- 在RTPInterface中,增加socket發送緩沖區大小,即increaseSendBufferTo函數的參數值
- 對MultiFramedRTPSink::sendPacketIfNecessary中,可以直接調用sendNext嘗試組建RTP報文發送數據包,這樣修改的優點是已讀取的數據會被盡快發送出去,不過也多占用一些線程時間。
- 對於應用程序將數據從自己的線程傳遞給Live555的時候,應該盡量減少內存拷貝,最好是通過內存池的形式,以避免拷貝內存阻塞Live555事件循環
經過以上修改,以及應用程序內部代碼的優化,在實際應用中,已經實現了10Mbps高碼率的1080p以上高分辨率高清視頻的流暢直播。
haibindev.cnblogs.com,合作請聯系QQ。(轉載請注明作者和出處~)