LIVE555再学习 -- testRTSPClient 源码分析
生活随笔
收集整理的這篇文章主要介紹了
LIVE555再学习 -- testRTSPClient 源码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在開講?testRTSPClient。在官網這這樣一段介紹,參看:RTSP client
翻譯下來就是:
testRTSPClient 是一個命令行程序,顯示如何打開和接收由 RTSP URL 指定的媒體流,即以rtsp://開頭的URL
在這個演示應用中,接收到的音頻/視頻數據什么也沒有。 但是,您可以在自己的應用程序中使用和調整此代碼(例如)解碼和播放接收到的數據。
openRTSP 類似于“testRTSPClient”,但具有更多的功能。 這是一個命令行程序,它與“testRTSPClient”不同,旨在用作一個完整的全功能應用程序(而不是在其他應用程序中使用其代碼)。 也正應為如此,openRTSP”源代碼并不是最好的例子,因為它包含很多額外的選項,大多數你可能不需要。
所以,如果您正在尋找如何使用“LIVE555 Streaming Media”代碼構建自己的RTSP / RTP媒體播放器客戶端
應該使用“testRTSPClient”應用程序代碼(也在“testProgs”目錄中)作為模型。
推薦使用 ctags 來查看源碼進行分析? 參看:日常生活小技巧 -- vim 中 ctags 的安裝和使用 下面所說的跳轉查看就是 ctrl+},然后看完后返回跳轉前位置 ctrl+t
上圖可以看到,創建BasicTaskScheduler 和 BisicUsageEnvironment對象。 重點是 openURL 函數,然后 ctrl+] 跳轉查看 openURL 的定義
首先通過 ourRTSPClient::createNew 函數最終會調用 ourRTSPClient 的構造函數,基類 RTSPClient 的指針指向派生類 ourRTSPClient 對象,并且最終會調用 RTSPClient 的構造函數; sendDescribeCommand 函數往服務器端發送 Describe 請求;continueAfterDESCRIBE 為回調函數;在DoEventLoop 中的 SingleStep 中調用; RTP over tcp 還是udp 由宏 #define REQUEST_STREAMING_OVER_TCP False 進行控制;
將continueAfterDESCRIBE 函數傳遞到 responseHandler,相當于 continueAfterDESCRIBE 為一個回調函數;注意 RequestRecord 這個類的作用;在 SendRequest 中調用 RequestRecord 的構造函數.
可看到將回調函數保存在 RequestRecord 類的 fHandler 上;
根據上圖可看到?RequestRecord 類定義。所以說?在 SendRequest 中調用 RequestRecord 的構造函數.
parseRTSPURL
setupStreamSocket
connectToServer
setBackgroundHandling
incomingDataHandler
這幾個函數下面需要一一看一下,根據名字也可能看出它們是什么作用的。
上圖為 setBackgroundHandling 函數定義,其中 HandlerSet* fHandlers 連上服務器后,調用incomingDataHandler 回調函數;
回顧(6)~(9)openConnection 函數用來連接到服務器;在該函數中首先調用 parseRTSPURL 解析客戶端的 RtspURL;然后建立socket(),然后 connectToServer 連接到服務器;;incomingDataHandler 為回調函數;incomingDataHandler 函數,最終賦值給了 handler->handlerProc = handlerProc;
那么我們接下來就看看這幾個函數。
建立 socket 的函數為 setupStreamSocket,該函數建立的是一個 tcp 的 socket;
setupStreamSocket 函數首先創建 socket,然后設置 SO_REUSEADDR socket 屬性;并且調用 bind 函數綁定socket;最后將 socket 設置成非阻塞形式;
主要起作用的是這句話:
envir().taskScheduler().setBackgroundHandling(socketNum,SOCKET_WRITABLE|SOCKET_EXCEPTION,(TaskScheduler::BackgroundHandlerProc*)&connectionHandler,
然后?setBackgroundHandling 我們在 (7)里看過了。現在看一下?connectionHandler
這里如果想要該程序退出,在外面將 *watchVariable=1 就可以了
connectionHandler 在 SingleStep 函數中會調用,調用如下:
(*handler->handlerProc)(handler->clientData,resultConditionSet);
到此,將數據接收部分的源碼分析完了。
與50位技術專家面對面20年技術見證,附贈技術全景圖
在這個演示應用中,接收到的音頻/視頻數據什么也沒有。 但是,您可以在自己的應用程序中使用和調整此代碼(例如)解碼和播放接收到的數據。
openRTSP 類似于“testRTSPClient”,但具有更多的功能。 這是一個命令行程序,它與“testRTSPClient”不同,旨在用作一個完整的全功能應用程序(而不是在其他應用程序中使用其代碼)。 也正應為如此,openRTSP”源代碼并不是最好的例子,因為它包含很多額外的選項,大多數你可能不需要。
所以,如果您正在尋找如何使用“LIVE555 Streaming Media”代碼構建自己的RTSP / RTP媒體播放器客戶端
應該使用“testRTSPClient”應用程序代碼(也在“testProgs”目錄中)作為模型。
一、源碼解析
參看:庖丁解牛-----Live555源碼徹底解密(根據testRTSPClient講解) 參看:庖丁解牛-----Live555源碼徹底解密(testRTSPClient流程圖) 參看:live555/testProgs/testRTSPClient.cpp推薦使用 ctags 來查看源碼進行分析? 參看:日常生活小技巧 -- vim 中 ctags 的安裝和使用 下面所說的跳轉查看就是 ctrl+},然后看完后返回跳轉前位置 ctrl+t
(1)首先從?testRTSPClient.cpp 的 main函數開始看起
上圖可以看到,創建BasicTaskScheduler 和 BisicUsageEnvironment對象。 重點是 openURL 函數,然后 ctrl+] 跳轉查看 openURL 的定義
首先通過 ourRTSPClient::createNew 函數最終會調用 ourRTSPClient 的構造函數,基類 RTSPClient 的指針指向派生類 ourRTSPClient 對象,并且最終會調用 RTSPClient 的構造函數; sendDescribeCommand 函數往服務器端發送 Describe 請求;continueAfterDESCRIBE 為回調函數;在DoEventLoop 中的 SingleStep 中調用; RTP over tcp 還是udp 由宏 #define REQUEST_STREAMING_OVER_TCP False 進行控制;
(2)然后跳轉查看?sendDescribeCommand?
將continueAfterDESCRIBE 函數傳遞到 responseHandler,相當于 continueAfterDESCRIBE 為一個回調函數;注意 RequestRecord 這個類的作用;在 SendRequest 中調用 RequestRecord 的構造函數.
(3)然后跳轉查看?RequestRecord?
可看到將回調函數保存在 RequestRecord 類的 fHandler 上;
(4)然后跳轉查看?fHandler?
根據上圖可看到?RequestRecord 類定義。所以說?在 SendRequest 中調用 RequestRecord 的構造函數.
(5)然后返回到(2),跳轉查看?sendRequest
函數有點長,自行查看吧。然后其中有一部分:(6)然后跳轉查看 openConnection?
parseRTSPURL
setupStreamSocket
connectToServer
setBackgroundHandling
incomingDataHandler
這幾個函數下面需要一一看一下,根據名字也可能看出它們是什么作用的。
(7)然后跳轉查看 setBackgroundHandling
上圖為 setBackgroundHandling 函數定義,其中 HandlerSet* fHandlers 連上服務器后,調用incomingDataHandler 回調函數;
(8)然后跳轉查看 assignHandler
(9)然后跳轉查看 lookupHandler
回顧(6)~(9)openConnection 函數用來連接到服務器;在該函數中首先調用 parseRTSPURL 解析客戶端的 RtspURL;然后建立socket(),然后 connectToServer 連接到服務器;;incomingDataHandler 為回調函數;incomingDataHandler 函數,最終賦值給了 handler->handlerProc = handlerProc;
那么我們接下來就看看這幾個函數。
(10)然后返回到(6),跳轉查看 parseRTSPURL
函數有點長,自行查看吧。(11)然后返回到(6),跳轉查看 setupStreamSocket
建立 socket 的函數為 setupStreamSocket,該函數建立的是一個 tcp 的 socket;
setupStreamSocket 函數首先創建 socket,然后設置 SO_REUSEADDR socket 屬性;并且調用 bind 函數綁定socket;最后將 socket 設置成非阻塞形式;
(12)然后返回到(6),跳轉查看 connectToServer?
主要起作用的是這句話:
envir().taskScheduler().setBackgroundHandling(socketNum,SOCKET_WRITABLE|SOCKET_EXCEPTION,(TaskScheduler::BackgroundHandlerProc*)&connectionHandler,
然后?setBackgroundHandling 我們在 (7)里看過了。現在看一下?connectionHandler
(12)然后跳轉查看 connectionHandler
(13)然后跳轉查看 connectionHandler1
(14)然后返回到(1),跳轉查看 doEventLoop?
這里如果想要該程序退出,在外面將 *watchVariable=1 就可以了
(15)然后跳轉查看 SingleStep
函數有點長,自行查看吧connectionHandler 在 SingleStep 函數中會調用,調用如下:
(*handler->handlerProc)(handler->clientData,resultConditionSet);
到此,將數據接收部分的源碼分析完了。
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的LIVE555再学习 -- testRTSPClient 源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LIVE555再学习 -- OpenRT
- 下一篇: 互联网晚报 | 3月19日 星期六 |