14.live555mediaserver-setup請(qǐng)求與響應(yīng)-創(chuàng)新互聯(lián)

live555工程代碼路徑
live555工程在我的gitee下(doc下有思維導(dǎo)圖、drawio圖):https://gitee.com/lure_ai/live555/tree/master

創(chuàng)新互聯(lián)建站作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),有關(guān)成都定制網(wǎng)頁(yè)設(shè)計(jì)方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及成都戶外休閑椅等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

學(xué)習(xí)demo
live555mediaserver.cpp

學(xué)習(xí)線索和姿勢(shì)
1.學(xué)習(xí)的線索和姿勢(shì)

網(wǎng)絡(luò)編程
流媒體的地基是網(wǎng)絡(luò)編程(socket編程)。
[網(wǎng)絡(luò)編程學(xué)習(xí)]-0.學(xué)習(xí)路線。

繪圖規(guī)則
本文的對(duì)象圖和思維導(dǎo)圖遵守的規(guī)則詳見(jiàn):
2.繪圖規(guī)則

非阻塞服務(wù)端網(wǎng)絡(luò)編程流程
socket創(chuàng)建、bind、listen、select、accept、select、recv/send-close。

rtsp協(xié)商流程
options、describe、setup、play、pause、teardown、get parameter、set parameter

本節(jié)內(nèi)容和目標(biāo)
(1)rtsp協(xié)議的setup請(qǐng)求與響應(yīng)
(2)思維導(dǎo)圖繪制
(3)wireshark抓包
(4)對(duì)象圖

正式開(kāi)始
DESCRIBE協(xié)商完事,VLC接著下發(fā)了setup信令,開(kāi)始setup協(xié)商。

1.客戶端SETUP請(qǐng)求報(bào)文

請(qǐng)求報(bào)文如下
在這里插入圖片描述
圖14-1

可以參照l(shuí)ive555mediaserver-如何解析rtsp請(qǐng)求報(bào)文把這請(qǐng)求報(bào)文解析出來(lái)。需要注意的是解析的只局限于請(qǐng)求方法、CSeq、Session、Content-Length等,它下發(fā)的其他字段就過(guò)濾了。
需要關(guān)注的是,這里服務(wù)端會(huì)用來(lái)識(shí)別發(fā)送模式——UDP or TCP?——這個(gè)字段是Transport字段——如果是RTP/AVP/TCP,則要求采用TCP方式進(jìn)行數(shù)據(jù)傳輸。如果是RTP/AVP那么就是UDP。還有其他下面詳說(shuō)。

2.服務(wù)端處理SETUP請(qǐng)求與響應(yīng)

根據(jù)前面知道,每一個(gè)客戶端鏈接,在服務(wù)端都綁定一個(gè)對(duì)象RTSPServer::RTSPClientConnection,每次客戶端協(xié)議來(lái)數(shù)據(jù)來(lái)了,都會(huì)調(diào)用到RTSPServer::RTSPClientConnection::handleRequestBytes里,如下圖目前知道OPTIONS、DESCRIBE、REGISTER、DEREGISTER、特殊url的GET_PARAMETER和SET_PARAMETER是會(huì)在這個(gè)對(duì)象里處理。
在這里插入圖片描述
圖14-2

那么從setup開(kāi)始,又新建一個(gè)處理對(duì)象進(jìn)行處理了。怎么創(chuàng)建的呢?RTSPServer::RTSPClientConnection::handleRequestBytes識(shí)別到時(shí)setup信令,調(diào)用流程如下圖14-3。
在這里插入圖片描述
圖14-3
圖14-3所示,此時(shí)setup處理流程會(huì)走到紅箭頭1,GenericMediaServer::createNewClientSessionWithId,這個(gè)是對(duì)象DynamicRTSPServer的父類的父類的成員,它主要干2件事,一個(gè)是創(chuàng)建對(duì)象RTSPServer::RTSPClientSession,另一個(gè)是把這個(gè)對(duì)象加入到GenericMediaServer::fClientSessions這個(gè)成員管理的hash鏈表了,如下圖,——后面想想,圖是代碼的映射,它們應(yīng)該對(duì)應(yīng)起來(lái),先貼出來(lái)代碼:
在這里插入圖片描述
Session的產(chǎn)生
代碼圖中標(biāo)記1中sesionId是隨機(jī)產(chǎn)生的數(shù)字,然后和新對(duì)象綁定一起,在組響應(yīng)包時(shí)會(huì)作為Session字段返回給VLC客戶端的,play時(shí)vlc又會(huì)下發(fā)過(guò)來(lái),用以找到正確的新對(duì)象的。

新對(duì)象的產(chǎn)生
代碼圖中,第2和第3標(biāo)記執(zhí)行完就是如下圖的14-4和14-5的模樣。
在這里插入圖片描述
14-4
fClientSessions這個(gè)成員管理的hash鏈表如下圖14-5。整個(gè)圖太大,只能截?cái)?,可以看我gitee上live555工程doc下的對(duì)象圖。
在這里插入圖片描述

圖14-5
如上圖14-5,和describe一樣是同樣類型的hash鏈表,就直接拷貝過(guò)來(lái)了,只是鏈表成員不一樣的——setup把新創(chuàng)建的對(duì)象RTSPServer::RTSPClientSession的父類的指針加入到這個(gè)鏈表里的value里了。注意代碼圖的標(biāo)記3在add時(shí)把sesionid傳給了這個(gè)鏈表成員的key值,后面play下發(fā)會(huì)再次通過(guò)這個(gè)sessionid進(jìn)行查找到這個(gè)新對(duì)象。

接著調(diào)用新對(duì)象RTSPServer::RTSPClientSession的handleCmd_SETUP方法,
在這里插入圖片描述
它又調(diào)用GenericMediaServer::lookupServerMediaSession,而它是個(gè)虛方法,實(shí)際調(diào)用的是DynamicRTSPServer::lookupServerMediaSession(原因參見(jiàn)上一節(jié))。然后查找fServerMediaSessions管理的hash鏈表是否有這個(gè)url文件路徑,因?yàn)閐escribe已經(jīng)插入了,在這里找到了,又移除它,又重新創(chuàng)建,具體原因,沒(méi)有細(xì)看。
這個(gè)最后又調(diào)用RTSPServer::RTSPClientSession的回調(diào)靜態(tài)方法SETUPLookupCompletionFunction1,接著調(diào)用新對(duì)象的handleCmd_SETUP_afterLookup1方法,然后最終來(lái)到了setup組響應(yīng)報(bào)文的地方——handleCmd_SETUP_afterLookup2。其流程如下圖14-6.
在這里插入圖片描述
圖14-6

如圖14-6數(shù)字1是調(diào)用GenericMediaServer::lookupServerMediaSession的流向,太大了截圖放不下,算了。數(shù)字2是又回調(diào)回來(lái)了。最終是數(shù)字4來(lái)到了handleCmd_SETUP_afterLookup2。
其主要干了啥事,如下思維導(dǎo)圖,圖14-7.
在這里插入圖片描述
圖14-7
創(chuàng)建對(duì)象數(shù)組 struct streamState 保存各個(gè)ServerMediaSubsession對(duì)象,這個(gè)保存的就是前面創(chuàng)建的ServerMediaSubsession對(duì)象。代碼圖如下:
在這里插入圖片描述
代碼圖對(duì)應(yīng)的對(duì)象圖如下圖14-8——代碼圖一執(zhí)行就如下圖模樣。.

在這里插入圖片描述
圖14-8
模擬類就是示意,因?yàn)轭悎D太大了,只能把那個(gè)離的遠(yuǎn)的類在這一張圖中表示出來(lái)了。

接著是解析協(xié)商傳輸方式,如下圖14-9。
在這里插入圖片描述
圖14-9
streamingMode這引用變量默認(rèn)是RTP_UDP。while來(lái)解析RTP_TCP和RAW_UDP,而我們的VLC下發(fā)的setup信息如圖14-1中是RTP/AVP/TCP,這里自然就是RTP_TCP了。

然后根據(jù)根據(jù)不同的傳輸方式組不同的setup響應(yīng)報(bào)文。
在這里插入圖片描述
圖14-10
注意呀,里面除了傳輸方式,還有個(gè)字段非常關(guān)鍵——Session字段,這個(gè)就是前面看到的sessionid了,這個(gè)告訴VLC客戶端,你等會(huì)play的時(shí)候下發(fā)的Session字段應(yīng)該填什么,這樣服務(wù)端才能找到新對(duì)象RTSPServer::RTSPClientSession。

到此整個(gè)setup響應(yīng)流程完畢。setup的完整處理思維導(dǎo)圖如下圖14-11.
在這里插入圖片描述
圖14-11。

其組裝的setup響應(yīng)報(bào)文用wireshark抓包如下圖14-12.。

在這里插入圖片描述
圖14-12

小結(jié)
為了實(shí)現(xiàn)setup業(yè)務(wù),又新增了幾個(gè)對(duì)象如下圖14-13.
在這里插入圖片描述

圖14-13.
可以看到,除了模擬的2個(gè)類(類圖太大了,為了在一張圖展現(xiàn)出來(lái)就模擬了下就是示意的意思)不是本節(jié)新創(chuàng)建的——最左邊是早創(chuàng)建了,最右邊是describe就創(chuàng)建了,在setup又銷毀重建了,就不算了——其他的新增了幾個(gè)對(duì)象:
(1)RTSPServer::RTSPClientSession。SETUP、PLAY、PAUSE、TEARDOWN、正常url的GET_PARAMETER和SET_PARAMETER都在這個(gè)新對(duì)象里處理了。
(2)struct streamState對(duì)象數(shù)組。這個(gè)為何是數(shù)組呢?因?yàn)槿绻鹍escribe階段sdp有2個(gè)m字段——假如一個(gè)音頻一個(gè)視頻,則VLC會(huì)下發(fā)2次setup,那也就會(huì)走2次setup流程,這個(gè)會(huì)怎么樣呢?沒(méi)有細(xì)看,應(yīng)該會(huì)創(chuàng)建2個(gè)subsession吧,回頭再說(shuō)。
(3)一個(gè)hash鏈表。它這個(gè)呀主要是把setup新建立的對(duì)象RTSPServer::RTSPClientSession管理起來(lái),和sessionid綁定,組sdp響應(yīng)包。

在追蹤setup業(yè)務(wù)線索的過(guò)程中,發(fā)現(xiàn)了live555為了實(shí)現(xiàn)這個(gè)業(yè)務(wù)新增了這幾個(gè)對(duì)象(目前關(guān)注點(diǎn)),然后就把代碼轉(zhuǎn)化成圖的形式。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:14.live555mediaserver-setup請(qǐng)求與響應(yīng)-創(chuàng)新互聯(lián)
URL地址:http://muchs.cn/article14/eeege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、微信公眾號(hào)、外貿(mào)建站、網(wǎng)站營(yíng)銷、定制網(wǎng)站、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)