RTSP Spec中文版(附錄)

RTSP Spec中文版(1-11)
RTSP Spec中文版(12-16)
RTSP Spec中文版(附錄)

附錄A: RTSP協(xié)議狀態(tài)機(RTSP Protocol State Machines)

RTSP客戶端和服務(wù)器狀態(tài)機描述了從RTSP會話初始化到結(jié)束的所有行為。

狀態(tài)定義在每個對象的基礎(chǔ)上,每個對象通過流URL和RTSP會話標(biāo)識符進行唯一標(biāo)識。任何使用聚合URL的請求/回復(fù)會作用于構(gòu)成其呈現(xiàn)的所有流上。舉個例子,如果呈現(xiàn)/movie中包含兩個流,分別為/movie/audio和/movie/video,那么下列命令:

PLAY rtsp://foo.com/movie RTSP/1.0
CSeq: 559
Session: 12345678

會同時改變/movie/audio和/movie/video的狀態(tài)。

請求方法中OPTIONS,ANNOUNCE,DESCRIBE,GET_PARAMETER,SET_PARAMETER對客戶端或服務(wù)器狀態(tài)并不會有任何影響,因此并未再狀態(tài)表中列出。

A.1 客戶端狀態(tài)機(Client State Machine)

客戶端會有如下狀態(tài):

  • Init
    SETUP已發(fā)出,等待回復(fù)

  • Ready
    已接收SETUP回復(fù)或播放中收到PAUSE回復(fù)

  • Playing
    已接收PLAY回復(fù)

  • Recording
    已接收RECORD回復(fù)

通常,客戶端會在收到請求回復(fù)情況下改變狀態(tài)。注意有些請求會在將來的某一時間或位置生效(如PAUSE),那么狀態(tài)也會對應(yīng)再發(fā)生改變。如果對象不需要顯式SETUP(如多播組中可行的),狀態(tài)從Ready開始。該情況下,只有兩種有效狀態(tài),Ready和PLAYING。當(dāng)請求中Range結(jié)尾點抵達后,客戶端狀態(tài)同樣會從Playing/Recording切換至Ready。

“next state”欄表示收到成功回復(fù)(2xx)后將會切換至的目標(biāo)狀態(tài)。如果請求響應(yīng)的是3xx的狀態(tài)碼,那么狀態(tài)會切換至Init,而狀態(tài)碼4xx時不會做出任何改變。未列出的消息中,除了之前提到不會影響狀態(tài)的消息,其他均不應(yīng)該由該狀態(tài)客戶端發(fā)出。

*從服務(wù)器接收到REDIRECT等同于從服務(wù)器收到收到3xx重定向狀態(tài)。 *

state message sent next state after response
Init SETUP Ready
TEARDOWN Init
Ready PLAY Playing
RECORD Recording
TEARDOWN Init
SETUP Ready
Playing PAUSE Ready
TEARDOWN Init
PLAY Playing
SETUP Playing(changed transport)
Recording PAUSE Ready
TEARDOWN Init
RECORD Recording
SETUP Recording(changed transport)

A.2 服務(wù)器狀態(tài)機(Server State Machine)

服務(wù)器有如下狀態(tài):

  • Init
    初始化狀態(tài),未收到有效SETUP請求

  • Ready
    完成上一次SETUP接收,已回復(fù)或在playing后回復(fù);
    完成上一次PAUSE接收,已回復(fù)

  • Playing
    完成上一次PLAY接收,已回復(fù),數(shù)據(jù)已發(fā)送

  • Recording
    服務(wù)器正在錄制媒體數(shù)據(jù)

通常來講,服務(wù)器在接收請求后會改變狀態(tài)。如果服務(wù)器處于單播模式的Playing或Recording狀態(tài)時,如未收到健康信息(如定義好的從客戶端以多少間隔發(fā)送的RTSP報告或RTSP命令,該間隔默認為1分鐘),它可能回退到Init或退出RTSP會話。服務(wù)器可在會話回復(fù)頭中修改延時值。如果服務(wù)器處于Ready狀態(tài),它可能會在指定間隔或超過一分鐘內(nèi)未收到RTSP請求后回退到Init。注意有些命令將在將來的某一時間或位置才生效,此時服務(wù)器會在合適時間轉(zhuǎn)換狀態(tài)。當(dāng)請求中Range結(jié)尾點抵達后,服務(wù)器會從Playing或Recording狀態(tài)切換為Ready狀態(tài)。

發(fā)送REDIRECT消息后,將會立即生效,除非消息中帶有Range頭以指定生效時間。這種情況下,服務(wù)器狀態(tài)也會在合適時間進行切換。

如果對象沒有要求顯式SETUP,那么狀態(tài)從Ready開始,且只有兩種有效狀態(tài):Ready和Playing。

“next state”欄表示收到成功回復(fù)(2xx)后將會切換至的目標(biāo)狀態(tài)。如果請求結(jié)果狀態(tài)碼為3xx,狀態(tài)切換為Init。狀態(tài)碼為4xx的結(jié)果不會引起任何變化。

state message received next state
Init SETUP Ready
TEARDOWN Init
Ready PLAY Playing
SETUP Ready
TEARDOWN Init
RECORD Recording
Playing PLAY Playing
PAUSE Ready
TEARDOWN Init
SETUP Playing
Recording RECORD Recording
PAUSE Ready
TEARDOWN Init
SETUP Recording

附錄B:與RTP交互

RTSP允許媒體客戶端控制選擇的、非連續(xù)的媒體呈現(xiàn)塊,并將這些流交給RTP媒體層處理。RTP流的媒體層處理不應(yīng)受NPT跳躍的影響。也就是說,RTP序號和RTP時間戳都應(yīng)該是連續(xù)的、單調(diào)遞增的,即使跨越了非連續(xù)的NPT。

舉個例子,假設(shè)一個時鐘頻率為8000Hz,分組間隔為100ms,初始序號和時間戳均為0。首先我們播放NPT 10至15,然后跳至18至20。第一段RTP分組中序號從0到49,時間戳則從0到39,200。第二段序號從50開始到69,時間戳從40,000到55,200。

我們不能假定RTSP客戶端可以與RTP媒體代理溝通,因為兩者可能是獨立進程。如果RTP時間戳缺口和NPT一致,媒體代理會認定呈現(xiàn)中存在pause操作。如果NPT中的缺口足夠大,RTP時間戳可能roll over,媒體代理會判定滯后的分組為已經(jīng)播放過的副本。

對于具體數(shù)據(jù)類型,RTSP層和RTP層之間進行緊密聯(lián)系可能是必需的。沒有方法可以排除上下屬限制,組合了RTSP/RTP媒體的客戶端應(yīng)使用RTP-Info域來決定收到的RTP分組是在seek前還是滯后發(fā)出的。

對于連續(xù)音頻,服務(wù)器應(yīng)當(dāng)在新的PLAY請求中設(shè)置RTP標(biāo)志位,從而允許客戶端處理播放延時。

對于scaling(見12.34小節(jié)),RTP時間戳應(yīng)當(dāng)參照播放時間線。比如說,當(dāng)以兩倍速率播放一個30幀視頻時,服務(wù)器每秒需要每隔一幀進行丟棄以按正常時間戳傳送視頻幀,但NPT仍然需以每視頻幀1/15秒的幅度進行增加。

客戶端可通過重組后的第一個到達的分組RTP時間戳值來達成在NPT的正確播放,RTP-Info中的序列號提供了下一個分段中的第一個分組序列號。

附錄C: RTSP會話描述中SDP的使用

會話描述協(xié)議(SDP, Session Description Protocol)可能會在RTSP中用于描述流或呈現(xiàn)。使用場景僅限于為如下應(yīng)用指定獲取編碼的方法:

  • 聚合控制
    呈現(xiàn)中的流來自不同服務(wù)器時將不支持聚合操作,這樣的描述通常也是通過HTTP或其他非RTSP方法獲取。當(dāng)然,也可以通過ANNOUNCE方法獲得。

  • 非聚合操作
    由同一服務(wù)器中的多個流組成的呈現(xiàn)支持聚合操作,這樣的描述通常通過DESCRIBE URL請求獲取,或者通過ANNOUNCE方法進行獲取

該附錄描述了SDP文件如何接收,例如,通過HTTP。SDP文件決定了RTSP會話的操作,它還描述了客戶端如何解析DESCRIBE回復(fù)中的SDP內(nèi)容。SDP未提供無需人參與情況下,客戶端應(yīng)如何在多個同時呈現(xiàn)的媒體流間進行區(qū)分的機制或是其他備選方案(如兩個不同語言的音頻流)。

C.1 定義(Definitions)

本文中涉及的“session-level”, "media-level"及其他key/attribute名稱和值均定義于SDP(RFC 2327)中。

C.1.1 控制URL(ControlURL)

"a=control:"屬性用于轉(zhuǎn)換控制URL,該屬性同時用于會話和媒體描述。如用于單獨媒體,它表示控制特定媒體流的URL,如果在會話級別有該關(guān)鍵字,則表示URL用于聚合操作。

e.g. 
    a=control:rtsp://example.com/foo

該屬性中可能包含相對或絕對URL,緊跟RFC 1808中定義的規(guī)則和約定。實現(xiàn)時應(yīng)按如下順序查找基礎(chǔ)URL:

  • RTSP Content-Base 域
  • RTSP Content-Location 域
  • RTSP request URL

如概述性只包含"*",則URL被視為空的嵌入式URL,即繼承了整個base URL。

C.1.2 媒體流

“m=”域用于枚舉媒體流,理想情況下所有指定流哦都會被合適同步處理。如果會話是單播,那么服務(wù)器提供給客戶端的port值僅作為建議值,客戶端仍然需要在SETUP請求中包含它,并有可能忽略該建議。如果服務(wù)器沒有優(yōu)先值,則應(yīng)設(shè)置port值為0。

e.g.
    m=audio 0 RTP/AVP 31

C.1.3 負載類型

負載類型在"m="域中指定,當(dāng)負載類型是RFC 1890中的靜態(tài)負載類型時,無需其他信息。而如果是一個動態(tài)負載類型,"rtpmap"中的 "encoding name"必須為RFC 1890中指定的屬性之一,或是SDP中以“X-”作為前綴實驗性編碼方法。編碼器相關(guān)的特定參數(shù)將在此處指定,而是在后面要講到的"fmtp"屬性中討論。注冊新編碼方式時應(yīng)遵循RFC 1890中的流程。如果媒體類型不適于任何RTP AV profile,那么推薦創(chuàng)建新的合適的profile,其名稱需在"RTP/AVP"中"m="域內(nèi)標(biāo)明。

C.1.4 格式特定參數(shù)( Format-specific parameters)

格式特定的參數(shù)使用"fmtp"媒體屬性進行傳輸,"fmtp"屬性語法用于指定相關(guān)的編碼方法。注意分組間隔通過"ptime"屬性傳遞。

C.1.5 呈現(xiàn)范圍(Range of presentation)

"a=range"屬性定義了存儲會話的總時間范圍(活躍會話的長度可從"t"和"r"參數(shù)推導(dǎo)得出),除非呈現(xiàn)中包含了不同duration的媒體流,否則range屬性是一個會話級別的屬性。range單位需先指定,然后緊跟范圍值。

e.g.
    a=range:npt=0-34.4368
    a=range:clock=19971113T2115-19971113T2203

C.1.6 可用時間(Time of availability)

"t="域中必須包含合適的值,以為聚合或非聚合流操作提供起止時間。

在聚合操作中,服務(wù)器應(yīng)給出一個終止時間,該時間等于其可確保描述可用的時間;同時各處一個起始時間,該時間等于或小于接收到DESCRIBE請求的時間。如這兩個值為0,則表示會話將一直有效。

在費聚合操作中,起止時間應(yīng)能反映出會話可通過SDP語義,而不是依賴其他方式(如存有描述的網(wǎng)頁生命周期)維持可用的實際時間周期。

C.1.7 連接信息(Connection Information)

在SDP中,"c="域中包含了媒體流的目標(biāo)地址。對于點播(單播)流和一些多播流而言,目標(biāo)地址是通過客戶端的SETUP請求確定的。除非媒體內(nèi)容有一個固定的目標(biāo)地址,此時"c="域?qū)⒈辉O(shè)置為合適的控制。如對于“IP4”類型該空值為"0.0.0.0"。

C.1.8 實體標(biāo)簽(Entity Tag)

可選的"a=etag"屬性標(biāo)識了會話描述的版本,它對于客戶端是不透明的。SETUP請求中可能在"If-Match"域中包含該標(biāo)識符,以只在版本匹配當(dāng)前描述時建立會話。該屬性值是不透明的,其中可能包含SDP屬性值所允許的任何字符。

e.g.
    a=etag:158bb3e7c7fd62ce67f12b533f06b83a

One could argue that the "o=" field provides identical
functionality. However, it does so in a manner that would put
constraints on servers that need to support multiple session
description types other than SDP for the same piece of media
content.

C.2 不支持聚合操作

如果一個呈現(xiàn)不支持聚合操作且已制定多個媒體段,每段必須通過"a=control:"屬性制定其控制URL。

e.g.
    v=0
    o=- 2890844256 2890842807 IN IP4 204.34.34.32
    s=I came from a web page
    t=0 0
    c=IN IP4 0.0.0.0
    m=video 8002 RTP/AVP 31
    a=control:rtsp://audio.com/movie.aud
    m=audio 8004 RTP/AVP 3
    a=control:rtsp://video.com/movie.vid

注意控制URL中的位置表示客戶端向服務(wù)器audio.com和video.com分別建立獨立的RTSP控制會話。

即使SDP文件通過非RTSP方式傳給客戶端時,也推薦其中包含所有媒體初始化信息。這在無法通知客戶端需通過DESCRIBE進一步獲取詳細媒體流信息時非常有用。

C.3 支持聚合操作

在這種情況下,服務(wù)器上有可被作為整體控制的多個流。此時既有針對流URL的"a=control:"屬性,也有支持聚合操作的向會話層的"a=control:"屬性。如果媒體層(media-level)URL是相對URL,則應(yīng)參照C.1.1小節(jié)轉(zhuǎn)換為絕對URL。

如呈現(xiàn)僅有一個流組成,媒體層的"a=control:"屬性會被同時省略,而當(dāng)包含多個流時,每個媒體流段必須包含各自的"a=control"屬性。

e.g.
    v=0
    o=- 2890844256 2890842807 IN IP4 204.34.34.32
    s=I contain
    i=<more info>
    t=0 0
    c=IN IP4 0.0.0.0
    a=control:rtsp://example.com/movie/
    m=video 8002 RTP/AVP 31
    a=control:trackID=1
    m=audio 8004 RTP/AVP 3
    a=control:trackID=2

上面例子中,客戶端向服務(wù)器請求建立一個簡單RTSP會話,并使用URL "rtsp://example.com/movie/trackID=1"和"rtsp://example.com/movie/trackID=2"來設(shè)置音視頻流,而URL "rtsp://example.com/movie/"則控制整個影片。

附錄D: 極簡RTSP實現(xiàn)

D.1 客戶端

客戶端實現(xiàn)必須支持如下功能:

  • 生成如下請求:SETUP,TEARDOWN,PLAY/RECORD之一。如果實現(xiàn)了RECORD,則也必須實現(xiàn)ANNOUNCE
  • 在請求中包含如下頭:CSeq,Connection,Session,Transport。如果實現(xiàn)了ANNOUNCE,也必須支持Content-Language,Content-Encoding,Content-Length以及Content-Type也必須實現(xiàn)
  • 解析并支持回復(fù)中的如下頭:CSeq,Connection,Session,Transport,Content-Language,Content-Encoding,Content-Length,Content-Type。如果實現(xiàn)了錄制,則Location也必須支持。RTP兼容的實現(xiàn)還必須實現(xiàn)RTP-Info
  • 理解錯誤狀態(tài)碼類別并在狀態(tài)碼為4xx或5xx時通知用戶。消息通知可配置,以避免用戶不希望在出現(xiàn)哪些狀態(tài)碼時收到通知
  • 回復(fù)來自服務(wù)器的異步請求,如ANNOUNCE。并不是說客戶端就必須實現(xiàn)ANNOUNCE方法,而是說在收到服務(wù)器請求后,必須給出否定或肯定回復(fù)

盡管并非必須,如下內(nèi)容也強烈建議實現(xiàn)以完整良好交互:

  • 支持通過RTP/AVP/UDP傳輸
  • 包含User-Agent頭
  • 理解附錄C中的SDP會話描述
  • 接收從標(biāo)準(zhǔn)輸入、命令行或其他可行方式接收媒體初始化格式(如SDP)

D.1.1 Basic Playback

為了支持媒體流點播功能,客戶端應(yīng)添加如下支持:

  • 生成PAUSE請求
  • 實現(xiàn)REDIRECT方法,以及Location頭

D.1.2 Authentication-enabled

為了實現(xiàn)在訪問RTSP服務(wù)器上媒體呈現(xiàn)時需要認證,客戶端必須添加如下支持:

  • 識別401狀態(tài)碼
  • 解析和包含 WWW-Authenticate頭
  • 實現(xiàn)Basic認證和Digest認證

D.2 服務(wù)器

一個最精簡的服務(wù)器至少應(yīng)當(dāng)實現(xiàn)如下內(nèi)容:

  • 實現(xiàn)如下方法:SETUP,TEARDOWN,OPTIONS,PLAY或RECORD之一。如果實現(xiàn)了RECORD,ANNOUNCE也必須被實現(xiàn)
  • 回復(fù)中包含如下頭:Connection,Content-Length,Content-Type,Content-Language,Content-Encoding,Transport,Public。如實現(xiàn)了RECORD,則必須實現(xiàn)Location頭。RTP兼容版本同時還需要實現(xiàn)RTP-Info域
  • 解析并恰當(dāng)?shù)鼗貜?fù)請求中的如下頭:Connection,Session,Transport,Require

盡管并非必須,如下內(nèi)容也強烈建議實現(xiàn)以完整良好交互:

  • 支持RTP/AVP/UDP傳輸
  • 包含Server頭
  • 實現(xiàn)DESCRIBE方法
  • 生成附錄C中定義的SDP會話描述

D.2.1 Basic Playback

為了支持媒體流點播,服務(wù)器必須額外支持如下內(nèi)容:

  • 識別Range頭,并在seeking操作不支持時返回錯誤
  • 實現(xiàn)PAUSE方法

此外,為了實現(xiàn)通用用戶接口特性,強烈建議在點播媒體服務(wù)器上實現(xiàn)如下內(nèi)容:

  • 包含并解析NPT單位的Range參數(shù),如有可能,支持SMPTE單位Range更佳
  • 在媒體初始化信息中包含媒體呈現(xiàn)Length
  • 支持從數(shù)據(jù)指定的時間戳映射為NPT。使用RTP時,RTP-Info域中的rtptime可能用于將RTP時間戳映射為NPT

客戶端可能使用Length確定分段是否支持seek,并對不支持Length信息的分段在視覺效果上禁用seek特性。通常呈現(xiàn)長度會用于實現(xiàn)滑動條,一方面提供當(dāng)前進度,另一方面提供時間位置信息。

從RTP時間戳映射至NPT在確?;瑒訔l位置正確時是必需的。

D.2.2 Authentication-enabled

為了正確處理客戶端認證,服務(wù)器必須額外添加如下實現(xiàn):

  • 當(dāng)資源必須認證時生成401狀態(tài)碼
  • 解析并包含WWW-Authenticate頭
  • 實現(xiàn)Basic認證和Digest認證
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • RFC 2326RTSP Spec中文版(1-11)RTSP Spec中文版(12-16)RTSP Spec中文版...
    SniperPan閱讀 5,940評論 3 10
  • RTSP SDP RTP/RTCP 介紹應(yīng)用層 RTSP、SDP; 傳輸層 RTP、TCP、UDP; 網(wǎng)絡(luò)層 IP...
    Atom_Woo閱讀 4,128評論 0 7
  • RTSP Spec中文版(1-11)RTSP Spec中文版(12-16)RTSP Spec中文版(附錄) 12 ...
    SniperPan閱讀 1,509評論 0 3
  • 第一部分:RTSP協(xié)議 一、RTSP協(xié)議概述 RTSP(Real-TimeStream Protocol )是一種...
    小魚兒喜歡花無缺閱讀 2,767評論 1 6
  • 不同時空的兩個人應(yīng)該該如何相遇,該如何將所有的幸運用來換取視線的相聚。這大概是很難的。 可幸運的是,真愛是平等的,...
    子寒v閱讀 540評論 0 0

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