LIVE555再学习 -- OpenRTSP 源码分析
生活随笔
收集整理的這篇文章主要介紹了
LIVE555再学习 -- OpenRTSP 源码分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看了很多東西,感覺有點雜。源碼分析部分也看了,講的也就那樣。現(xiàn)在有點不知道從哪講起了。
參看:nkmnkm的專欄-流媒體
參看:smilestone322的專欄-live555
一、源碼組成
包括上述四個庫和mediaServer服務器程序,以及其他的測試代碼。 這幾個文件在官網(wǎng)是有介紹的: 參看:live555 Description
這個我應該有講了三遍了,這里推薦一個官網(wǎng)上介紹的數(shù)據(jù)結(jié)構(gòu)圖和文件列表結(jié)構(gòu)圖。 參看:live555_Data Structures 參看:live555_File List
然后,這些四個庫的源碼貌似在做移植的時候并沒有什么改動的吧,鏈接這四個庫不就可以了嗎。 可能也是我不了解啊,所以我現(xiàn)在重點看?mediaServer 服務器程序和?testProgs 測試代碼的源碼分析。
二、OpenRTSP 分析
參看:openRTSP 翻譯一下: “openRTSP”是一個命令行程序,可以用來打開,流,接收和記錄(可選)指定的媒體流RTSP——即URL。,一個URL,始于rtsp:/ / 運行這個程序的最簡單的方式是: ?openRTSP < url >(1)選項
- Basic operation
- Playing without receiving
- Playing-time options
- Streaming access-controlled sessions
- Outputting a ".mov", ".mp4", or ".avi"-format file
- Periodic file output
- 'Trick play' options
- Other options
- A note about RealAudio and RealVideo sessions
- Source code
- Support and customization
- Summary of command-line options
(2)源碼
該程序使用“LiveMedia”庫中的“RTSPClient”,“MediaSession”,“FileSink”,“QuickTimeFileSink”和幾個“* RTPSource”模塊,作為“LIVE555 Streaming Media”源代碼包的一部分。程序本身的源代碼也與該軟件包捆綁在一起,作為“testProgs”目錄中的文件“openRTSP.cpp”和 “playCommon.cpp”。有關(guān)如何從源代碼構(gòu)建該程序的說明,請參閱“LIVE555 Streaming Media”文檔。 注意:如果您正在尋找如何使用“LIVE555 Streaming Media”代碼構(gòu)建自己的RTSP / RTP媒體播放器客戶端的示例,那么“openRTSP”源代碼不是最好的例子,因為它包含很多額外的選項,大多數(shù)你可能不需要。 (此外, “openRTSP”代碼被設(shè)計為一個獨立的應用程序,而不是嵌入在其他應用程序中。)而應該使用 “testRTSPClient”應用程序代碼(也在“testProgs”目錄中)作為模型。
《1》分析?playCommon.cpp 的 main 函數(shù)
參看:live555 分析- openRtsp參看:庖丁解牛-----Live555源碼徹底解密(根據(jù)OpenRTSP講解) 參看:live555/testProgs/playCommon.cpp main函數(shù)流程
void main(int argc,char *argv[])
{
1. ? ? ? ? ? ?創(chuàng)建BasicTaskScheduler對象
2. ? ? ? ? ? ?創(chuàng)建BisicUsageEnvironment對象
3. ? ? ? ? ? ?分析argv參數(shù),(最簡單的用法是:openRTSP rtsp://172.16.24.240/mpeg4video.mp4)以便在下面設(shè)置一些相關(guān)參數(shù)
4. ? ? ? ? ? ?創(chuàng)建RTSPClient對象
5. ? ? ? ? ? ?由RTSPClient對象向服務器發(fā)送OPTION消息并接受回應
6. ? ? ? ? ? ?產(chǎn)生SDPDescription字符串(由RTSPClient對象向服務器發(fā)送DESCRIBE消息并接受回應,根據(jù)回應的信息產(chǎn)生 SDPDescription字符串,其中包括視音頻數(shù)據(jù)的協(xié)議和解碼器類型)
7. ? ? ? ? ? ?創(chuàng)建MediaSession對象(根據(jù)SDPDescription在MediaSession中創(chuàng)建和初始化MediaSubSession子會話對 象)
8. ? ? ? ? ? ?while循環(huán)中配置所有子會話對象(為每個子會話創(chuàng)建RTPSource和RTCPInstance對象,并創(chuàng)建兩個GroupSock對象,分別對應 RTPSource和RTCPInstance對象,把在每個GroupSock對象中創(chuàng)建的socket描述符置入 BasicTaskScheduler::fReadSet中,RTPSource對象的創(chuàng)建的依據(jù)是SDPDescription,例如對于MPEG4 文件來說,視音頻RTPSource分別對應MPEG4ESVideoRTPSource和MPEG4GenericRTPSource對象。 RTCPInstance對象在構(gòu)造函數(shù)中完成將Socket描述符、處理接收RTCP數(shù)據(jù)的函數(shù) (RTCPInstance::incomingReportHandler)以及RTCPInstance本身三者綁定在一個 HandlerDescriptor對象中,并置入BasicTaskScheduler::fReadHandler中。完成綁定后會向服務器發(fā)送一條 消息。)
9. ? ? ? ? ? ?由RTSPClient對象向服務器發(fā)送SETUP消息并接受回應。
10. ? ? ? ?while循環(huán)中為每個子會話創(chuàng)建接收器(FileSink對象),在FileSink對象中根據(jù)子會話的codec等屬性缺省產(chǎn)生記錄視音頻數(shù)據(jù)的文件 名,視音頻文件名分別為:video-MP4V-ES-1和audio-MPEG4-GENERIC-2,無后綴名
11. ? ? ? ?while循環(huán)中為每個子會話的視音頻數(shù)據(jù)裝配相應的接收函數(shù),將每個子會話中的RTPSource中的GroupSock對象中的SOCKET描述符, 置入BasicTaskScheduler::fReadSet中,并將描述符、處理接收RTP數(shù)據(jù)的函數(shù) (MultiFramedRTPSource::networkReadHandler)以及RTPSource本身三者綁定在一個 HandlerDescriptor對象中,并置入BasicTaskScheduler::fReadHandler中,并將FileSink的緩沖區(qū) 和包含寫入文件操作的一個函數(shù)指針配置給RTPSource對象,這個緩沖區(qū)將會在networkReadHandler中接收來自網(wǎng)絡(luò)的視音頻數(shù)據(jù)(分 析和去掉RTP包頭的工作由RTPSource完成),而這個函數(shù)指針在networkReadHandler中被調(diào)用以完成將緩沖區(qū)中的數(shù)據(jù)寫入文件。
12. ? ? ? ?由RTSPClient對象向服務器發(fā)送PLAY消息并接受回應。
13. ? ? ? ?進入while循環(huán),調(diào)用BasicTaskScheduler::SingleStep()函數(shù)接受數(shù)據(jù),直到服務器發(fā)送TREADOWN消息給客戶 端,客戶端接收到該消息后釋放資源,程序退出。
}
《2》實例
參看:RTSP客戶端接收存儲數(shù)據(jù)(live555庫中的openRTSP實例) 上面我們已經(jīng)把openRTSP的的源碼分析了一下,現(xiàn)在簡單來做個測試。 先打開 live555 服務器,然后再執(zhí)行? ./openRTSP ?-d ?20 ? -f ?20 ?-w 640 ?-h ?480 ? -b ?400000 ?"rtsp://192.168.2.xx/test.264" 參數(shù)解釋:-d ?20 ? --->程序運行時間,如果沒有程序持續(xù)從服務器獲取視頻;
-f ? 20 ? ----> 幀率
-w ?640 ?-h ?480 -----> 幀分辨率
-b ?400000 ?---->碼率
總結(jié)
以上是生活随笔為你收集整理的LIVE555再学习 -- OpenRTSP 源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试题(96~125)《中》
- 下一篇: LIVE555再学习 -- testRT