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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LIVE555再学习 -- OpenRTSP 源码分析

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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
它有上面這幾種形式,這里就不講了。直接看命令行選項。 -4 輸出'.mp4'格式的文件(到'stdout',除非也給出了“-P <interval-in-seconds>”選項) -a 只播放音頻流(到“stdout”,除非還給出了“-P <interval-in-seconds>”選項) -A <codec-number> 指定要從服務器請求的音頻編解碼器的靜態RTP有效載荷格式編號(僅限“playSIP”) -b <buffer-size> 更改輸出文件緩沖區大小 -B <buffer-size> 更改輸入網絡套接字緩沖區大小 -c 連續播放 -C 即使服務器的“DESCRIBE”響應沒有指定多播地址,也明確要求組播流。 (請注意,并不是所有的服務器都支持這一點。)(僅限“openRTSP”) -d <duration> 指定顯式持續時間 -D <maximum-inter-packet-gap> 指定退出之前等待的最長不活動周期 -E <absolute-seek-end-time> 請求服務器以指定的絕對時間結束流式傳輸(格式為“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。<frac> Z”)(僅用于-U <initial-absolute-seek - 時間> -f <frame-rate> 指定視頻幀速率(僅與“-q”,“-4”或“-i”一起使用) -F <fileName-prefix> 為每個輸出文件名指定一個前綴 -g <user-agent-name> 指定要在傳出請求中使用的用戶代理名稱 -h <height> 指定視頻圖像高度(僅與“-q”,“-4”或“-i”一起使用) -H 為每個音頻/視頻軌道輸出一個QuickTime“提示軌跡”(僅與“-q”或“-4”一起使用) -i 輸出'.avi'格式的文件(“stdout”),除非也給出了“-P <interval-in-seconds>”選項) -I <interface-name-or-address> 指定要在其上接收數據的特定網絡接口 -k <username> <password> 指定用于驗證傳入“REGISTER”命令所需的用戶名和密碼(僅與“-R”一起使用) -K 定期發送RTSP“OPTIONS”命令,以保持連接的有效性。 (這對于不聽我們的定期RTCP“RR”數據包的錯誤的服務器是有用的。) -l 嘗試補償數據包丟失(僅與“-q”,“-4”或“-i”一起使用) -m 將每個傳入幀輸出到一個單獨的文件中 -M <MIME-subtype> 指定音頻編解碼器從服務器請求的動態RTP有效載荷格式的MIME子類型(僅限“playSIP”) -n RTP 數據包開始到達時不會通知 -o 請求服務器的命令選項,而不發送“DESCRIBE”(僅限“openRTSP”) -O 不要求服務器的命令選項;只需發送“DESCRIBE”(“openRTSP”) -p <starting-port-number> 指定客戶端口號 -P <interval-in-seconds> 寫入新的輸出文件,每隔<interval-in-seconds>秒 -q 輸出一個QuickTime'.mov'格式的文件(“stdout”,除非也給出了“-P <間隔時間>”選項) -Q 輸出關于數據流的“QOS”統計信息(程序退出時) -r 播放RTP流,但不要接收它們 -R(或-R <port-number>) 等待輸入的“REGISTER”命令,指定要播放的“rtsp://”URL。使用此選項而不是命令行上的“rtsp://”URL。 (僅限“openRTSP”) -s <initial-seek-time> 請求服務器在流媒體之前尋找到指定的時間(以秒為單位) -S <byte-offset> 假定一個簡單的RTP有效載荷格式(跳過指定大小的特殊標題) -t 通過TCP流RTP / RTCP數據,而不是通常的UDP。 (僅限“openRTSP”) -T <http-port-number> 喜歡“-t”,除了使用RTSP over HTTP隧道。 (僅限“openRTSP”) -u <username> <password> 指定摘要驗證的用戶名和密碼 -U <initial-absolute-seek-time> 請求服務器在流前尋求指定的絕對時間(格式為“YYYYMMDDTHHMMSSZ”或“YYYYMMDDTHHMMSS。<frac> Z”) -v 只播放視頻流(到“stdout”),除非也給出了“-P <間隔時間>”選項) -V 打印較少詳細的診斷輸出 -w <width> 指定視頻圖像寬度(僅與“-q”,“-4”或“-i”一起使用) -y 嘗試同步音頻和視頻軌道(僅與“-q”或“-4”一起使用) -z <scale> 請求服務器縮放流(快進,慢或反向播放)

(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 源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

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