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