Rtmp協(xié)議中文介紹_第1頁
Rtmp協(xié)議中文介紹_第2頁
Rtmp協(xié)議中文介紹_第3頁
Rtmp協(xié)議中文介紹_第4頁
Rtmp協(xié)議中文介紹_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、RTMP(real time messaging protocol)協(xié)議1, 介紹這篇文檔詳細(xì)說明了RTMP消息塊流,它為高層多媒體流協(xié)議提供多路技術(shù)和包服務(wù)RTMP消息塊流是為RTMP協(xié)議設(shè)計(jì)的,他可以處理任何傳送消息流的協(xié)議,每一個(gè)消息包含時(shí)間戳和有效負(fù)載類型標(biāo)示,RTMP消息塊流和RTMP一起適用于多樣性音,視頻應(yīng)用程序,從一對(duì)一和一對(duì)多向視頻點(diǎn)播服務(wù)器直接廣播到交互式會(huì)議應(yīng)用程序。當(dāng)用到實(shí)時(shí)傳輸協(xié)議就像TCP,RTMP消息塊流提供可靠地規(guī)則時(shí)間戳的端到端全信息傳送。穿過多層流,RTMP消息塊流不提供任何控制的優(yōu)先級(jí)別和相似形式,但是可以用于高層協(xié)議提供這樣的優(yōu)先級(jí),例如:一段實(shí)時(shí)視頻服

2、務(wù)會(huì)選擇丟棄給于緩慢的客戶的視頻信息確保音頻信息可以及時(shí)被接收。RTMP消息塊流包含它自己的入隊(duì)協(xié)議控制消息,也提供一個(gè)高層協(xié)議機(jī)制用于嵌入用戶的控制消息。2.定義有效負(fù)載:包含在包中的數(shù)據(jù),就像音頻樣本或者壓縮的視頻數(shù)據(jù)。包:一個(gè)數(shù)據(jù)包由固定的包頭和有效負(fù)載數(shù)據(jù)組成,一些底層協(xié)議或許需要包的封裝來被定義。端口:在TCP/IP協(xié)議中定義的用正整數(shù)表示的端口號(hào)用于在傳輸中提取以區(qū)分目標(biāo)主機(jī)的不同應(yīng)用,用于OSI傳輸層的傳輸選擇(TSEL)就是端口。傳輸?shù)刂罚壕W(wǎng)絡(luò)地址和端口的組合識(shí)別一個(gè)傳輸層終端端口,例如一個(gè)IP地址和TCP端口,數(shù)據(jù)包從一個(gè)源傳輸層地址傳送到目標(biāo)段的傳輸層地址。消息流:一個(gè)通信

3、的邏輯通道,允許消息流通。消息流ID:每一個(gè)消息擁有一個(gè)分配的ID識(shí)別跟隨的消息流。消息塊:消息的片段,消息被分成小的部分,他們在網(wǎng)絡(luò)中發(fā)送之前交叉存儲(chǔ)。消息塊確保定制時(shí)間戳的端到端全消息傳送,穿過多層流。消息塊流:一個(gè)通信的邏輯通道,允許消息塊在一個(gè)特定的方向上流通,消息塊流可以從客戶端傳送到服務(wù)器,也可以相反。消息塊流ID:每一個(gè)消息塊有一個(gè)分配的ID用于識(shí)別更隨的消息塊流。復(fù)合技術(shù):把分開的音視頻數(shù)據(jù)組合成一條音視頻流的過程,使同時(shí)傳送許多音視頻數(shù)據(jù)成為可能。逆復(fù)合技術(shù):復(fù)合的反向過程,交叉存取組裝的音頻視頻數(shù)據(jù),使他們成為最初的音視頻數(shù)據(jù)3 字節(jié)順序,列隊(duì)和時(shí)間格式所有的整數(shù)字段有被網(wǎng)

4、絡(luò)字節(jié)負(fù)載著,字節(jié)0是第一個(gè)顯示出來的,也是一段文字和字段中最重要的。這種字節(jié)順序一般被認(rèn)為“大字節(jié)“,數(shù)字常量在這種文檔里是用十進(jìn)制表示。所有RTMP消息塊流是以用字節(jié)列隊(duì),例如:一個(gè)16字節(jié)的字段也許會(huì)在字?jǐn)?shù)字節(jié)的偏移段。那里要填充被標(biāo)示,填充字節(jié)應(yīng)該有0值(似乎看不懂). 在RTMP消息塊流中的時(shí)間戳用整數(shù)表示,單位為毫秒。每一個(gè)消息塊流以時(shí)間戳0開始,但是這不是必須的,只要兩個(gè)終端在時(shí)間點(diǎn)上達(dá)成一致,注意那就意味著任何穿過多消息塊流異步傳輸(特別是分散的主機(jī))在RTMP消息塊流之外需要一些而外的機(jī)制。時(shí)間戳必須始終在線性的增加,允許應(yīng)用程序處理異步傳輸,帶寬度量,檢測,和流控制。因?yàn)闀r(shí)

5、間戳一般是只有32字節(jié)的長度,他們周期小于50天,因?yàn)榱魇窃试S不停地流動(dòng)的,最終可以運(yùn)行幾年,一個(gè)RTMP消息塊流應(yīng)用必須用到模運(yùn)算用于相減和比較,任何合理的方式都可以被接受,只要兩端都達(dá)成一致,一個(gè)應(yīng)用可以假設(shè),例如,所有相近的時(shí)間戳在2的31次方以內(nèi),所以10000在4000000000后面,3000000000在4000000000前面。時(shí)間戳delta作為一個(gè)表示毫秒的無符號(hào)整數(shù)也會(huì)被詳細(xì)介紹,和先前的時(shí)間戳相比,時(shí)間戳delta可以是24字節(jié)或者是32字節(jié)的長度。4 消息格式一個(gè)消息的格式可以分裂成消息塊以支持復(fù)用,依靠高層協(xié)議,消息格式應(yīng)該包含創(chuàng)造消息塊的必須字段。時(shí)間戳:消息的時(shí)

6、間戳,這個(gè)字段可以傳輸4個(gè)字節(jié)。長度:消息的有效負(fù)載的長度,如果消息頭不能被省略,他應(yīng)該包含在長度中,這個(gè)字段在消息塊包頭中占有3個(gè)字節(jié)。類型ID:協(xié)議控制消息的類型字段的范圍是被保留的,這些傳播信息的消息被RTMP消息塊和高層協(xié)議處理,所有其他的類型ID可被高層協(xié)議使用,被RTMP消息塊當(dāng)做不透明的值,事實(shí)上,在RTMP消息塊中需要這些值當(dāng)做類型的是沒有的,所有的消息可以成為通一種類型,或者應(yīng)用程序用這個(gè)字段區(qū)分同步跡象而不是類型,這個(gè)字段占用1個(gè)字節(jié)。消息流ID:消息流ID可以是任意值,不同的消息復(fù)合依靠的同樣的消息塊流是基于他們的消息流ID被逆復(fù)合而成的,在此之上,直到RTMP消息塊被關(guān)

7、注,這是一個(gè)不透明的值,這個(gè)字段在包頭中占用4個(gè)字節(jié)。5 握手一個(gè)RTMP通信以握手開始,握手不像其他的協(xié)議,他包含三個(gè)固定長度的消息塊。客戶(初始化通信的終端)和服務(wù)器每次發(fā)送同樣的三個(gè)消息塊,說明一下,被客戶段發(fā)送的消息塊被指定為C0,C1,C2,被服務(wù)器端發(fā)送的消息被指定為S0,S1,S2。5.1握手的順序握手以客戶端發(fā)送C0和C1消息塊位開始,客戶端必須等到S1到達(dá)再發(fā)送C2。客戶端必須等到S2接收到才可以發(fā)送其他的數(shù)據(jù);服務(wù)端必須等到C0到達(dá)才發(fā)送S0和S1,在C1之后也會(huì)等待。服務(wù)端必須等到C1到達(dá)才發(fā)送S2,服務(wù)端必須等到C2到達(dá)后才發(fā)送其他數(shù)據(jù)。5.2C0和S0格式C0也S0包

8、長8個(gè)字節(jié) 版本:8比特在C0中,這個(gè)字段識(shí)別客戶端需求的RTMP的版本,在S0中,這個(gè)字段識(shí)別服務(wù)器端選擇的RTMP的版本,被定義的是版本3,0到2是被早前的版本使用的,4到31保留被用作未來的用途,32到255還沒有被允許。不能區(qū)分客戶的請(qǐng)求的版本的服務(wù)應(yīng)該以3返回,客戶端或許會(huì)選擇3一下的版本,或者放棄握手。5.3C1和S1的格式:C1和S1的數(shù)據(jù)包有1536個(gè)字節(jié)長,由以下幾個(gè)字段組成。時(shí)間:4個(gè)字節(jié)這個(gè)字段包含時(shí)間戳,被當(dāng)做以后消息塊從終端發(fā)送的時(shí)間點(diǎn),也許是0,或者一些任意的值,用來同步多重的消息塊流,終端或許希望發(fā)送其他消息塊流的時(shí)間戳的當(dāng)前值。0:4各個(gè)字節(jié)這個(gè)字段必須全0。隨

9、即數(shù)據(jù):1528個(gè)字節(jié)這個(gè)字段可以包含任何任意的值,因?yàn)槊總€(gè)終端必須區(qū)分自己初始化的握手的返回?cái)?shù)據(jù)和對(duì)方初始化的握手的返回?cái)?shù)據(jù),這個(gè)數(shù)據(jù)應(yīng)該發(fā)送一些隨機(jī)數(shù)。但是沒有必要密碼保護(hù)隨機(jī)數(shù)和動(dòng)態(tài)值。5.4C2和S2的格式C2和S2數(shù)據(jù)吧有1536字節(jié)長度,近似S1和C1的回聲,由一下幾個(gè)字段組成。時(shí)間:4個(gè)字節(jié)這個(gè)字段必須包含由每方發(fā)送的S1(對(duì)應(yīng)C2)或者C1(對(duì)應(yīng)S2)的時(shí)間戳.時(shí)間2:4個(gè)字節(jié)這個(gè)字段必須包含先前的由每一方發(fā)送數(shù)據(jù)包(S1或者C1)被讀到的時(shí)間戳。隨機(jī)返回:1528個(gè)字節(jié)這個(gè)字段必須包含在每方發(fā)送的S1(對(duì)應(yīng)C2)或者S2(對(duì)應(yīng)C1)的隨機(jī)數(shù)據(jù)字段。每一方可以利用時(shí)間和時(shí)間2字

10、段和當(dāng)前時(shí)間戳組成作為連接的帶寬或者延遲的評(píng)估。但是似乎沒有用。5.5握手過程下面的表格表述了提到了在握手階段的狀態(tài)階段描述未初始化協(xié)議版本在這個(gè)階段中被發(fā)送,客戶端個(gè)服務(wù)端沒有初始化,客戶端在C0中發(fā)送協(xié)議版本,如果服務(wù)端支持版本,就在回應(yīng)中發(fā)送S0和S1,如果不能,服務(wù)端通過適當(dāng)?shù)男袨檫M(jìn)行恢復(fù),在RTMP中,這個(gè)行為是連接結(jié)束版本發(fā)送在未初始化階段以后客戶端個(gè)服務(wù)端在版本發(fā)送階段,客戶端等待S1包,服務(wù)端等待C1包,當(dāng)接收到想要的包,客戶端發(fā)送C2,服務(wù)端發(fā)送S2,此時(shí)階段變成了ACK的發(fā)送。ACK發(fā)送客戶端和服務(wù)端分別等待S2和C2握手完成客戶端和服務(wù)交換消息。6.消息分塊在握手以后,連

11、接復(fù)合一個(gè)或者多個(gè)消息塊,每個(gè)消息塊流負(fù)載一個(gè)消息流中的類型,每一個(gè)消息塊的創(chuàng)造有一個(gè)唯一分配的ID,被稱為消息塊流ID,消息塊流在網(wǎng)絡(luò)上傳輸。傳輸?shù)臅r(shí)候每一個(gè)消息塊在下一個(gè)消息塊之前必須完全被發(fā)送,當(dāng)接收結(jié)束,消息塊基于消息塊流ID被組裝成消息。消息分塊允許高層協(xié)議的大的消息被分割成小的消息,例如,阻止大的低優(yōu)先級(jí)消息模塊化位高優(yōu)先級(jí)的消息。消息分塊也允許小的消息被傳送時(shí)帶有小的包頭,消息塊的包頭包含了信息的壓縮表示,另外這下信息必須在消息自身中包含。6.1消息塊格式:每一個(gè)消息塊有包頭和數(shù)據(jù)組成,包頭自身可以被分割成三個(gè)部分,消息塊的基本頭:1到3個(gè)字節(jié)這個(gè)字段編碼了消息塊流的ID和消息塊

12、的類型,消息塊類型決定了消息包頭的編碼格式,長度完全取決于可變長的消息塊流ID。消息塊消息頭:0,3,7,或者11個(gè)字節(jié)這個(gè)字段編碼正在傳送的消息的信息,長度可以利用在消息塊頭中詳細(xì)的消息塊類型來決定。擴(kuò)展時(shí)間戳:0或者4個(gè)字節(jié)這個(gè)字段必須在普通時(shí)間戳被設(shè)置為0xf f f f f f時(shí)發(fā)送,在普通時(shí)間戳被設(shè)置成任何其他時(shí)不能不能傳送。所以對(duì)于值比0xf f f f f f小的,普通時(shí)間戳字段應(yīng)該用在擴(kuò)展時(shí)間戳沒有被呈現(xiàn)的案例中。對(duì)于值大于或者等于0xf f f f f f普通時(shí)間戳不能被利用,不ixuba值設(shè)置成0xf f f f f f,擴(kuò)展時(shí)間戳要被發(fā)送。6.1.1消息塊基本頭:消息塊基

13、本時(shí)間頭對(duì)消息塊流的ID和消息塊的類型進(jìn)行編碼,(在下面的圖表中用fmt表示),消息塊類型決定了編碼的消息頭的格式,消息塊基本頭字段可以是,或者個(gè)字節(jié)長,決定于消息塊流。協(xié)議支持超過個(gè)流,范圍3-65599,ID 0,1和2是被保留的,值0代表了在64到319的ID,值1代表了在64到65599的ID,值2代表了底層協(xié)議消息。對(duì)于流ID沒有額外增加的字節(jié)表示,值3到63表示完成的流ID,沒有額外的字節(jié)用來表示。在消息塊基本頭中0-5比特(最不重要的)代表了消息塊流ID消息塊流ID 2-63可以被編碼成這個(gè)字段的一個(gè)字節(jié)的版本號(hào)。消息塊流ID 64到319在這個(gè)字段中可以被編碼成2個(gè)字節(jié)的版本號(hào)

14、(第2個(gè)字節(jié)加64)。 消息塊流ID 64到65599在這個(gè)字段中可以被編碼成3個(gè)字節(jié)的版本號(hào)(第三個(gè)字節(jié)*256+第二個(gè)字節(jié)+64)。Cs id:6比特這個(gè)字段包含了消息塊流ID,值從2到63,值0和1用于代表這個(gè)字段的2個(gè)或者3個(gè)字節(jié)的版本號(hào)。Fmt:2比特這個(gè)字段標(biāo)示了一個(gè)或者4個(gè)被消息塊消息頭使用的格式。Cs id -64:8或者6個(gè)比特這個(gè)字段包含了消息塊流ID減64,例如ID365在CS id段用1表示,在cs id -64段用301表示。值為64到319的消息塊流ID可以被2字節(jié)或者3字節(jié)的版本號(hào)來表示。6.1.2消息塊消息頭在消息塊消息頭中有四種不同的個(gè)格式,由消息塊基本頭的f

15、mt字段選擇。一次執(zhí)行應(yīng)該使用最簡潔的表達(dá)方式表示每一個(gè)消息塊消息頭。類型0:類型0的消息塊有11個(gè)字節(jié)長們這個(gè)類型必須在消息塊流開始時(shí)使用,只要消息流的時(shí)間戳回溯。時(shí)間戳(timestamp):3個(gè)字節(jié)對(duì)于類型0的消息塊,消息的完全的時(shí)間戳放在這里,如果時(shí)間戳比16777215大或者相等(16精制0x00ffffff),這個(gè)值必須是16777215,擴(kuò)展的時(shí)間戳頭被發(fā)送,另外,這個(gè)值必須是完整的時(shí)間戳。類型1類型1的消息塊有7個(gè)字節(jié)長,消息流ID沒有被包含,這個(gè)消息塊得到和先前消息塊同樣的流ID,帶有可變長的消息的流(例如許多視頻格式)在類型0消息塊后應(yīng)該使用這種

16、格式作為每一個(gè)消息的第一個(gè)消息塊。類型2類型2消息塊有3個(gè)字節(jié)長,流ID和消息長度都沒有被包含,這個(gè)消息塊和之前的消息塊有相同流ID和消息長度,帶有不變長的消息的流(例如一些音頻格式)在類型0消息塊后應(yīng)該利用這種格式作為每一個(gè)消息的第一個(gè)消息塊類型3類型3 的消息塊沒有頭,流ID,消息長度時(shí)間戳delta,這個(gè)類型的消息塊在之前的消息塊中取值,當(dāng)單一的消息被分裂成消息塊,所有的消息塊除了第一個(gè),應(yīng)該使用這種類型,流由同樣大小的消息組成。 時(shí)間戳delta(timestamp delta):3個(gè)字節(jié)對(duì)于類型1和類型2的消息塊,先前的消息塊的時(shí)間戳和當(dāng)前的消息塊的時(shí)間戳

17、的不同點(diǎn)可以在這里看到,如果delta的值比16777215大或者相同,這個(gè)值必須是16777215,擴(kuò)展的時(shí)間戳被呈現(xiàn),另外,這和值必須是完整的delta。消息長度(message length):3個(gè)字節(jié)對(duì)于類型0和類型1的消息塊,消息的長度會(huì)出現(xiàn)在這里。注意這一般和消息塊有效負(fù)載長度是不一樣的。消息塊的有效負(fù)載長度是出了最后一個(gè)消息塊的所有消息塊的最大的長度。消息類型 id(message type id):一個(gè)字節(jié)對(duì)于類型0和類型1的消息塊,消息的類型被表示在這里。消息流ID(message stream id):4個(gè)字節(jié)對(duì)于類型0的消息塊,消息流ID會(huì)被儲(chǔ)存,消息流ID在很小的比特中

18、被存儲(chǔ),代表性的,所有的相同消息塊流的消息來自同一個(gè)消息流。然而使把分散的消息流復(fù)合成同一個(gè)消息塊流成為可能,就不用所有的頭壓縮。然而,如果一個(gè)消息流被關(guān),另一個(gè)更隨的是開著的,就沒有理由通過發(fā)送一個(gè)新的類型0的消息塊讓一個(gè)存在的消息塊流不能再生。6.1.3擴(kuò)展時(shí)間戳(extend timestamp):當(dāng)消息頭中的普通的時(shí)間戳是0x00ffffff這個(gè)字段就會(huì)被傳送,如果普通時(shí)間戳的值小于0x00ffffff,這個(gè)字段就不會(huì)被呈現(xiàn),如果時(shí)間戳字段沒有被呈現(xiàn)這個(gè)字段不能被呈現(xiàn),類型3的消息塊沒有這個(gè)字段。如果這個(gè)字段被傳送會(huì)在消息塊頭之后,消息塊數(shù)據(jù)之前被立刻定位。 Chunk format6

19、.2.1例1:例一給出一個(gè)簡單的音頻消息流,這個(gè)例子示范了信息的冗余。下一個(gè)表格展示了消息塊在流中被創(chuàng)造,從消息3向前,數(shù)據(jù)的傳輸是最優(yōu)化的,每個(gè)消息只有1個(gè)字節(jié)6.2.2例二:例二舉例說明一個(gè)很長的消息被分割成很多消息塊這里是分割出來的消息塊消息塊1的包頭數(shù)據(jù)詳細(xì)介紹了307個(gè)字節(jié)的消息的全部。注意這兩個(gè)例子,類型3消息塊可以有用作兩個(gè)不同的方式,第一種是指定一則消息的延續(xù),第二種是指定新消息的開始,這個(gè)新消息可以從已經(jīng)存在的數(shù)據(jù)中衍生出來。7協(xié)議控制消息Rtmp消息塊流支持一些協(xié)議控制消息,這些消息包含RTMP消息塊流協(xié)議需求的信息,不會(huì)用于高層的傳播,現(xiàn)有兩種協(xié)議消息使用在RTMP消息塊

20、流中,一個(gè)協(xié)議消息用來設(shè)置消息塊大小,另外一種用于終端消息,由于沒殘余的消息塊沒有被利用。協(xié)議控制消息應(yīng)該有消息流ID 0(被稱為控制流)和消息塊流ID 2,帶有最高的優(yōu)先級(jí)被發(fā)送。每一個(gè)協(xié)議控制消息類型有一個(gè)固定大小的負(fù)載,通常在一個(gè)單一的消息塊中被發(fā)送。7.1設(shè)置消息塊大小:協(xié)議控制消息1,設(shè)置消息塊大小,用來通知對(duì)方新的最大的消息塊大小。消息塊的大小可以被設(shè)置成一個(gè)默認(rèn)的值,但是客戶端或者服務(wù)端可以改變這個(gè)值,可以給對(duì)方更新。例如:假設(shè)一個(gè)客戶端想要發(fā)送131字節(jié)的音頻數(shù)據(jù),消息塊的大小為128字節(jié),在這種情況下,客戶端可以發(fā)送這個(gè)協(xié)議控制消息給服務(wù)端以通知消息塊的大小被設(shè)置成131字節(jié)

21、,那么客戶端就可以用一個(gè)消息塊發(fā)送音頻數(shù)據(jù)。最大的消息塊大小可以是65536個(gè)字節(jié),消息塊的大小在每一個(gè)方向上是維持不變的。7.2中斷消息:這個(gè)協(xié)議控制消息用來通知對(duì)方如果他等待消息塊完成一個(gè)消息,然后丟棄部分收到的消息。對(duì)方受到消息塊流ID作為這個(gè)協(xié)議消息的有效負(fù)載。一個(gè)應(yīng)用程序?yàn)榱吮硎疚磥淼南⑻幚磉^程是不需要的時(shí)候或許會(huì)送這個(gè)消息。RTMP消息格式1.介紹:這段文字詳細(xì)介紹了RTMP,詳細(xì)介紹了在網(wǎng)絡(luò)上使用底層傳輸協(xié)議的實(shí)體調(diào)動(dòng)的消息的格式。RTMP是設(shè)計(jì)和RTMP消息塊流協(xié)議一起工作的,它可以利用任何其他的傳輸協(xié)議發(fā)送消息,RTMP消息塊協(xié)議和RTMP一起適用于多樣性的音視頻應(yīng)用程序,

22、從一對(duì)一,一對(duì)多的向視頻點(diǎn)播服務(wù)器的直接廣播到交互式的回憶應(yīng)用程序。2.定義:消息流:一個(gè)通信的邏輯通道,允許消息流通。消息流ID:每一個(gè)消息擁有一個(gè)分配的ID識(shí)別跟隨的消息流。有效負(fù)載:包含在數(shù)據(jù)包中的數(shù)據(jù),例如音頻樣本或者壓縮的視頻數(shù)據(jù)。數(shù)據(jù)包:一個(gè)數(shù)據(jù)包由固定的包頭和有效負(fù)載數(shù)據(jù)組成,一些底層的協(xié)議或許會(huì)需要定義的數(shù)據(jù)包來封裝。3. 字節(jié)順序,列隊(duì)和時(shí)間格式所有的整數(shù)字段有被網(wǎng)絡(luò)字節(jié)負(fù)載著,字節(jié)0是第一個(gè)顯示出來的,也是一段文字和字段中最重要的。這種字節(jié)順序一般被認(rèn)為“大字節(jié)“,數(shù)字常量在這種文檔里是用十進(jìn)制表示。所有RTMP消息塊流是以用字節(jié)列隊(duì),例如:一個(gè)16字節(jié)的字段也許會(huì)在字?jǐn)?shù)字

23、節(jié)的偏移段。那里要填充被標(biāo)示,填充字節(jié)應(yīng)該有0值(似乎看不懂). 在RTMP消息塊流中的時(shí)間戳用整數(shù)表示,單位為毫秒。每一個(gè)消息塊流以時(shí)間戳0開始,但是這不是必須的,只要兩個(gè)終端在時(shí)間點(diǎn)上達(dá)成一致,注意那就意味著任何穿過多消息塊流異步傳輸(特別是分散的主機(jī))在RTMP消息塊流之外需要一些而外的機(jī)制。時(shí)間戳必須始終在線性的增加,允許應(yīng)用程序處理異步傳輸,帶寬度量,檢測,和流控制。因?yàn)闀r(shí)間戳一般是只有32字節(jié)的長度,他們周期小于50天,因?yàn)榱魇窃试S不停地流動(dòng)的,最終可以運(yùn)行幾年,一個(gè)RTMP消息塊流應(yīng)用必須用到模運(yùn)算用于相減和比較,任何合理的方式都可以被接受,只要兩端都達(dá)成一致,一個(gè)應(yīng)用可以假設(shè)

24、,例如,所有相近的時(shí)間戳在2的31次方以內(nèi),所以10000在4000000000后面,3000000000在4000000000前面。時(shí)間戳delta作為一個(gè)表示毫秒的無符號(hào)整數(shù)也會(huì)被詳細(xì)介紹,和先前的時(shí)間戳相比,時(shí)間戳delta可以是24字節(jié)或者是32字節(jié)的長度。4.RTMP消息格式:服務(wù)端和客戶端在網(wǎng)路上發(fā)送發(fā)送RTMP消息給彼此,消息尅包含音頻,視頻,數(shù)據(jù)或者其他消息。RTMP消息包含連個(gè)部分,包頭和有效負(fù)載。消息頭:消息包頭包含以下:消息類型:一個(gè)字節(jié)的字段用來表示消息類型。1-7類型范圍內(nèi)的ID是被保留用于協(xié)議控制消息。長度:3個(gè)字節(jié)的字段用來表示有效負(fù)載的長度。時(shí)間戳:四個(gè)字節(jié)的長

25、度包含了消息的時(shí)間戳,這四個(gè)字節(jié)被包在一個(gè)大比特序列中。消息流ID:三個(gè)字節(jié)的字段標(biāo)示消息的流,這些字段被設(shè)置在一個(gè)大比特格式中。消息有效負(fù)載:有效負(fù)載是包含在消息中的實(shí)際數(shù)據(jù),例如:它可以是一些音頻樣本或者壓縮的視頻數(shù)據(jù)。協(xié)議控制消息:RTMP位協(xié)議控制消息保留了0-7的類型ID,這些消息包含RTMP消息塊流協(xié)議或者RTMP本生需要的信息。ID是1和2的協(xié)議消息被保留用作RTMP消息塊流協(xié)議的使用,ID是3-6的協(xié)議消息被保留用作RTMP的使用,ID是7的協(xié)議消息被用在邊緣服務(wù)和原電服務(wù)之間。協(xié)議控制消息必須有消息流ID0(稱為控制流)和消息塊流ID2,發(fā)送時(shí)帶有最高優(yōu)先級(jí)。5.設(shè)置消息塊大

26、小協(xié)議控制消息1,設(shè)置消息塊大小,用來通知對(duì)方新的可供利用的最大的消息塊的大小。消息塊大小的值可以負(fù)載4個(gè)字節(jié)的消息負(fù)載。消息塊的大小可以被設(shè)置成一個(gè)默認(rèn)的值,但是客戶端或者服務(wù)端可以改變這個(gè)值,可以給對(duì)方更新。例如:假設(shè)一個(gè)客戶端想要發(fā)送131字節(jié)的音頻數(shù)據(jù),消息塊的大小為128字節(jié),在這種情況下,客戶端可以發(fā)送這個(gè)協(xié)議控制消息給服務(wù)端以通知消息塊的大小被設(shè)置成131字節(jié),那么客戶端就可以用一個(gè)消息塊發(fā)送音頻數(shù)據(jù)。最大的消息塊大小可以是65536個(gè)字節(jié),消息塊的大小在服務(wù)端與客戶端的通信以及客戶端到服務(wù)端的通信是維持不變的。中斷消息:協(xié)議控制消息2,中斷消息,用來向通知對(duì)方是否在等待消息塊完

27、成一則消息,然后丟棄部分接收到的消息,放棄消息的處理過程,對(duì)方接收到要被丟棄的消息的消息塊流ID作為協(xié)議消息的有效負(fù)載,這個(gè)消息在發(fā)送方已經(jīng)發(fā)送部分消息后發(fā)送,但是想要告訴接收方余下的消息不用發(fā)送。消息塊流ID(chunk stream id):32字節(jié)這個(gè)字段持有要被丟棄的消息的消息塊流ID。確認(rèn)(ACK):客戶端或者服務(wù)端當(dāng)接收到的字節(jié)和窗口大小一樣時(shí)發(fā)送確認(rèn)給對(duì)方,窗口大小是發(fā)送方發(fā)送的在沒有從接收方收到確認(rèn)之前的最大字節(jié)數(shù),服務(wù)端在應(yīng)用程序接通后給客戶端發(fā)送窗口大小,這個(gè)消息指定了序號(hào),就是目前為止收到的字節(jié)數(shù)。序號(hào)(sequence number):32比特這個(gè)字段是有到目前為止收到

28、的字節(jié)的數(shù)量。5.4.用戶控制客戶端或者服務(wù)端發(fā)送這個(gè)消息用來通知對(duì)方用戶控制事件,這個(gè)消息負(fù)載事件類型和事件數(shù)據(jù),頭兩個(gè)字節(jié)用來標(biāo)示事件類型,事件數(shù)據(jù)跟隨在事件類型后面,時(shí)間數(shù)據(jù)字段的大小事可變的。5.5 窗口確認(rèn)大小客戶端或者服務(wù)端在發(fā)送確認(rèn)時(shí)發(fā)送這個(gè)消息來告知對(duì)方使用的窗口大小。例如:一個(gè)服務(wù)端期望在服務(wù)端發(fā)送的字節(jié)數(shù)和窗口大小一樣是每時(shí)每刻都收到客戶端的確認(rèn),服務(wù)端在成功處理客戶端請(qǐng)求的連接后向客戶端更新自己的窗口大小。5.6設(shè)置帶寬客戶端或者服務(wù)端發(fā)送這個(gè)消息用來更新對(duì)方的輸出帶寬,輸出帶寬的值和對(duì)方大小一樣。如果自己當(dāng)前窗口大小和消息中接收到得不一樣,對(duì)方發(fā)送“窗口確認(rèn)大小“。發(fā)送

29、標(biāo)記硬(0),軟(1),或者動(dòng)態(tài)(2)消息利用有限的類型字段,在硬(0)請(qǐng)求中,對(duì)方必須在提供的帶寬上發(fā)送數(shù)據(jù),在軟(1)請(qǐng)求中,帶寬在于雙發(fā)的判斷,發(fā)送方可以限制帶寬,在動(dòng)態(tài)(2)請(qǐng)求中,帶寬可以是硬的或者是軟的。RTMP命令消息1. 介紹服務(wù)端和客戶端交換的消息的不同類型包括用于發(fā)送音頻數(shù)據(jù)的音頻消息,發(fā)送視頻的數(shù)據(jù)的視頻消息,發(fā)送用戶數(shù)據(jù)的數(shù)據(jù)消息,共享對(duì)象消息,和命令消息。共享對(duì)象消息一般提供在多個(gè)的客戶和一個(gè)服務(wù)段之間管理分布式數(shù)據(jù)的方法。命令消息負(fù)載客戶端個(gè)服務(wù)端AMF編碼命令,一個(gè)客戶端或者服務(wù)端可以在使用命令消息于彼此通信的流觴請(qǐng)求遠(yuǎn)程調(diào)用。2. 定義消息流:消息更隨的用于通信

30、的邏輯的通道。消息流ID:每一個(gè)消息有一個(gè)分配的ID用來識(shí)別此消息屬于的消息流。遠(yuǎn)程調(diào)用(RPC)一個(gè)允許客戶端或者服務(wù)端調(diào)用一個(gè)子程序或者進(jìn)程的請(qǐng)求。元數(shù)據(jù):關(guān)于數(shù)據(jù)的表述,影片的元數(shù)據(jù)包括影片標(biāo)題,持續(xù)時(shí)間,創(chuàng)造的數(shù)據(jù)等等。應(yīng)用實(shí)例:客戶端通過發(fā)送連接請(qǐng)求連接服務(wù)器的應(yīng)用程序的實(shí)例。動(dòng)作消息格式(AMF)一種簡潔的2進(jìn)制編碼用來連續(xù)化ActionSctipt對(duì)象。3. 消息類型客戶端和服務(wù)端在網(wǎng)絡(luò)上發(fā)送消息和彼此通信,這些消息可以使任何類型,包括音頻消息,視頻消息,命令消息,共享對(duì)象消息,數(shù)據(jù)消息,和用戶控制消息。3.1命令消息命令消息負(fù)載了在客戶端和服務(wù)端的AMF編碼命令,這些消息在AM

31、F0中被分配的類型值是20,在AMF3中的值是17.這些消息發(fā)送用來運(yùn)行操作諸如:連接,創(chuàng)造流,發(fā)布,播放,暫停。像onstatus,result這樣的命令用來通知發(fā)送方需求命令的狀態(tài),一個(gè)命令消息由命令名稱,處理ID和命令對(duì)象,一個(gè)客戶端或者服務(wù)端可以通過命令消息通信的流請(qǐng)求遠(yuǎn)程進(jìn)程調(diào)用(RPC)。3.2.數(shù)據(jù)消息客戶端或者服務(wù)端發(fā)送這些消息用來發(fā)送元數(shù)據(jù)和任何給對(duì)方的數(shù)據(jù),元數(shù)據(jù)包括數(shù)據(jù)(音頻,視頻等)的詳細(xì)資料諸如:創(chuàng)造時(shí)間,持續(xù)時(shí)間,主題等等,在AMF0中這些消息被分配的消息類型值是18,在AMF3中式15.33.共享對(duì)象消息一個(gè)共享對(duì)象就是一個(gè)同步的穿過多個(gè)客戶、實(shí)體等的flash對(duì)

32、象,AMF0小紅消息類型 kMsgContainer=19,在AMF3中該值為16,這些值被共享對(duì)象事件保留。每一個(gè)消息可以包含多個(gè)事件。支持一下時(shí)間類型3.4.音頻消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來發(fā)送音頻數(shù)據(jù)給對(duì)方,音頻消息的消息類型值為8是被保留的。3.5.視頻消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來發(fā)送視頻數(shù)據(jù),視頻消息的消息類型值為9是被保留的。這些很大會(huì)延遲其他類型消息的發(fā)送。為了阻止如此的情形,視頻消息被分配位最低的優(yōu)先級(jí)。3.6.聚合消息一個(gè)聚合消息是一個(gè)單一的包含一隊(duì)子消息的消息。消息類型是22是被保留的。 The aggregate message formate后點(diǎn)(back

33、pointer)包括了在自己包頭中包含的先前消息的大小。用來匹配FLV文件的格式和回溯搜索。利用聚合消息會(huì)有一些性能上的優(yōu)勢消息塊流可以在一個(gè)消息塊中發(fā)送至少一個(gè)完整的消息,這樣增加了消息塊的大小,利用聚合消息減少了消息塊發(fā)送的數(shù)量。子消息在內(nèi)存中連續(xù)的存儲(chǔ),當(dāng)制造系統(tǒng)(making system)呼叫在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù)時(shí)這就顯得非常有效率。3.7.用戶控制消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來通知對(duì)方用戶控制事件。以下是支持的控制時(shí)間類型4. 命令的類型客戶端個(gè)服務(wù)端交換的命令式用AMF編碼的,發(fā)送方發(fā)送的命令消息由命令名稱,處理ID和包含了相對(duì)參數(shù)的命令對(duì)象組成。例如:連接命令包含app參數(shù),告

34、訴服務(wù)端客戶端連接的應(yīng)用程序的名字。接收到的進(jìn)程會(huì)以相同的處ID發(fā)回應(yīng)答,回應(yīng)字符可以是_result,_error,_或者一個(gè)方法名稱(verifyClient 或者contactExternalServer)中的一種.一個(gè)_result或者_(dá)error命令字符串發(fā)送回應(yīng)信號(hào),處理ID指示了回應(yīng)消息中突出的命令,就像IMAP和許多其他的協(xié)議中的標(biāo)簽(tag)一樣。在命令字符串中的方法名稱代表了發(fā)送方試圖在接收端運(yùn)行一個(gè)方法(或動(dòng)作)。下面的總類對(duì)象用來發(fā)送多樣性命令NetConnection-一個(gè)高層表示在服務(wù)端和客戶端連接的高層協(xié)議。NetStream-一個(gè)表述音視頻或者其他流的通道的對(duì)象

35、,我們還發(fā)送命令像play, pause等等用來控制數(shù)據(jù)的流通。4.1NetConnection命令 Netconnection在在客戶端應(yīng)用程序和服務(wù)端之間的雙向連接,另外,他支持異步遠(yuǎn)程方法調(diào)用。下面的命令可以再Netconnection中發(fā)送 Connect、call、close、creatStream4.1.1 connect客戶端向服務(wù)端發(fā)送連接(connect)命令請(qǐng)求連接一個(gè)服務(wù)應(yīng)用實(shí)例。以下為命令的結(jié)構(gòu)以下為在connect命令中用到的name-value pairs(名稱值對(duì))的表述。音頻編碼的特性值視頻編碼特性值視頻功能特性值對(duì)象編碼特性值以下是服務(wù)端到客戶端命令的結(jié)構(gòu)在命

36、令執(zhí)行過程中消息的流通過程:客戶端向服務(wù)端發(fā)送連接命令請(qǐng)求與服務(wù)端應(yīng)用實(shí)例的連接。當(dāng)接收到連接命令后,服務(wù)端給客戶端發(fā)送協(xié)議消息“窗口確認(rèn)大小“,服務(wù)端也連接在連接命令中提及到得應(yīng)用程序。服務(wù)端向客戶端發(fā)送協(xié)議消息“設(shè)置同行帶寬“??蛻舳嗽谑艿健霸O(shè)置同行帶寬“后向服務(wù)端發(fā)送“窗口確認(rèn)大小”。服務(wù)端向客戶端發(fā)送(streamBegin)。服務(wù)端發(fā)送result命令消息向客戶端提供鏈接狀態(tài)的情報(bào)(失敗或者成功),這個(gè)命令明確了處理ID(對(duì)于連接(connect)命令來說等同于1),這個(gè)消息也明確了一些特性,比如Flash medialServer的版本,擴(kuò)展其他連接的能力,級(jí)別的信息,編碼,表述,

37、對(duì)象編碼等等。4.1.2callCall方法在接收方運(yùn)行遠(yuǎn)程進(jìn)程,被呼叫的遠(yuǎn)程進(jìn)程調(diào)用作為call命令的一個(gè)參數(shù)。從發(fā)送方到接收方的命令格式如下:回應(yīng)的命令格式如下:4.1.3.createStream(創(chuàng)造流)客戶端向服務(wù)端發(fā)送這個(gè)消息來創(chuàng)造一個(gè)邏輯的通道以供消息通信,音視頻的發(fā)布,元數(shù)據(jù)在使用createStream命令創(chuàng)建的流通道上實(shí)現(xiàn)。以下是客戶端到服務(wù)端的發(fā)送的命令格式以下是從服務(wù)端到客戶端發(fā)送的命令格式4.2.Netstream命令Netstream定義了流視頻,音頻和數(shù)據(jù)消息可以流通的的通道,一個(gè)NetConnection對(duì)象可以支持許多數(shù)據(jù)流的NetStream。以下命令可以再NetStream中發(fā)送Play、play2、deletestream、closeStream、ReceiveAudio、receiveVideo、publish、seek、pausePlay:客戶端向服務(wù)端發(fā)送這個(gè)命令來播放流,一個(gè)播放列表也可以使用這個(gè)命令被創(chuàng)建。如果你想創(chuàng)造動(dòng)態(tài)的在不同直播或者錄制的流中交換的播放列表,調(diào)用play多次,每次給reset傳遞false。如果你想立刻播放確定的流,清除其他任何排列播放的流,給reset傳遞true。以下從客戶端到服務(wù)端發(fā)送的命令結(jié)構(gòu)以下是從服務(wù)端到客戶端發(fā)送的命令結(jié)構(gòu)在命令執(zhí)行時(shí)的消息流通過程:??蛻舳嗽诮邮盏絼?chuàng)造流的result

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論