基於Live555,ffmpeg的RTSP播放器直播與點播


基於Live555,ffmpeg的RTSP播放器直播與點播

多路RTSP高清視頻播放器下載地址:http://download.csdn.net/detail/u011352914/6604437
多路RTSP播放器源碼下載地址:http://download.csdn.net/detail/u011352914/6603251
多路RTSP播放器SDK說明下載地址:http://download.csdn.net/detail/u011352914/6603271
詳細完整資料下載地址:http://video.vomont.com/strmedia.html

   QQ:1589385592 討論群: 264575049

1.綜述

RTSP協議定義了一對多應用程序如何有效地通過IP網絡傳送多媒體數據,在體系結構上位於RTP和RTCP之上,它使用TCP或RTP完成數據傳輸。目前在流媒體傳輸技術中使用最多的就是基於RTSP/RTP的流媒體傳輸,在智能網絡攝像機上也需要實現基於RTSP/RTP的H.264實時流的傳輸。

RTSP協議基於TCP完成RTSP請求報文和響應報文的傳輸,RTP協議基於UDP協議完成流媒體數據的實時傳輸,RTCP協議基於UDP協議提供客戶端和服務器有關當前網絡擁塞和以及實時流傳輸質量等信息。

 

2.架構設計

本文研究的流媒體播放器主要用來對遵循RTSP標准協議的碼流以及AVI文件進行實時播放以及碼流錄制。播放器核心為兩個 DLL,分別為網絡 DLL 以及播放 DLL。網絡庫 基於 Live555 開發,主要對碼流的獲取以及鏈路的管理進行控制;播放庫基於基於 Live555以及DirectX 開發,主要對實時碼流以及本地的音視頻的文件進行解碼播放和控制。

該RTSP播放器實現了主流RTSP播放器的基本功能,並有所拓展:

(1)RTSP 標准碼流(包括音視頻)的實時預覽播放;

(2)網絡數據流的斷線重連;

(3)對存儲文件的解碼播放以及控制;

(4)音視頻碼流的同步存儲,文件存儲時以當前系統的時間戳作為音視頻 播放時的索引,方便在文件播放時以時間戳作為檢索條件來點播文件;

(5)視頻播放格式上支持 h.264、mpeg4、mpeg2 等,音頻播放格式上支 持 AAC、AMR、G711 等;

(6)視頻抓拍;

(7)視頻顯示角度旋轉;

(8)畫面填充控制顯示比例。

3.程序框架

播放器整體設計參考VLC,MPLAYER等知名播放器,將整個數據的處理流程分為:input、demux、decode、output四個過程。其中input用來處理網絡數據流的輸入以及文件數據的讀取;demux用來做數據流的解復用,將音頻以及視頻數據分離成ES流;decode用來解碼視頻以及音頻ES流,並輸出解碼后的數據(視頻為YUV數據,音頻為PCM格式);output用來處理YUV視頻數據的顯示以及PCM音頻數據的輸出。

為支持多路媒體數據並行解碼輸出,對於每路媒體數據分別設計了相應的engine引擎機制來進行管理,具體實現方案如下:

(1) 為實現多種輸入方式的擴展性,將input、demux、decode、output四個過程划分為兩個庫來實現,分別為數據源解析庫SourceSdk、播放庫PlaySdk;

(2) SourceSdK的管理功能由SourceEngine引擎來完成,主要對input以及demux模塊進行封裝管理。SourceEngine從數據源(直播、點播、文件)獲取數據,並解析數據將數據源分離成音頻ES流和視頻ES流,並將解析的數據以私有格式進行封裝,通過回調函數的機制傳遞給應用層;

(3) PlaySdk的管理功能由PlayEngine引擎來完成,主要對decode以及output模塊進行封裝管理。PlayEngine提供了數據輸入接口,通過該接口可以將從SourceEngine得到的數據傳入該接口,放入PlayEngine緩存。PlayEngine從緩存中提取數據,並對數據按協議格式進行解析,將解析出的音視頻數據分別回調;

(4) 為方便Engine對各模塊的管理以及數據通訊,在內部設計了消息機制,可以通過Engine給模塊發送消息控制各模塊的正常運行;

(5) 在相互作用的模塊之間,如decode與output之間采用高效的數據緩沖池機制來保證高效的內存分配,並通過隊列機制將數據進行有效的傳遞;

對於媒體數據大體處理流程圖如下:

 

 



4.主要技術

播放器在功能和性能上具有較高的要求,具體的實現上,需要主要解決的關鍵技術點主要包括有:多路高清解碼、兼顧低時延與流暢性、音視頻同步以及瀏覽器擴展。針對以上問題,實現上采用的相應解決辦法如下:

   4.1 多路高清解碼
多路高清解碼播放每路都由多個線程配合來完成整個數據的處理流程,在多路播放的情況下則更為復雜。因此需要在系統的實現上具有高效的多線程管理機制,以及對各模塊的組織、內部互聯互通上做出良好的設計:

(1) 通過SourceSdk、PlaySdk的實現,將繁瑣的數據處理流程統一成了標准的數據接口,控制管理上方便有效;

(2) 在SourceSdk、PlaySdk內部實現上通過engine機制,對單路數據以及播放的管理提供了統一接口,對於多路播放實際上只需要管理多個engine即可;

   4.2 低時延與流暢
在性能提高上通過減少對內存數據的拷貝以及額外的內存分配開銷:

(1) 在PlaySdk中設計了回環數據緩沖機制,對應用層輸入的數據進行高效的緩存,在傳輸decode模塊時,避免了數據拷貝;

(2) 在數據解碼中使用了ffmpeg的directbuffer機制,進一步的避免了數據的拷貝動作;

(3) 數據再各模塊之間傳遞時使用數據緩沖池,避免了額外的內存分配操作,同時也減少了因內存分配操作而帶來的內存碎片;

在低時延與流暢的平衡性上,通過設置最大緩沖幀數和最小緩沖幀數來實現控制,具體實現策略為:

通過比較待解碼緩沖區和解碼后還未來得及顯示的緩沖區里數據包的個數的和值,如果該值大於最大緩沖幀數,說明有很多數據在緩存里,延遲大了,這時就要加快顯示速度(減小output模塊的休眠時間),最大緩沖幀數就是影響延遲的;反之一樣, 最小緩沖幀數就是流暢的保證,該值越大就越流暢;通過改變這個最大值最小值就可以平衡延遲與流暢。

   4.3 音視頻同步
由於聲音對時間的敏感性,所以在同步的處理上,系統以聲音作為基准來參考,對視頻的輸出來進行調整,從而保證音視頻的同步性,具體實現為:

通過比較音頻和視頻的時間戳(pts)來對視頻的顯示速度進行調整,如當前的視頻的pts比音頻pts大於最小偏差值(目前設置為200MS),說明視頻快了,就放慢是視頻的顯示速度;反之就加快視頻的顯示速度;但是,如果差距太大(目前設置為1000MS), 大於最大偏差值時,加快視頻的顯示速度的效果不明顯就采用丟幀方式,這個一般出現再剛開啟的是時候。

   4.4 WEB瀏覽器調用
針對不同的瀏覽器需要來制作成不同的插件,即需要根據具體瀏覽器的插件接口來編寫,可以根據相應的項目需求開發開發支持響應瀏覽器的插件,一般性需求主要是IE瀏覽器OCX控件。
 
5.效果示例

 

 



RTSP直播與點播:多路視頻並發實時預覽,窗口布局可動態調整;可動態的設置視頻輸出的顯示比例,調整音量的輸出大小;支持對視頻內容的時間點檢索等操作。


多路RTSP高清視頻播放器下載地址:http://download.csdn.net/detail/u011352914/6604437
多路RTSP播放器源碼下載地址:http://download.csdn.net/detail/u011352914/6603251
多路RTSP播放器SDK說明下載地址:http://download.csdn.net/detail/u011352914/6603271



 ======================================================================

   QQ:1589385592 討論群: 264575049 (群共享可直接下載)
======================================================================
(版權所有,轉載請注明作者和出處)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM