日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LIVE555再学习 -- testRTSPClient 源码分析

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LIVE555再学习 -- testRTSPClient 源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在開講?testRTSPClient。在官網這這樣一段介紹,參看:RTSP client 翻譯下來就是: testRTSPClient 是一個命令行程序,顯示如何打開和接收由 RTSP URL 指定的媒體流,即以rtsp://開頭的URL
在這個演示應用中,接收到的音頻/視頻數據什么也沒有。 但是,您可以在自己的應用程序中使用和調整此代碼(例如)解碼和播放接收到的數據。
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 源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。