文章來自:http://blog.csdn.net/ghostyu/article/details/7485537
本文是 我對TI DM368IPNC RTSP直播部分的程式碼分析。
appro IPNC視頻流直播部分用的RTSP,基於live555,通過改寫wis-streamer實現的,在live555官網上有wis-streamer的代碼下載,appro將其修改,在framedsource中加入了GetAVData介面,這樣ipnc就可以直播了。
感慨:C++ 真的太好用了
現在懶了,文字部分就直接複製出來,來源文件使用的是excel,
文檔:http://www.kuaipan.cn/file/id_48923272389066806.html
基於live555的ApsaraVideo for Live DM368IPNC RTSP分析
一、描述
appro利用live555實現了三種視頻流以及一種音頻流的直播
1、MJPEG Video
2、H264 Video
3、MPEG4 Video
4、PCM Audio
live555是一個開源的RTSP C++類庫,預設實現音視頻檔案的點播,但是可以通過繼承相關類,重寫相關方法實現ApsaraVideo for Live
live555提供的實現直播的通用步驟是:
來自之前的《live555分析與開發.xlsx》
appro也是按照此種方法實現
二、Appro的添加的live555源檔案
之所以檔案複雜,是由於實現了多種音視頻流,如果只留其一,源檔案將非常簡潔
是appro源碼的UML類圖
APPROInput類 類似於設計模式中的簡單原廠模式,用於建立具體的FramedSource,對於WISServerMediaSubsession類來說,處理FramedSource的介面是相同的,
但是對於FramedSource來說,VideoSource與AudioSource的具體的幀擷取是不同的,
這樣,就需要利用APPROInput來分別建立VideoSource和AudioSource。
類APPROInput的videoSource()方法 返回VideoOpenFileSource類的執行個體
類APPROInput的audioSource()方法 返回AudioOpenFileSource類的執行個體
三、重要的FramedSource
FramedSource類的doGetNextFrame()方法用於獲得音視頻的幀資料,子類需要實現這個方法
OpenFileSource中的incomingDataHandler1,調用了虛函數readFromFile,這個函數與底層相關,
所有由OpenFileSource的子類 VideoOpenFIleSource和AudioOpenFileSource類實現
在appro的ipnc中,不管是視頻還是音頻資料,均是通過GetAVData()函數來獲得,
所以VideoOpenFileSource類和AudioOpenFIleSource類的readFromFile方法中封裝了GetAVData()這個函數。
具體獲得哪種類型的資料是由類OpenFileSource中的屬性APPROInput &fInput來傳遞的
在main函數中有關FramedSource操作的所有代碼如,以H264為例
啟示:在移植appro的live555到高清相機中,我認為最好的方法就是按照IPNC的GetAVData()函數結構,
封裝高清相機的GetAVData()函數,高層的live555RTSP部分可不做任何改動
四、RTSP直播 main主程式
這與普通的live555 rtsp service結構並無太多區別,只是由於要傳輸的視頻類型較多,所以多了很多if else,這部分比較簡單,不作分析。
appro也是按照此種方法實現