live555架構(gòu)分析

本文轉(zhuǎn)自雷霄驊的博客(https://blog.csdn.net/leixiaohua1020/article/details/12235615),大神已逝,精神永存。

liveMedia 項(xiàng)目(http://www.live555.com/)的源代碼包括四個(gè)基本的庫(kù),各種測(cè)試代碼以及Media Server。四個(gè)基本的庫(kù)分別是: UsageEnvironment&TaskScheduler, groupsock, liveMedia和BasicUsageEnvironment。UsageEnvironment 和TaskScheduler 類用于事件的調(diào)度,實(shí)現(xiàn)異步讀取事件的句柄的設(shè)置以及錯(cuò)誤信息的輸出。另外,還有一個(gè)HashTable 類定義了一個(gè)通用的hash 表,其它代碼要用到這個(gè)表。這些都是抽象類,在應(yīng)用程序中基于這些類來(lái)實(shí)現(xiàn)自己的子類。groupsock 類是對(duì)網(wǎng)絡(luò)接口的封裝,用于收發(fā)數(shù)據(jù)包。正如名字本身,groupsock 主要是面向多播數(shù)據(jù)的收發(fā)的,它也同時(shí)支持單播數(shù)據(jù)的收發(fā)。liveMedia 庫(kù)中有一系列類,基類是Medium,這些類針對(duì)不同的流媒體類型和編碼。

各種測(cè)試代碼在testProgram 目錄下,比如openRTSP 等,這些代碼有助于理解liveMedia 的應(yīng)用。

Media Server 是一個(gè)純粹的RTSP 服務(wù)器。支持多種格式的媒體文件:

* TS 流文件,擴(kuò)展名ts。

* PS 流文件,擴(kuò)展名mpg。

* MPEG-4視頻基本流文件,擴(kuò)展名m4e。

* MP3文件,擴(kuò)展名mp3。

* WAV 文件(PCM),擴(kuò)展名wav。

* AMR 音頻文件,擴(kuò)展名.amr。

* AAC 文件,ADTS 格式,擴(kuò)展名aac。

用live555開發(fā)應(yīng)用程序

基于liveMedia 的程序,需要通過(guò)繼承UsageEnvironment 抽象類和TaskScheduler 抽象類,定義相應(yīng)的類來(lái)處理事件調(diào)度,數(shù)據(jù)讀寫以及錯(cuò)誤處理。live 項(xiàng)目的源代碼里有這些類的一個(gè)基本實(shí)現(xiàn),這就是“BasicUsageEnvironment”庫(kù)。BasicUsageEnvironment 主要是針對(duì)簡(jiǎn)單的控制臺(tái)應(yīng)用程序,利用select 實(shí)現(xiàn)事件獲取和處理。這個(gè)庫(kù)利用Unix 或者Windows 的控制臺(tái)作為輸入輸出,處于應(yīng)用程序原形或者調(diào)試的目的,可以用這個(gè)庫(kù)用戶可以開發(fā)傳統(tǒng)的運(yùn)行與控制臺(tái)的應(yīng)用。

通過(guò)使用自定義的“UsageEnvironment”和“TaskScheduler”抽象類的子類,這些應(yīng)用程序就可以在特定的環(huán)境中運(yùn)行, 不需要做過(guò)多的修改。需要指出的是在圖形環(huán)境(GUI toolkit)下,抽象類TaskScheduler 的子類在實(shí)現(xiàn)doEventLoop()的時(shí)候應(yīng)該與圖形環(huán)境自己的事件處理框架集成。

基本概念

先來(lái)熟悉在liveMedia 庫(kù)中Source,Sink 以及Filter 等概念。Sink 就是消費(fèi)數(shù)據(jù)的對(duì)象,比如把接收到的數(shù)據(jù)存儲(chǔ)到文件, 這個(gè)文件就是一個(gè)Sink。Source 就是生產(chǎn)數(shù)據(jù)的對(duì)象,比如通過(guò)RTP 讀取數(shù)據(jù)。數(shù)據(jù)流經(jīng)過(guò)多個(gè)'source'和'sink's,下面是一個(gè)示例:

'source1' -> 'source2' (a filter) -> 'source3' (a filter) -> 'sink'

從其它Source 接收數(shù)據(jù)的source 也叫做"filters"。Module 是一個(gè)sink 或者一個(gè)filter。數(shù)據(jù)接收的終點(diǎn)是Sink 類,MediaSink 是所有Sink 類的基類。Sink 類實(shí)現(xiàn)對(duì)數(shù)據(jù)的處理是通過(guò)實(shí)現(xiàn)純虛函數(shù)continuePlaying(),通常情況下continuePlaying 調(diào)用fSource->getNextFrame 來(lái)為Source 設(shè)置數(shù)據(jù)緩沖區(qū),處理數(shù)據(jù)的回調(diào)函數(shù)等,fSource是MediaSink 的類型為FramedSource*的類成員。

基本控制流程

基于liveMedia 的應(yīng)用程序的控制流程如下:

應(yīng)用程序是事件驅(qū)動(dòng)的,使用如下方式的循環(huán)

while(1) {

通過(guò)查找讀網(wǎng)絡(luò)句柄的列表和延遲隊(duì)列(delayqueue)來(lái)發(fā)現(xiàn)需要完成的任務(wù)

完成這個(gè)任務(wù)

}

對(duì)于每個(gè)sink,在進(jìn)入這個(gè)循環(huán)之前,應(yīng)用程序通常調(diào)用下面的方法來(lái)啟動(dòng)需要做的生成任務(wù): someSinkObject->startPlaying()。任何時(shí)候,一個(gè)Module 需要獲取數(shù)據(jù)都通過(guò)調(diào)用剛好在它之前的那個(gè)Module 的FramedSource::getNextFrame() 方法。這是通過(guò)純虛函數(shù)FramedSource::doGetNextFrame() 實(shí)現(xiàn)的,每一個(gè)Source module 都有相應(yīng)的實(shí)現(xiàn)。

Each 'source' module's implementation of "doGetNextFrame()" works by arranging for an 'after?getting' function to be called (from an event handler) when new data becomes available for the?caller.

Note that the flow of data from 'sources' to 'sinks' happens within each application, and doesn't?necessarily correspond to the sending or receiving of network packets. For example, a server?application (such as "testMP3Streamer") that sends RTP packets will do so using one or more?"RTPSink" modules. These "RTPSink" modules receive data from other, "*Source" modules (e.g.,?to read data from a file), and, as a side effect, transmit RTP packets.

live555代碼解讀之一:RTSP 連接的建立過(guò)程

RTSPServer 類用于構(gòu)建一個(gè)RTSP 服務(wù)器,該類同時(shí)在其內(nèi)部定義了一個(gè)RTSPClientSession類,用于處理單獨(dú)的客戶會(huì)話。

首先創(chuàng)建RTSP 服務(wù)器( 具體實(shí)現(xiàn)類是DynamicRTSPServer) , 在創(chuàng)建過(guò)程中, 先建立Socket(ourSocket) 在TCP 的554 端口進(jìn)行監(jiān)聽, 然后把連接處理函數(shù)句柄(RTSPServer::incomingConnectionHandler)和socket 句柄傳給任務(wù)調(diào)度器(taskScheduler)。

任務(wù)調(diào)度器把socket 句柄放入后面select 調(diào)用中用到的socket 句柄集(fReadSet)中,同時(shí)將socket 句柄和incomingConnectionHandler 句柄關(guān)聯(lián)起來(lái)。接著,主程序開始進(jìn)入任務(wù)調(diào)度器的主循環(huán)(doEventLoop),在主循環(huán)中調(diào)用系統(tǒng)函數(shù)select 阻塞,等待網(wǎng)絡(luò)連接。

當(dāng)RTSP 客戶端輸入(rtsp://192.168.1.109/1.mpg)連接服務(wù)器時(shí),select 返回對(duì)應(yīng)的scoket,進(jìn)而根據(jù)前面保存的對(duì)應(yīng)關(guān)系, 可找到對(duì)應(yīng)處理函數(shù)句柄, 這里就是前面提到的incomingConnectionHandler 了。在incomingConnectionHandler 中創(chuàng)建了RTSPClientSession,開始對(duì)這個(gè)客戶端的會(huì)話進(jìn)行處理。

live555代碼解讀之二:DESCRIBE 請(qǐng)求消息處理過(guò)程

RTSP 服務(wù)器收到客戶端的DESCRIBE 請(qǐng)求后,根據(jù)請(qǐng)求URL(rtsp://192.168.1.109/1.mpg),找到對(duì)應(yīng)的流媒體資源, 返回響應(yīng)消息。live555中的ServerMediaSession 類用來(lái)處理會(huì)話中描述,它包含多個(gè)(音頻或視頻)的子會(huì)話描述(ServerMediaSubsession)。

上節(jié)我們談到RTSP 服務(wù)器收到客戶端的連接請(qǐng)求,建立了RTSPClientSession 類,處理單獨(dú)的客戶會(huì)話。在建立RTSPClientSession 的過(guò)程中,將新建立的socket 句柄(clientSocket)和RTSP 請(qǐng)求處理函數(shù)句柄RTSPClientSession::incomingRequestHandler 傳給任務(wù)調(diào)度器,由任務(wù)調(diào)度器對(duì)兩者進(jìn)行一對(duì)一關(guān)聯(lián)。當(dāng)客戶端發(fā)出RTSP 請(qǐng)求后,服務(wù)器主循環(huán)中的select調(diào)用返回,根據(jù)socket 句柄找到對(duì)應(yīng)的incomingRequestHandler,開始消息處理。先進(jìn)行消息的解析,如果發(fā)現(xiàn)請(qǐng)求是DESCRIBE 則進(jìn)入handleCmd_DESCRIBE 函數(shù)。根據(jù)客戶端請(qǐng)求URL 的后綴(例如是1.mpg), 調(diào)用成員函數(shù)DynamicRTSPServer::lookupServerMediaSession查找對(duì)應(yīng)的流媒信息ServerMediaSession。如果ServerMediaSession 不存在,但是本地存在1.mpg 文件,則創(chuàng)建一個(gè)新的ServerMediaSession。在創(chuàng)建ServerMediaSession 過(guò)程中,

根據(jù)文件后綴.mpg,創(chuàng)建媒體MPEG-1or2的解復(fù)用器(MPEG1or2FileServerDemux)。再由MPEG1or2FileServerDemux 創(chuàng)建一個(gè)子會(huì)話描述MPEG1or2DemuxedServerMediaSubsession。最后由ServerMediaSession 完成組裝響應(yīng)消息中的SDP 信息(SDP 組裝過(guò)程見下面的描述),然后將響應(yīng)消息發(fā)給客戶端,完成一次消息交互。

SDP 消息組裝過(guò)程

ServerMediaSession 負(fù)責(zé)產(chǎn)生會(huì)話公共描述信息, 子會(huì)話描述由MPEG1or2DemuxedServerMediaSubsession 產(chǎn)生。MPEG1or2DemuxedServerMediaSubsession在其父類成員函數(shù)OnDemandServerMediaSubsession::sdpLines()中生成會(huì)話描述信息。在sdpLines() 實(shí)現(xiàn)里面, 創(chuàng)建一個(gè)虛構(gòu)(dummy) 的FramedSource( 具體實(shí)現(xiàn)類為MPEG1or2AudioStreamFramer 和MPEG1or2VideoStreamFramer)和RTPSink(具體實(shí)現(xiàn)類為MPEG1or2AudioRTPSink 和MPEG1or2VideoRTPSink ) , 最后調(diào)用setSDPLinesFromRTPSink(...)成員函數(shù)生成子會(huì)話描述。

以上涉及到的類以及繼承關(guān)系:

Medium <- ServerMediaSession

Medium <- ServerMediaSubsession <- OnDemandServerMediaSubsession <-MPEG1or2DemuxedServerMediaSubsession

Medium <- MediaSource <- FramedSouse <- FramedFileSource <- ByteStreamFileSource

Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream

Medium <- MPEG1or2FileServerDemux

Medium <- MPEG1or2Demux

Medium <- MediaSource <- FramedSouse <- MPEG1or2DemuxedElementaryStream

Medium <- MediaSource <- FramedSouse <- FramedFilter <- MPEGVideoStreamFramer <-MPEG1or2VideoStreamFramer

Medium <- MediaSink <- RTPSink <- MultiFramedRTPSink <- VideoRTPSink <-MPEG1or2VideoRTPSink

live555代碼解讀之三:SETUP 和PLAY 請(qǐng)求消息處理過(guò)程

前面已經(jīng)提到RTSPClientSession 類, 用于處理單獨(dú)的客戶會(huì)話。其類成員函數(shù)handleCmd_SETUP()處理客戶端的SETUP 請(qǐng)求。調(diào)用parseTransportHeader()對(duì)SETUP 請(qǐng)求的傳輸頭解析,調(diào)用子會(huì)話(這里具體實(shí)現(xiàn)類為OnDemandServerMediaSubsession)的getStreamParameters()函數(shù)獲取流媒體發(fā)送傳輸參數(shù)。將這些參數(shù)組裝成響應(yīng)消息,返回給客戶端。

獲取發(fā)送傳輸參數(shù)的過(guò)程:

調(diào)用子會(huì)話( 具體實(shí)現(xiàn)類MPEG1or2DemuxedServerMediaSubsession) 的createNewStreamSource(...) 創(chuàng)建MPEG1or2VideoStreamFramer,選擇發(fā)送傳輸參數(shù),并調(diào)用子會(huì)話的createNewRTPSink(...)創(chuàng)建MPEG1or2VideoRTPSink。同時(shí)將這些信息保存在StreamState 類對(duì)象中,用于記錄流的狀態(tài)。

客戶端發(fā)送兩個(gè)SETUP 請(qǐng)求,分別用于建立音頻和視頻的RTP 接收。

PLAY 請(qǐng)求消息處理過(guò)程:

RTSPClientSession 類成員函數(shù)handleCmd_PLAY()處理客戶端的播放請(qǐng)求。首先調(diào)用子會(huì)話的startStream(), 內(nèi)部調(diào)用MediaSink::startPlaying(...) , 然后是MultiFramedRTPSink::continuePlaying() , 接著調(diào)用MultiFramedRTPSink::buildAndSendPacket(...)。buildAndSendPacke 內(nèi)部先設(shè)置RTP 包頭,內(nèi)

部再調(diào)用MultiFramedRTPSink::packFrame()填充編碼幀數(shù)據(jù)。

packFrame 內(nèi)部通過(guò)FramedSource::getNextFrame(), 接著MPEGVideoStreamFramer::doGetNextFrame() , 再接著經(jīng)過(guò)MPEGVideoStreamFramer::continueReadProcessing() , FramedSource::afterGetting(...),MultiFramedRTPSink::afterGettingFrame(...),MultiFramedRTPSink::afterGettingFrame1(...) ?等一系列繁瑣調(diào)用,最后到了MultiFramedRTPSink::sendPacketIfNecessary(), 這里才真正發(fā)送RTP 數(shù)據(jù)包。然后是計(jì)算下一個(gè)數(shù)據(jù)包發(fā)送時(shí)間,把MultiFramedRTPSink::sendNext(...)函數(shù)句柄傳給任務(wù)調(diào)度器, 作為一個(gè)延時(shí)事件調(diào)度。在主循環(huán)中, 當(dāng)MultiFramedRTPSink::sendNext() 被調(diào)度時(shí), 又開始調(diào)用MultiFramedRTPSink::buildAndSendPacket(...)開始新的發(fā)送數(shù)據(jù)過(guò)程,這樣客戶端可以源源不斷的收到服務(wù)器傳來(lái)的RTP 包了。

發(fā)送RTP 數(shù)據(jù)包的間隔計(jì)算方法:

Update the time at which the next packet should be sent, based on the duration of the frame that?we just packed into it.

涉及到一些類有:

MPEGVideoStreamFramer: A filter that breaks up an MPEG video elementary stream into headers

and frames

MPEG1or2VideoStreamFramer: A filter that breaks up an MPEG 1 or 2 video elementary stream

into frames for: Video_Sequence_Header, GOP_Header, Picture_Header

MPEG1or2DemuxedElementaryStream: A MPEG 1 or 2 Elementary Stream, demultiplexed from

a Program Stream

MPEG1or2Demux: Demultiplexer for a MPEG 1 or 2 Program Stream

ByteStreamFileSource: A file source that is a plain byte stream (rather than frames)

MPEGProgramStreamParser: Class for parsing MPEG program stream

StreamParser: Abstract class for parsing a byte stream

StreamState: A class that represents the state of an ongoing stream

rtsp 簡(jiǎn)介(ZT)

Real Time Streaming Protocol 或者RTSP(實(shí)時(shí)流媒體協(xié)議),是由Real network 和Netscape共同提出的如何有效地在IP 網(wǎng)絡(luò)上傳輸流媒體數(shù)據(jù)的應(yīng)用層協(xié)議。RTSP 提供一種可擴(kuò)展的框架,使能夠提供能控制的,按需傳輸實(shí)時(shí)數(shù)據(jù),比如音頻和視頻文件。源數(shù)據(jù)可以包括現(xiàn)場(chǎng)數(shù)據(jù)的反饋和存貯的文件。rtsp 對(duì)流媒體提供了諸如暫停,快進(jìn)等控制,而它本身并不傳輸數(shù)據(jù),rtsp 作用相當(dāng)于流媒體服務(wù)器的遠(yuǎn)程控制。傳輸數(shù)據(jù)可以通過(guò)傳輸層的tcp,udp協(xié)議,rtsp 也提供了基于rtp 傳輸機(jī)制的一些有效的方法。

RTSP 消息格式:

RTSP 的消息有兩大類,一是請(qǐng)求消息(request),一是回應(yīng)消息(response),兩種消息的格式不同.

請(qǐng)求消息:

方法URI RTSP 版本CR LF

消息頭CR LF CR LF

消息體CR LF

其中方法包括OPTION 回應(yīng)中所有的命令,URI 是接受方的地址,例如:rtsp://192.168.20.136。

RTSP 版本一般都是RTSP/1.0.每行后面的CR LF 表示回車換行,需要接受端有相應(yīng)的解析,最后一個(gè)消息頭需要有兩個(gè)CR LF

回應(yīng)消息:

RTSP 版本狀態(tài)碼解釋CR LF

消息頭CR LF CR LF

消息體CR LF

其中RTSP 版本一般都是RTSP/1.0,狀態(tài)碼是一個(gè)數(shù)值,200表示成功,解釋是與狀態(tài)碼對(duì)應(yīng)的文本解釋。

簡(jiǎn)單的rtsp 交互過(guò)程:

C 表示rtsp 客戶端,S 表示rtsp 服務(wù)端

1.C->S:OPTION request //詢問(wèn)S 有哪些方法可用

1.S->C:OPTION response //S 回應(yīng)信息中包括提供的所有可用方法

2.C->S:DESCRIBE request //要求得到S 提供的媒體初始化描述信息

2.S->C:DESCRIBE response //S 回應(yīng)媒體初始化描述信息,主要是sdp

3.C->S:SETUP request //設(shè)置會(huì)話的屬性,以及傳輸模式,提醒S 建立會(huì)

3.S->C:SETUP response //S 建立會(huì)話,返回會(huì)話標(biāo)識(shí)符,以及會(huì)話相關(guān)信息

4.C->S:PLAY request //C 請(qǐng)求播放

4.S->C:PLAY response //S 回應(yīng)該請(qǐng)求的信息

S->C:發(fā)送流媒體數(shù)據(jù)

5.C->S:TEARDOWN request //C 請(qǐng)求關(guān)閉會(huì)話

5.S->C:TEARDOWN response //S 回應(yīng)該請(qǐng)求

上述的過(guò)程是標(biāo)準(zhǔn)的、友好的rtsp 流程,但實(shí)際的需求中并不一定按部就班來(lái)。其中第3和4步是必需的!第一步,只要服務(wù)器客戶端約定好,有哪些方法可用,則option 請(qǐng)求可以不要。第二步,如果我們有其他途徑得到媒體初始化描述信息(比如http 請(qǐng)求等等),則我們也不需要通過(guò)rtsp 中的describe 請(qǐng)求來(lái)完成。第五步,可以根據(jù)系統(tǒng)需求的設(shè)計(jì)來(lái)決定是否需要。

rtsp 中常用方法:

1.OPTION

目的是得到服務(wù)器提供的可用方法:

OPTIONS rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 1 //每個(gè)消息都有序號(hào)來(lái)標(biāo)記,第一個(gè)包通常是option 請(qǐng)求消息

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服務(wù)器的回應(yīng)信息包括提供的一些方法,例如:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 1 //每個(gè)回應(yīng)消息的cseq 數(shù)值和請(qǐng)求消息的cseq 相對(duì)應(yīng)

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE,GET_PARAMETER //服務(wù)器提供的可用的方法

2.DESCRIBE

C 向S 發(fā)起DESCRIBE 請(qǐng)求,為了得到會(huì)話描述信息(SDP):

DESCRIBE rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 2

token:

Accept: application/sdp

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服務(wù)器回應(yīng)一些對(duì)此會(huì)話的描述信息(sdp):

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 2

x-prev-url: rtsp://192.168.20.136:5000

x-next-url: rtsp://192.168.20.136:5000

x-Accept-Retransmit: our-retransmit

x-Accept-Dynamic-Rate: 1

Cache-Control: must-revalidate

Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT

Date: Fri, 10 Nov 2006 12:34:38 GMT

Expires: Fri, 10 Nov 2006 12:34:38 GMT

Content-Base: rtsp://192.168.20.136:5000/xxx666/

Content-Length: 344

Content-Type: application/sdp

v=0 //以下都是sdp 信息

o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136

s=/xxx666

u=http:///

e=admin@

c=IN IP4 0.0.0.0

t=0 0

a=isma-compliance:1,1.0,1

a=range:npt=0-

m=video 0 RTP/AVP 96 //m 表示媒體描述,下面是對(duì)會(huì)話中視頻通道的媒體描述

a=rtpmap:96 MP4V-ES/90000

a=fmtp:96

profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D

089028307

a=control:trackID=0//trackID=0表示視頻流用的是通道0

3.SETUP

客戶端提醒服務(wù)器建立會(huì)話,并確定傳輸模式:

SETUP rtsp://192.168.20.136:5000/xxx666/trackID=0 RTSP/1.0

CSeq: 3

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

//uri 中帶有trackID=0,表示對(duì)該通道進(jìn)行設(shè)置。Transport 參數(shù)設(shè)置了傳輸模式,包的結(jié)構(gòu)。接下來(lái)的數(shù)據(jù)包頭部第二個(gè)字節(jié)位置就是interleaved,它的值是每個(gè)通道都不同的,trackID=0的interleaved 值有兩個(gè)0或1,0表示rtp 包,1表示rtcp 包,接受端根據(jù)interleaved 的值來(lái)區(qū)別是哪種數(shù)據(jù)包。

服務(wù)器回應(yīng)信息:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 3

Session: 6310936469860791894 //服務(wù)器回應(yīng)的會(huì)話標(biāo)識(shí)符

Cache-Control: no-cache

Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567

4.PLAY

客戶端發(fā)送播放請(qǐng)求:

PLAY rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 4

Session: 6310936469860791894

Range: npt=0.000- //設(shè)置播放時(shí)間的范圍

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服務(wù)器回應(yīng)信息:

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 4

Session: 6310936469860791894

Range: npt=0.000000-

RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309

//seq 和rtptime 都是rtp 包中的信息

5.TEARDOWN

客戶端發(fā)起關(guān)閉請(qǐng)求:

TEARDOWN rtsp://192.168.20.136:5000/xxx666 RTSP/1.0

CSeq: 5

Session: 6310936469860791894

User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)

服務(wù)器回應(yīng):

RTSP/1.0 200 OK

Server: UServer 0.9.7_rc1

Cseq: 5

Session: 6310936469860791894

Connection: Close

以上方法都是交互過(guò)程中最為常用的,其它還有一些重要的方法如get/set_parameter,pause,redirect 等等

附錄

sdp 的格式

v=

o=

s=

i=

u=

e=

p=

c=

b=:

t=

r=

z=....

k=

k=:

a=

a=:

m=

v = (協(xié)議版本)

o = (所有者/創(chuàng)建者和會(huì)話標(biāo)識(shí)符)

s = (會(huì)話名稱)

i = * (會(huì)話信息)

u = * (URI 描述)

e = * (Email 地址)

p = * (電話號(hào)碼)

c = * (連接信息)

b = * (帶寬信息)

z = * (時(shí)間區(qū)域調(diào)整)

k = * (加密密鑰)

a = * (0 個(gè)或多個(gè)會(huì)話屬性行)

時(shí)間描述:

t = (會(huì)話活動(dòng)時(shí)間)

r = * (0或多次重復(fù)次數(shù))

媒體描述:

m = (媒體名稱和傳輸?shù)刂罚?/p>

i = * (媒體標(biāo)題)

c = * (連接信息— 如果包含在會(huì)話層則該字段可選)

b = * (帶寬信息)

k = * (加密密鑰)

a = * (0 個(gè)或多個(gè)媒體屬性行)

參考文章:rfc2326(rtsp);rfc2327(sdp)

RTSP 點(diǎn)播消息流程實(shí)例

(客戶端:VLC, RTSP 服務(wù)器:LIVE555 Media Server)

1)C(Client)-> M(Media Server)

OPTIONS rtsp://192.168.1.109/1.mpg RTSP/1.0

CSeq: 1

user-Agent: VLC media player(LIVE555 Streaming Media v2007.02.20)

1)M -> C

RTSP/1.0 200 OK

CSeq: 1

Date: wed, Feb 20 2008 07:13:24 GMT

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

2)C -> M

DESCRIBE rtsp://192.168.1.109/1.mpg RTSP/1.0

CSeq: 2

Accept: application/sdp

User-Agent: VLC media player(LIVE555 Streaming Media v2007.02.20)

2)M -> C

RTSP/1.0 200 OK

CSeq: 2

Date: wed, Feb 20 2008 07:13:25 GMT

Content-Base: rtsp://192.168.1.109/1.mpg/

Content-type: application/sdp

Content-length: 447

v=0

o =- 2284269756 1 IN IP4 192.168.1.109

s=MPEG-1 or 2 program Stream, streamed by the LIVE555 Media Server

i=1.mpg

t=0 0

a=tool:LIVE555 Streaming Media v2008.02.08

a=type:broadcast

a=control:*

a=range:npt=0-66.181

a=x-qt-text-nam:MPEG-1 or Program Stream, streamed by the LIVE555 Media Server

a=x-qt-text-inf:1.mpg

m=video 0 RTP/AVP 32

c=IN IP4 0.0.0.0

a=control:track1

m=audio 0 RTP/AVP 14

c=IN IP4 0.0.0.0

a=control:track2

3)C -> M

SETUP rtsp://192.168.1.109/1.mpg/track1 RTSP/1.0

CSeq: 3

Transport: RTP/AVP; unicast;client_port=1112-1113

User-Agent: VLC media player(LIVE555 Streaming Media v2007.02.20)

3)M -> C

RTSP/1.0 200 OK

CSeq: 3

Date: wed, Feb 20 2008 07:13:25 GMT

Transport:

RTP/AVP;unicast;destination=192.168.1.222;source=192.168.1.109;client_port=1112-1113;server

_port=6970-6971

Session: 3

4)C -> M

SETUP rtsp://192.168.1.109/1.mpg/track2 RTSP/1.0

CSeq: 4

Transport: RTP/AVP; unicast;client_port=1114-1115

Session: 3

User-Agent: VLC media player(LIVE555 Streaming Media v2007.02.20)

4)M -> C

RTSP/1.0 200 OK

CSeq: 4

Date: wed, Feb 20 2008 07:13:25 GMT

Transport:

RTP/AVP;unicast;destination=192.168.1.222;source=192.168.1.109;client_port=1114-1115;server

_port=6972-6973

Session: 3

5)C -> M

PLAY rtsp://192.168.1.109/1.mpg/ RTSP/1.0

CSeq: 5

Session: 3

Range: npt=0.000-

User-Agent: VLC media player(LIVE555 Streaming Media v2007.02.20)

5)M -> C

RTSP/1.0 200 OK

CSeq: 5

Range: npt=0.000-

Session: 3

RTP-Info:

url=rtsp://192.168.1.109/1.mpg/track1;seq=9200;rtptime=214793785,url=rtsp://192.168.1.109/1.

mpg/track2;seq=12770;rtptime=31721

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容