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

下載本文檔

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

文檔簡(jiǎn)介

RTMP(realtimemessagingprotocol)協(xié)議介紹這篇文檔詳細(xì)說(shuō)明了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í)間戳的端到端全信息傳送。穿過(guò)多層流,RTMP消息塊流不提供任何控制的優(yōu)先級(jí)別和相似形式,但是可以用于高層協(xié)議提供這樣的優(yōu)先級(jí),例如:一段實(shí)時(shí)視頻服務(wù)會(huì)選擇丟棄給于緩慢的客戶的視頻信息確保音頻信息可以及時(shí)被接收。RTMP消息塊流包含它自己的入隊(duì)協(xié)議控制消息,也提供一個(gè)高層協(xié)議機(jī)制用于嵌入用戶的控制消息。定義有效負(fù)載:包含在包中的數(shù)據(jù),就像音頻樣本或者壓縮的視頻數(shù)據(jù)。包:一個(gè)數(shù)據(jù)包由固定的包頭和有效負(fù)載數(shù)據(jù)組成,一些底層協(xié)議或許需要包的封裝來(lái)被定義。端口:在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è)通信的邏輯通道,允許消息流通。消息流ID:每一個(gè)消息擁有一個(gè)分配的ID識(shí)別跟隨的消息流。消息塊:消息的片段,消息被分成小的部分,在他們?cè)诰W(wǎng)絡(luò)中發(fā)送之前交叉存儲(chǔ)。消息塊確保定制時(shí)間戳的端到端全消息傳送,穿過(guò)多層流。消息塊流:一個(gè)通信的邏輯通道,允許消息塊在一個(gè)特定的方向上流通,消息塊流可以從客戶端傳送到服務(wù)器,也可以相反。消息塊流ID:每一個(gè)消息塊有一個(gè)分配的ID用于識(shí)別更隨的消息塊流。復(fù)合技術(shù):把分開的音視頻數(shù)據(jù)組合成一條音視頻流的過(guò)程,使同時(shí)傳送許多音視頻數(shù)據(jù)成為可能。逆復(fù)合技術(shù):復(fù)合的反向過(guò)程,交叉存取組裝的音頻視頻數(shù)據(jù),使他們成為最初的音視頻數(shù)據(jù)字節(jié)順序,列隊(duì)和時(shí)間格式所有的整數(shù)字段有被網(wǎng)絡(luò)字節(jié)負(fù)載著,字節(jié)0是第一個(gè)顯示出來(lái)的,也是一段文字和字段中最重要的。這種字節(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á)成一致,注意那就意味著任何穿過(guò)多消息塊流異步傳輸(特別是分散的主機(jī))在RTMP消息塊流之外需要一些而外的機(jī)制。時(shí)間戳必須始終在線性的增加,允許應(yīng)用程序處理異步傳輸,帶寬度量,檢測(cè),和流控制。因?yàn)闀r(shí)間戳一般是只有32字節(jié)的長(zhǎng)度,他們周期小于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è)表示毫秒的無(wú)符號(hào)整數(shù)也會(huì)被詳細(xì)介紹,和先前的時(shí)間戳相比,時(shí)間戳delta可以是24字節(jié)或者是32字節(jié)的長(zhǎng)度。消息格式一個(gè)消息的格式可以分裂成消息塊以支持復(fù)用,依靠高層協(xié)議,消息格式應(yīng)該包含創(chuàng)造消息塊的必須字段。時(shí)間戳:消息的時(shí)間戳,這個(gè)字段可以傳輸4個(gè)字節(jié)。長(zhǎng)度:消息的有效負(fù)載的長(zhǎng)度,如果消息頭不能被省略,他應(yīng)該包含在長(zhǎng)度中,這個(gè)字段在消息塊包頭中占有3個(gè)字節(jié)。類型ID:協(xié)議控制消息的類型字段的范圍是被保留的,這些傳播信息的消息被RTMP消息塊和高層協(xié)議處理,所有其他的類型ID可被高層協(xié)議使用,被RTMP消息塊當(dāng)做不透明的值,事實(shí)上,在RTMP消息塊中需要這些值當(dāng)做類型的是沒(méi)有的,所有的消息可以成為通一種類型,或者應(yīng)用程序用這個(gè)字段區(qū)分同步跡象而不是類型,這個(gè)字段占用1個(gè)字節(jié)。消息流ID:消息流ID可以是任意值,不同的消息復(fù)合依靠的同樣的消息塊流是基于他們的消息流ID被逆復(fù)合而成的,在此之上,直到RTMP消息塊被關(guān)注,這是一個(gè)不透明的值,這個(gè)字段在包頭中占用4個(gè)字節(jié)。握手一個(gè)RTMP通信以握手開始,握手不像其他的協(xié)議,他包含三個(gè)固定長(zhǎng)度的消息塊。客戶(初始化通信的終端)和服務(wù)器每放發(fā)送同樣的三個(gè)消息塊,說(shuō)明一下,被客戶段發(fā)送的消息塊被指定為C0,C1,C2,被服務(wù)器端發(fā)送的消息被指定為S0,S1,S2。握手的順序握手以客戶端發(fā)送C0和C1消息塊位開始,客戶端必須等到S1到達(dá)在發(fā)送C2??蛻舳吮仨毜鹊絊2接收到才可以發(fā)送其他的數(shù)據(jù);服務(wù)端必須等到C0到達(dá)才發(fā)送S0和S1,在C1之后也會(huì)等待。服務(wù)端必須等到C1到達(dá)才發(fā)送S2,服務(wù)端必須等到C2到達(dá)后才發(fā)送其他數(shù)據(jù)。C0和S0格式C0也S0包長(zhǎng)8個(gè)字節(jié)0_2345G■—versLor.—版本:8比特在C0中,這個(gè)字段識(shí)別客戶端需求的RTMP的版本,在S0中,這個(gè)字段識(shí)別服務(wù)器端選擇的RTMP的版本,被定義的是版本3,0到2是被早前的版本使用的,4到31保留被用作未來(lái)的用途,32到255還沒(méi)有被允許。不能區(qū)分客戶的請(qǐng)求的版本的服務(wù)應(yīng)該以3返回,客戶端或許會(huì)選擇3一下的版本,或者放棄握手。C1和S1的格式:C1和S1的數(shù)據(jù)包有1536個(gè)字節(jié)長(zhǎng),由以下幾個(gè)字段組成。01230_234567890_2345£7890_234567890_1-1114sk—1—4-—1kk1一d1time(4joytes)H11—114!—1—1—1—1111H—1zero(4r-ytes)HF—I—111—1—1———IF—I1H—1randemnytes4■一■mm-4■—4+-4-4-『一『一4-4-4-4一+-+-+-+-+-+-+--i---l--^randombytesI(GQl'-t)IHF—I—1141—F—1—1—1F—I1H—1時(shí)間:4個(gè)字節(jié)這個(gè)字段包含時(shí)間戳,被當(dāng)做以后消息塊從終端發(fā)送的時(shí)間點(diǎn),也許是0,或者一些任意的值,用來(lái)同步多重的消息塊流,終端或許希望發(fā)送其他消息塊流的時(shí)間戳的當(dāng)前值。0:4各個(gè)字節(jié)這個(gè)字段必須全0。隨即數(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ù)。但是沒(méi)有必要密碼保護(hù)隨機(jī)數(shù)和動(dòng)態(tài)值。5.4.C2和S2的格式C2和S2數(shù)據(jù)吧有1536字節(jié)長(zhǎng)度,近似S1和C1的回聲,由一下幾個(gè)字段組成。0L23□_234567890_234567&90-23455789□-■I——I——I——I11111-一-——41——I1——Itime(4bytes)1+—++——一-一h+—+—?■一h+—一一4一一+一+_-一+一一一+一+一time2(4=:)1+—++——一-一h+—+—?■一h+—一一4一一+一+_-一+一一一+一+一random,echo4=—++,——"―———3—3+”—+,———―randoinechoI(con?)I....—時(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字段和當(dāng)前時(shí)間戳組成作為連接的帶寬或者延遲的評(píng)估。但是似乎沒(méi)有用。5.5.握手過(guò)程

-1++Client—117CP/ZF11Network+■*"£erver|1111Uninitialized11CO11111>1co11Uninitialized111111Cl11-1>1£0>11111|<SLVersiqeSEETl<11:<-£0111-1111l<-SI1_11-|VersionseriClC211———>|£21111Acksenz11l<1111Ha.tlclsha.keDe二eS2l<11|111C211Ack£EEZ111111>1HandshakeDone下面的表格表述了提到了在握手階段的狀態(tài)階段描述未初始化協(xié)議版本在這個(gè)階段中被發(fā)送,客戶端個(gè)服務(wù)端沒(méi)有初始化,客戶端在C0中發(fā)送協(xié)議版本,如果服務(wù)端支持版本,就在回應(yīng)中發(fā)送S0和S1,如果不能,服務(wù)端通過(guò)適當(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ù)交換消息。消息分塊在握手以后,連接復(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í)帶有小的包頭,消息塊的包頭包含了信息的壓縮表示,另外這下信息必須在消息自身中包含。消息塊格式:每一個(gè)消息塊有包頭和數(shù)據(jù)組成,包頭自身可以被分割成三個(gè)部分,卜HBssicheader|ChunkMsgHeader|ExtendedTimeStampChunkDa.t&I1-H消息塊的基本頭:1到3個(gè)字節(jié)這個(gè)字段編碼了消息塊流的ID和消息塊的類型,消息塊類型決定了消息包頭的編碼格式,長(zhǎng)度完全取決于可變長(zhǎng)的消息塊流ID。消息塊消息頭:0,3,7,或者11個(gè)字節(jié)這個(gè)字段編碼正在傳送的消息的信息,長(zhǎng)度可以利用在消息塊頭中詳細(xì)的消息塊類型來(lái)決定。擴(kuò)展時(shí)間戳:0或者4個(gè)字節(jié)這個(gè)字段必須在普通時(shí)間戳被設(shè)置為0xffffff時(shí)發(fā)送,在普通時(shí)間戳被設(shè)置成任何其他時(shí)不能不能傳送。所以對(duì)于值比0xffffff小的,普通時(shí)間戳字段應(yīng)該用在擴(kuò)展時(shí)間戳沒(méi)有被呈現(xiàn)的案例中。對(duì)于值大于或者等于0xffffff普通時(shí)間戳不能被利用,不ixuba值設(shè)置成0xffffff,擴(kuò)展時(shí)間戳要被發(fā)送。6.1.1.消息塊基本頭:消息塊基本時(shí)間頭對(duì)消息塊流的ID和消息塊的類型進(jìn)行編碼,(在下面的圖表中用fmt表示),消息塊類型決定了編碼的消息頭的格式,消息塊基本頭字段可以是1,2,或者3個(gè)字節(jié)長(zhǎng),決定于消息塊流ID。協(xié)議支持超過(guò)65597個(gè)流,ID范圍3-65599,ID0,1和2是被保留的,值0代表了在64到319的ID,值1代表了在64到65599的ID,值2代表了底層協(xié)議消息。對(duì)于流ID沒(méi)有額外增加的字節(jié)表示,值3到63表示完成的流ID,沒(méi)有額外的字節(jié)用來(lái)表示。在消息塊基本頭中0-5比特(最不重要的)代表了消息塊流ID消息塊流ID2-63可以被編碼成這個(gè)字段的一個(gè)字節(jié)的版本號(hào)。0L23456■—zmt|C3id|—消息塊流ID64到319在這個(gè)字段中可以被編碼成2個(gè)字節(jié)的版本號(hào)(第2個(gè)字節(jié)加64)。01123456-89012345—fmt|0|qsid-64|—消息塊流ID64到65599在這個(gè)字段中可以被編碼成3個(gè)字節(jié)的版本號(hào)(第三個(gè)字節(jié)*256+第二個(gè)字節(jié)+64)。123456-890123456"890123—zmt|1|G5id-64|—Csid:6比特這個(gè)字段包含了消息塊流ID,值從2到63,值0和1用于代表這個(gè)字段的2個(gè)或者3個(gè)字節(jié)的版本號(hào)。Fmt:2比特這個(gè)字段標(biāo)示了一個(gè)或者4個(gè)被消息塊消息頭使用的格式。Csid-64:8或者6個(gè)比特這個(gè)字段包含了消息塊流ID減64,例如ID365在CSid段用1表示,在csid-64段用301表示。值為64到319的消息塊流ID可以被2字節(jié)或者3字節(jié)的版本號(hào)來(lái)表示。消息塊消息頭在消息塊消息頭中有四種不同的個(gè)格式,由消息塊基本頭的fmt字段選擇。一次執(zhí)行應(yīng)該使用最簡(jiǎn)潔的表達(dá)方式表示每一個(gè)消息塊消息頭。.類型0:類型0的消息塊有11個(gè)字節(jié)長(zhǎng)們這個(gè)類型必須在消息塊流開始時(shí)使用,只要消息流的時(shí)間戳回溯。0L230L23456-89DL2j456_S90123456_8=0L+-—1—11F111—1!—H—11—1———Ftimestamp|messa.gelength|H111111—11—11—H11—11—1messacelength[cont)|messagetypeidITisgstreamid|messageid(cent)—時(shí)間戳(timestamp):3個(gè)字節(jié)對(duì)于類型0的消息塊,消息的完全的時(shí)間戳放在這里,如果時(shí)間戳比16777215大或者相等(16精制0x00ffffff),這個(gè)值必須是16777215,擴(kuò)展的時(shí)間戳頭被發(fā)送,另外,這個(gè)值必須是完整的時(shí)間戳。類型1類型1的消息塊有7個(gè)字節(jié)長(zhǎng),消息流ID沒(méi)有被包含,這個(gè)消息塊得到和先前消息塊同樣的流ID,帶有可變長(zhǎng)的消息的流(例如許多視頻格式)在類型0消息塊后應(yīng)該使用這種格式作為每一個(gè)消息的第一個(gè)消息塊。01230123456_890123456~890123456_8901—tiir.estdelta|messagelength|—-|11F—I1111—1111111111HmessageLength(cort)|iressq.gezypeid|—.類型2類型2消息塊有3個(gè)字節(jié)長(zhǎng),流ID和消息長(zhǎng)度都沒(méi)有被包含,這個(gè)消息塊和之前的消息塊有相同流ID和消息長(zhǎng)度,帶有不變長(zhǎng)的消息的流(例如一些音頻格式)在類型0消息塊后應(yīng)該利用這種格式作為每一個(gè)消息的第一個(gè)消息塊0123456-890123456_890123—tiiriE5de_t=.—.類型3類型3的消息塊沒(méi)有頭,流ID,消息長(zhǎng)度時(shí)間戳delta,這個(gè)類型的消息塊在之前的消息塊中取值,當(dāng)單一的消息被分裂成消息塊,所有的消息塊除了第一個(gè),應(yīng)該使用這種類型,流由同樣大小的消息組成。時(shí)間戳delta(timestampdelta):3個(gè)字節(jié)對(duì)于類型1和類型2的消息塊,先前的消息塊的時(shí)間戳和當(dāng)前的消息塊的時(shí)間戳的不同點(diǎn)可以在這里看到,如果delta的值比16777215大或者相同,這個(gè)值必須是16777215,擴(kuò)展的時(shí)間戳被呈現(xiàn),另外,這和值必須是完整的delta。消息長(zhǎng)度(messagelength):3個(gè)字節(jié)對(duì)于類型0和類型1的消息塊,消息的長(zhǎng)度會(huì)出現(xiàn)在這里。注意這一般和消息塊有效負(fù)載長(zhǎng)度是不一樣的。消息塊的有效負(fù)載長(zhǎng)度是出了最后一個(gè)消息塊的所有消息塊的最大的長(zhǎng)度。消息類型id(messagetypeid):一個(gè)字節(jié)對(duì)于類型0和類型1的消息塊,消息的類型被表示在這里。消息流ID(messagestreamid):4個(gè)字節(jié)對(duì)于類型0的消息塊,消息流ID會(huì)被儲(chǔ)存,消息流ID在很小的比特中被存儲(chǔ),代表性的,所有的相同消息塊流的消息來(lái)自同一個(gè)消息流。然而使把分散的消息流復(fù)合成同一個(gè)消息塊流成為可能,就不用所有的頭壓縮。然而,如果一個(gè)消息流被關(guān),另一個(gè)更隨的是開著的,就沒(méi)有理由通過(guò)發(fā)送一個(gè)新的類型0的消息塊讓一個(gè)存在的消息塊流不能再生。擴(kuò)展時(shí)間戳(extendtimestamp):當(dāng)消息頭中的普通的時(shí)間戳是0x00ffffff這個(gè)字段就會(huì)被傳送,如果普通時(shí)間戳的值小于0x00ffffff,這個(gè)字段就不會(huì)被呈現(xiàn),如果時(shí)間戳字段沒(méi)有被呈現(xiàn)這個(gè)字段不能被呈現(xiàn),類型3的消息塊沒(méi)有這個(gè)字段。如果這個(gè)字段被傳送會(huì)在消息塊頭之后,消息塊數(shù)據(jù)之前被立刻定位。he=.derCh_inkMsgHeaderIZxzencedTimeSzamuIChunkDa.ta.—Chunkformat6.2.1.例1:例一給出一個(gè)簡(jiǎn)單的音頻消息流,這個(gè)例子示范了信息的冗余。+—■--一_一一■一一4―ssE.geStreair.ID|MeesageTYpeZDTime|_iengznTff1T|Msg#1|12345|S|1030|32J_L|Msg祜2|12345|3||1020|32|Flagf3|12345|3|10^0|321blsg#41L23451S11060132FigureL3S=.moLeA.udiQmessaaestobenadeinzochunksJ—1下一個(gè)表格展示了消息塊在流中被創(chuàng)造,從消息3向前,數(shù)據(jù)的傳輸是最優(yōu)化的,每個(gè)消息只有1個(gè)字節(jié)11++IChunk|C^unk|BeiderHitsmq.ofB^~esro-il3Iq.ofIStream7□iTyp^||After3yt-:sIntheIII2hunk31odeLt=L:1000|Length:32f1-ype:3-xesiriED:|L23451111bytes)3244Chunk#2|312120(3bytes)3236Chunk#3|33none(0tyres)3233Chunk#4|313none(0nytesj32處FigureL4Fonr.atofeachofthechunksofaudior.essages6.2.2.例二:例二舉例說(shuō)明一個(gè)很長(zhǎng)的消息被分割成很多消息塊MassageSZDMessageT'YpeZDTineLength|Msg手_|_2346|9(video)|L0001307|Figure_5SamplePdessage二口benroken~qchJEkE這里是分割出來(lái)的消息塊卜+■+-—1Chunk1Ch^inkHeaderINq.QfNo.of|lSzreEn|Tyoe|Dat^ByzeeS-fter|joyzesin1:D1Headerzhechunk4+-—|Chunks1I40|deIza:10001128140ILength:30~|Itype:9」IE-re^nZDiI12346(11I應(yīng)二共)+++■Chunkif2|11431i:cnenytee(05)128111291■■■■Chunk#343i:cne(05152I^ytes)—Fiqure16Fomazofeachqz~henrokerchunk.消息塊1的包頭數(shù)據(jù)詳細(xì)介紹了307個(gè)字節(jié)的消息的全部。注意這兩個(gè)例子,類型3消息塊可以有用作兩個(gè)不同的方式,第一種是指定一則消息的延續(xù),第二種是指定新消息的開始,這個(gè)新消息可以從巳經(jīng)存在的數(shù)據(jù)中衍生出來(lái)。7.協(xié)議控制消息Rtmp消息塊流支持一些協(xié)議控制消息,這些消息包含RTMP消息塊流協(xié)議需求的信息,不會(huì)用于高層的傳播,現(xiàn)有兩種協(xié)議消息使用在RTMP消息塊流中,一個(gè)協(xié)議消息用來(lái)設(shè)置消息塊大小,另外一種用于中斷消息,由于沒(méi)殘余的消息塊沒(méi)有被利用。協(xié)議控制消息應(yīng)該有消息流ID0(被稱為控制流)和消息塊流ID2,帶有最高的優(yōu)先級(jí)被發(fā)送。每一個(gè)協(xié)議控制消息類型有一個(gè)固定大小的負(fù)載,通常在一個(gè)單一的消息塊中被發(fā)送。設(shè)置消息塊大?。簠f(xié)議控制消息1,設(shè)置消息塊大小,用來(lái)通知對(duì)方新的最大的消息塊大小。消息塊的大小可以被設(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é),消息塊的大小在每一個(gè)方向上是維持不變的。中斷消息:這個(gè)協(xié)議控制消息用來(lái)通知對(duì)方如果他等待消息塊完成一個(gè)消息,然后丟棄部分收到的消息。對(duì)方受到消息塊流ID作為這個(gè)協(xié)議消息的有效負(fù)載。一個(gè)應(yīng)用程序?yàn)榱吮硎疚磥?lái)的消息處理過(guò)程是不需要的時(shí)候或許會(huì)送這個(gè)消息。RTMP消息格式介紹:這段文字詳細(xì)介紹了RTMP,詳細(xì)介紹了在網(wǎng)絡(luò)上使用底層傳輸協(xié)議的實(shí)體調(diào)動(dòng)的消息的格式。RTMP是設(shè)計(jì)和RTMP消息塊流協(xié)議一起工作的,它可以利用任何其他的傳輸協(xié)議發(fā)送消息,RTMP消息塊協(xié)議和RTMP一起適用于多樣性的音視頻應(yīng)用程序,從一對(duì)一,一對(duì)多的向視頻點(diǎn)播服務(wù)器的直接廣播到交互式的回憶應(yīng)用程序。定義:消息流:一個(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ù)包來(lái)封裝。字節(jié)順序,列隊(duì)和時(shí)間格式所有的整數(shù)字段有被網(wǎng)絡(luò)字節(jié)負(fù)載著,字節(jié)0是第一個(gè)顯示出來(lái)的,也是一段文字和字段中最重要的。這種字節(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á)成一致,注意那就意味著任何穿過(guò)多消息塊流異步傳輸(特別是分散的主機(jī))在RTMP消息塊流之外需要一些而外的機(jī)制。時(shí)間戳必須始終在線性的增加,允許應(yīng)用程序處理異步傳輸,帶寬度量,檢測(cè),和流控制。因?yàn)闀r(shí)間戳一般是只有32字節(jié)的長(zhǎng)度,他們周期小于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è)表示毫秒的無(wú)符號(hào)整數(shù)也會(huì)被詳細(xì)介紹,和先前的時(shí)間戳相比,時(shí)間戳delta可以是24字節(jié)或者是32字節(jié)的長(zhǎng)度。RTMP消息格式:服務(wù)端和客戶端在網(wǎng)路上發(fā)送發(fā)送RTMP消息給彼此,消息剋包含音頻,視頻,數(shù)據(jù)或者其他消息。RTMP消息包含兩個(gè)部分,包頭和有效負(fù)載。消息頭:消息包頭包含以下:消息類型:一個(gè)字節(jié)的字段用來(lái)表示消息類型。1-7類型范圍內(nèi)的ID是被保留用于協(xié)議控制消息。長(zhǎng)度:3個(gè)字節(jié)的字段用來(lái)表示有效負(fù)載的長(zhǎng)度。時(shí)間戳:四個(gè)字節(jié)的長(zhǎng)度包含了消息的時(shí)間戳,這四個(gè)字節(jié)被包在一個(gè)大比特序列中。消息流ID:三個(gè)字節(jié)的字段標(biāo)示消息的流,這些字段被設(shè)置在一個(gè)大比特格式中。01230L23456-890L23456_890L23456-8°0L—IMessaceType|PayloadLength(1^yte)I(3nytes)—Tlineszhjttd(4ny-Bs)—StreamZD(3nytes)—Figure1Messageheader消息有效負(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è)置消息塊大小協(xié)議控制消息1,設(shè)置消息塊大小,用來(lái)通知對(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ù)端的通信是維持不變的。0L230123456-890123456-890123456-8901—chunksize(4joyzee!—Figure2P=yLoadforzheprotocolmessage1SetChurkSize中斷消息:協(xié)議控制消息2,中斷消息,用來(lái)向通知對(duì)方是否在等待消息塊完成一則消息,然后丟棄部分接收到的消息,放棄消息的處理過(guò)程,對(duì)方接收到要被丟棄的消息的消息塊流ID作為協(xié)議消息的有效負(fù)載,這個(gè)消息在發(fā)送方巳經(jīng)發(fā)送部分消息后發(fā)送,但是想要告訴接收方余下的消息不用發(fā)送。0123012345=_890123456_S90L23456_890L+=一1111—1-—-!-1-1kk1k?—1111k—1kch_inkstresinid(4rytes)Figure3Payloadfortheprotocolmessage'TihortMessa.gef.消息塊流ID(chunkstreamid):32字節(jié)這個(gè)字段持有要被丟棄的消息的消息塊流ID。確認(rèn)(ACK):客戶端或者服務(wù)端當(dāng)接收到的字節(jié)和窗口大小一樣時(shí)發(fā)送確認(rèn)給對(duì)方,窗口大小是發(fā)送方發(fā)送的在沒(méi)有從接收方收到確認(rèn)之前的最大字節(jié)數(shù),服務(wù)端在應(yīng)用程序接通后給客戶端發(fā)送窗口大小,這個(gè)消息指定了序號(hào),就是目前為止收到的字節(jié)數(shù)。01230L23456_890L23456_890L2345G_890L—sequeiTcenunber(4bytee)—Figure4Payforzheprozoqq!meEE5.ge1AcknpwledgeTiei:L.序號(hào)(sequencenumber):32比特這個(gè)字段是有到目前為止收到的字節(jié)的數(shù)量。5.4.用戶控制客戶端或者服務(wù)端發(fā)送這個(gè)消息用來(lái)通知對(duì)方用戶控制事件,這個(gè)消息負(fù)載事件類型和事件數(shù)據(jù),EvenzType(2-byzss)|EvenzDataFz.ciure5Pa.vLoadzorzhe1UserCon-rdMessa.cief.—r二^-J頭兩個(gè)字節(jié)用來(lái)標(biāo)示事件類型,事件數(shù)據(jù)跟隨在事件類型后面,事件數(shù)據(jù)字段的大小事可變的。5.5窗口確認(rèn)大小客戶端或者服務(wù)端在發(fā)送確認(rèn)時(shí)發(fā)送這個(gè)消息來(lái)告知對(duì)方使用的窗口大小。例如:一個(gè)服務(wù)端期望在服務(wù)端發(fā)送的字節(jié)數(shù)和窗口大小一樣時(shí)每時(shí)每刻都收到客戶端的確認(rèn),服務(wù)端在成功處理客戶端請(qǐng)求的連接后向客戶端更新自己的窗口大小。D123DL>3456_890L23456_890L2345G_890LAckncwledgementWindowsize(4byte□)Figire6?s.yLoadfcr1WindowAckrow1edgem.entSLzef.5.6設(shè)置帶寬客戶端或者服務(wù)端發(fā)送這個(gè)消息用來(lái)更新對(duì)方的輸出帶寬,輸出帶寬的值和對(duì)方大小一樣。如果自己當(dāng)前窗口大小和消息中接收到得不一樣,對(duì)方發(fā)送“窗口確認(rèn)大小“。U_2J01>3456_890123456_890123456_63014--+-+-+-4■一+-+-+4--4--4--4--4---I---I--+-4■一4--+kr.Qv:1adgemsn_rdowsizs—Linizzype—Figure7F己y_0E.diior'SetPeerB&ndwidtnJ發(fā)送標(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命令消息介紹服務(wù)端和客戶端交換的消息的不同類型包括用于發(fā)送音頻數(shù)據(jù)的音頻消息,發(fā)送視頻的數(shù)據(jù)的視頻消息,發(fā)送用戶數(shù)據(jù)的數(shù)據(jù)消息,共享對(duì)象消息,和命令消息。共享對(duì)象消息一般提供在多個(gè)的客戶和一個(gè)服務(wù)段之間管理分布式數(shù)據(jù)的方法。命令消息負(fù)載客戶端跟服務(wù)端AMF編碼命令,一個(gè)客戶端或者服務(wù)端可以在使用命令消息于彼此通信的流觴請(qǐng)求遠(yuǎn)程調(diào)用。定義消息流:消息更隨的用于通信的邏輯的通道。消息流ID:每一個(gè)消息有一個(gè)分配的ID用來(lái)識(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í)例:客戶端通過(guò)發(fā)送連接請(qǐng)求連接服務(wù)器的應(yīng)用程序的實(shí)例。動(dòng)作消息格式(AMF)一種簡(jiǎn)潔的2進(jìn)制編碼用來(lái)連續(xù)化ActionSctipt對(duì)象。消息類型客戶端和服務(wù)端在網(wǎng)絡(luò)上發(fā)送消息和彼此通信,這些消息可以使任何類型,包括音頻消息,視頻消息,命令消息,共享對(duì)象消息,數(shù)據(jù)消息,和用戶控制消息。命令消息命令消息負(fù)載了在客戶端和服務(wù)端的AMF編碼命令,這些消息在AMF0中被分配的類型值是20,在AMF3中的值是17,這些消息發(fā)送用來(lái)運(yùn)行操作諸如:連接,創(chuàng)造流,發(fā)布,播放,暫停。像onstatus,result這樣的命令用來(lái)通知發(fā)送方需求命令的狀態(tài),一個(gè)命令消息由命令名稱,處理ID和命令對(duì)象,一個(gè)客戶端或者服務(wù)端可以通過(guò)命令消息通信的流請(qǐng)求遠(yuǎn)程進(jìn)程調(diào)用(RPC)。數(shù)據(jù)消息客戶端或者服務(wù)端發(fā)送這些消息用來(lái)發(fā)送元數(shù)據(jù)和任何給對(duì)方的數(shù)據(jù),元數(shù)據(jù)包括數(shù)據(jù)(音頻,視頻等)的詳細(xì)資料諸如:創(chuàng)造時(shí)間,持續(xù)時(shí)間,主題等等,在AMF0中這些消息被分配的消息類型值是18,在AMF3中式15.共享對(duì)象消息一個(gè)共享對(duì)象就是一個(gè)同步的穿過(guò)多個(gè)客戶、實(shí)體等的flash對(duì)象,AMF0小紅消息類型kMsgContainer=19,在AMF3中該值為16,這些值被共享對(duì)象事件保留。每一個(gè)消息可以包含多個(gè)事件。HeacerSharedz_E.qsZveriHveniEventEvent|ObjectIVersicn|已Idfeta|data|Type|date.|dc.taI|||||||length|JiMTSharedObjectMes3c.gebody支持一下時(shí)間類型+4-Req口官吉tChmng令ThTclient捋它口R與ttii£eventsr^qus^tttimtth自4=3)|亡h=Ln§■巨tti^sp■立J_li巨吉古右亡亡i吉.七巨d.with白.riAzr.巨dp^razr.stercfthestia.redcbjsetu■+Tt|chang-e1=4)|Theseirver-£endathl£eventtc:natl^ya.Ll亡;_1_i巨口七左rxt^ptth.^!d1i^ntnitinJth_^|requestfc~自changein.thev=i.l□e二三ariELT.ed5由工有工自七*■TOC\o"1-5"\h\z\o"CurrentDocument"++十Sut*l=5)ITh巨Ser^r£this^venttfithezetin.gIclientinspcnsetcRequestCtian.gseventiftheIrequestlaaccepted..\o"CurrentDocument"+4-S&ri±Ces^=i.gs|TheclientendsttiiseventtcttieservertcIi=E)|hrcadessta.message,Onreceivingthisevent,thefisirv^r~trea.deastsa.ir.aaaajjeteallth_etl-ientfiin.£ladingthe土巨nW巨!r\-t1Status'=7J|Thw專白irwAr-古巨eiH白thi£巨f?■住:n±tC:n■之七_(dá)1三yclient=£irzrirtiindltibni-+-4ICleciri,=8)ITheserversendsttiiseventtesttieclientta|clea.i:a.sh_a.redabjecttTheserrveralacaendaIthi^e^en.tin.se*pfin.£ets□■與總eventthatthe|clientsends口曰ccnrLect.TOC\o"1-5"\h\z_|十R.fin-.c:vfi'=9)IThefisirvar"£endsthiseventtesha.veth.fic:11&nt|d巨1巨七巨a.-t1Reqae£tRa^.tsveTheellent£endathl£event七占ha.veth.eclientII臺(tái)t.-t1UseSateess|Ttie專皂工w巨r(nóng)sendfithiseventtr:theclientcnm=11)|fincce££^Lilcannecticin.+3.4.音頻消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來(lái)發(fā)送音頻數(shù)據(jù)給對(duì)方,音頻消息的消息類型值為8是被保留的。3.5.視頻消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來(lái)發(fā)送視頻數(shù)據(jù),視頻消息的消息類型值為9是被保留的。這些很大會(huì)延遲其他類型消息的發(fā)送。為了阻止如此的情形,視頻消息被分配位最低的優(yōu)先級(jí)。3.6.聚合消息一個(gè)聚合消息是一個(gè)單一的包含一隊(duì)子消息的消息。消息類型是22是被保留的。t1-日宣盲d皂I:Aggregate忙宜直堂盲g宜bedy1i1-TheaggregatemessageformateI01geIBackI11Mes*a.geIBack|7色七色0|F?±Int^rr0||七白1|F±J_ntSrr1|Fi'ciH口3Th巨古.,寸17點(diǎn)寸合.七立zr足七右白口E±dyz±nr.At后點(diǎn)(backpointer)包括了在自己包頭中包含的先前消息的大小。用來(lái)匹配FLV文件的格式和回溯搜索。利用聚合消息會(huì)有一些性能上的優(yōu)勢(shì)消息塊流可以在一個(gè)消息塊中發(fā)送至少一個(gè)完整的消息,這樣增加了消息塊的大小,利用聚合消息減少了消息塊發(fā)送的數(shù)量。子消息在內(nèi)存中連續(xù)的存儲(chǔ),當(dāng)制造系統(tǒng)(makingsystem)呼叫在網(wǎng)絡(luò)上發(fā)送數(shù)據(jù)時(shí)這就顯得非常有效率。3.7.用戶控制消息客戶端或者服務(wù)端發(fā)送這個(gè)消息來(lái)通知對(duì)方用戶控制事件。以下是支持的控制事件類型Event|3e*criptic:n.Str&ecr.E-eginITheserverttiiseventtcnt:tizyttieclient■=0JIthat豈stre=irr.h號(hào)主Bedezr.s£anetidns1andcantsI旦右巨dzcsrCdzrjriu.nits.ticn.Bydezaciltfthisevent[古£entenID0a.^tar±hea.pplica±Icnccnnact|ccTTar.a.n.!ii££LLtc@£^fLillya:口仁巨iv自!1zrcirittiedient.Th巨eventd.=i.ta.1£4—kyt=i.ndrr^pr-entfith巨strea.mID口三ttiestreax.ttiatEw亡甘匚自Izuncticin.a.1>44-StreaziEOF|Thmsszrver芒mn口與ttii£^venttcnsti^yttieclient|l=L)Ithatthepl^yh-aektfd^±sv^r臺(tái)至requestedcnt£tBNc;zrq匚七datai££^ntwithouti£*uin.jAriditicna.1BTh巨clientsrristheir.essci.ge^received三亡工ttiestrectrr.The4tzy七臺(tái)生亡三些w巨n七日古土古h■臣f17自左百口■七th^13izth^strear.dn■whichpla.ybackhasendedL44-StreazrOry|Theserver^endsttiiseventtcn.t:tifyttieclient|■=2JiIthatthereIsncirsCzredata,in.th.e去七匚左aizn-I-the|serverdee*netdetecta.riyit皂堂烏臺(tái)刁巨三亡匚言ti>.ep^zrlcdriteannctiythefiuh-ficrltedclJ_enh£thatttiestrsaini*IryuThe4bytescfevent號(hào)iz■自F37白右也口七th^!£tr^=irDm亡三ttieHuy£t=cr.a十十SetB|Th巨dient£&nd.&th.1eventteln^eizr.tLie右它工寸巨匚Length'=3)I史thebuffer£iz巨(inirdlLiseccnd^)tti^.ti£Iu右edtC:ku三三白et=tnyd_=i.tci.c±±3r.J_n.!j亡f*■屯h豈fetrreccr.t|Thise^ent上占sentbeftiEettieservez:startspzrCCSfifilng-thefitrrfieLt..Th曳rrfit4C=theIeventds.tA.Tsp2:efien.ttheajt.IDan.rittiencsit4s-epx'E^Bn.tttimE?口三土ewlength#in.xilli*eednd占.4十ITherth.iseventtsneti^yttieclientReccrded■=4)Ithatttiestreainisa.recordeiistrea-T.The4tzy七立左v^ntt=it去七工巨吉err.ID亡三|thereccrdedstr&Ecr.l44-FingRequestITheaernrer^endattiiseventtdtestwhettierthel=E)|i±r^=t£h.=it-L^tEv^sntd白■七臺(tái)土去=i.4-Ejrttiir.esteLT.prrepresentin.gthe1cca.lserverti>.e■whenthe右自hv皂工dispateh^dth_e亡mr.zrmn.:zLTheIclientrespendswittik2<figFing-Refipcnsesnreceg1Fin^R.aqu.estB4.命令的類型客戶端跟服務(wù)端交換的命令式用AMF編碼的,發(fā)送方發(fā)送的命令消息由命令名稱,處理ID和包含了相對(duì)參數(shù)的命令對(duì)象組成。例如:連接命令包含’app’參數(shù),告訴服務(wù)端客戶端連接的應(yīng)用程序的名字。接收到的進(jìn)程會(huì)以相同的處ID發(fā)回應(yīng)答,回應(yīng)字符可以是_result,_error,_或者一個(gè)方法名稱(verifyClient或者contactExternalServer)中的一種.一個(gè)_result或者—error命令字符串發(fā)送回應(yīng)信號(hào),處理ID指示了回應(yīng)消息中突出的命令,就像IMAP和許多其他的協(xié)議中的標(biāo)簽(tag)一樣。在命令字符串中的方法名稱代表了發(fā)送方試圖在接收端運(yùn)行一個(gè)方法(或動(dòng)作)。下面的總類對(duì)象用來(lái)發(fā)送多樣性命令NetConnection---一個(gè)高層表示在服務(wù)端和客戶端連接的高層協(xié)議。NetStream---一個(gè)表述音視頻或者其他流的通道的對(duì)象,我們還發(fā)送命令像play,pause等等用來(lái)控制數(shù)據(jù)的流通。4.1NetConnection命令Netconnection在在客戶端應(yīng)用程序和服務(wù)端之間的雙向連接,另外,他支持異步遠(yuǎn)程方法調(diào)用。下面的命令可以再Netconnection中發(fā)送Connect、call、close、creatStream4.1.1connect客戶端向服務(wù)端發(fā)送連接(connect)命令請(qǐng)求連接一個(gè)服務(wù)應(yīng)用實(shí)例。以下為命令的結(jié)構(gòu)+-I-一————t以下為在connect命令中用到的name-valuepairs(名稱值對(duì))的表述。Fircpeizty|T^'pe|Desexlp*t£cn|Exazr.pl£Va.Lu.e中中中十a(chǎn)pp|Etrlng'|ThwSerrver^.ppl1eaticnnsa-r.e|t^£*ta.pptheclienti£ccnn&ctedto=-j十-lashv^r|St^in^|FlsfihPlayezVErfiiGn.,Itis|FM£e/lu0thmstring'm隹zr官t口匚nmd|hytheAppli£AtifinStFipt

gTtwmw與2*1{)^unctiwH.<d++sw=Qrl|String-|CTRLcfttiecurceSWFfileI由吉sw=Qrl|String-|CTRLcfttiecurceSWFfileI由吉.kingth_^ittn.u十十ttUirL|StErlng-|URL±±七k巨S直e巨匚-IIthasttie±cllcwing-zcrzr.at|

pzrit±±i:1:/直hv巨r(nóng)nMr*:p±zrt/=i.ppNaT.e/a.ppIn^tancefile[//c:/FlvP-L=i.y立et-左wz:rL1-1

Ft/■

EsF

tcF

rh-A-1335/tefin片t=t.n±^1一十It|音頻編碼的特性值dIS±u.rC±d^C±nit=i.nt|EJ去巨IV=l1li.^1SUPP0RT_SN3_lT5NE|R&古亡nt:亡e:工pzrW土主土口口|0x00011~SUPP0RT_SN3_A5PCM|MYFCW|0x0002SUFFORTSND_MP3|x.p3tfizr.pir^|OxC3i3O4SUFFQRT_SN2_IKTEL|Netu^ed|0x0008■i~S□FFQRT^SN^OtrtJSE□|Nfitu£ed|0x0010d~S□PFQRT_SN3_WELLY8|NellyMcserat8-kHz|0x0020tisT.pr宜在去J.亡n1SUPPORTSW3WELLY|t"ellyyS£eirccx.prrasslen|0x0040一一(5,llf22,and44kHzJS□FFORT_SN3_G711Z|G711ASCLind仁口工口!■白古右i口曰|0x0090|{Fla.sLi2<ed.la.Serrverenly)■Ij-SUFFQRTSN2_G711U|2711[J|0x0100一—|{Fla^tiysriiaServerinly)■iSUPPORT^SNl^KELLY1£|NT巨:LlyM亡巨工臺(tái).七LE-kHz|0x0200—…||CGT.pressinn-jSUPPORTSNDkk:|既zhr立nc宣daudit:ceding|0x0400一一jcodecH+4-SUPPORT_SND_SPEEX|SpaexAudiC|MM也H=+4-ISCJFF3RTSHDALL|AllRLME-件口宕ut官da.udio|0x0FFF——C^EIEC*視頻編碼特性值++3口口匚U已匚疔日,Ccn.^tEi.n.t|++Usage+.■SQFFDEirJ/IZi.JFESobsc_6te++3口口匚U已匚疔日,Ccn.^tEi.n.t|++Usage+.■SQFFDEirJ/IZi.JFESobsc_6tevalueqOxCOCiSUPFDRT_VID__SORENS3N|SerenfiGn.rl^shvidetOxCOC4SUPPORT^vidb^HOMEBREWVlsersensharingoxcocaSUPP3RT_VI3__VF£{3r2)|3n2v±inAsha+j-i~OxCOld0x0001十-ttSQEFDEirVIDCINQSE3|obssletevalueISUFFSRT^VIDVFSALPSA|On2ArLdee-withalptiaI(On2withaTpha.|channel<±h=i.nnS!1)4-SUFFDRTVI3HOMEBELEOTIScreensharingverfiicin2I{^±^en.ThizTngv2)|{Fl^h3+)—ISUFF3RTVIDH2S4IH2S4^ld.ee0x0040SUEFDRrVIDALLikllRTOP-fiuppszrtedOSOff十十視頻功能特性值對(duì)象編碼特性值以下是服務(wù)端到客戶端命令的結(jié)構(gòu)TOC\o"1-5"\h\z+十卜|Fie1dNarr.e|叩了冒白|^e^csrlptlcn++!■Cc^xan.dLm曰String1_reiultcz?jindicat^^wtiettifirtLih巨左f亡in左點(diǎn)h■蟲告uJ_七±r匚.{+1卜Trran.sa.ctIcn|Nu^t^rr|Tra.nsa.ctJ_e:n.I□1&1£crca.l1ccnnactI!□||respcnees\o"CurrentDocument"IIII\+j-Frcperties|Object|Najne-valu.^pairsthatdescribethe|prdp^srti^^[f巨七■.}±£Iccnnfitticn.H卜InfCE!r.s.ticn|Object|Nmzd口?wg]_□.巨ps.ir£tha.tdefierit-eth巨|rs£pcnseIthssszrveri11iixJ.pti±nr古工點(diǎn)n*r.臣若i£三.華Agauctiin■三cn.自ticzn.

在命令執(zhí)行過(guò)程中消息的流通過(guò)程:客戶端向服務(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)命令來(lái)說(shuō)等同于1),這個(gè)消息也明確了一些特性,比如FlashmedialServer的版本,擴(kuò)展其他連接的能力,級(jí)別的信息,編碼,表述,對(duì)象編碼等等。callCall方法在接收方運(yùn)行遠(yuǎn)程進(jìn)程,被呼叫的遠(yuǎn)程進(jìn)程調(diào)用作為call命令的一個(gè)參數(shù)。從發(fā)送方到接收方的命令格式如下:1dTT=cr.巨□巨生亡ript£±n十+CEHuteSt|N=tx.e亡主tllSLlZT.i:七EpT~CC63.LLT~e"ttiatLfiNir.e1亡豈__al.1NmnberI:z=reexps亡七口siwegive占1ticnIdiEwe白valu.^=三!□11o□in'izr.ci.ndii=二h臺(tái)工由口京日占七左=lny之亡Eir百ndin三亡ttiiectis堂f皂[酋皂ttii*tcnulltyp皂,□ptiinalOhjettAnyCpticnala.r:ju.Tfint£tc:B宣prcvidsdAirgu.eir.ents+十+十回應(yīng)的命令格式如下:TOC\o"1-5"\h\z44IFieId|Typ口|3&£Cripti0n.>1j十ICfi!rj!r_anriNar.e|String|Ila.-巨言三theesTjr.an.rit\o"CurrentDocument"IIII■i+■ITrcLnsaction|Nujrfcer|13ZtheCdirmELndftcwtiich.theI13||I:宜古古口b^lt±i十Cczrajr.and.I3fcjectIEzthexeataany亡Eimzn豈nd.in■三亡thisObject||1*setrthiss皂七tcrmlltyp&.-I+■IEtespends|3bject|Respen^efremtheir.ethcdttia.tg右ta__ed.createStream(創(chuàng)造流)客戶端向服務(wù)端發(fā)送這個(gè)消息來(lái)創(chuàng)造一個(gè)邏輯的通道以供消息通信,音視頻的發(fā)布,元數(shù)據(jù)在使用createStream命令創(chuàng)建的流通道上實(shí)現(xiàn)。以下是客戶端到服務(wù)端的發(fā)送的命令格式—IFi^idN=lx.^ITyp巨Iipti±nTOC\o"1-5"\h\zB|+f+ICc^^r.and|St^Lny|H曰工值口三thec^xandiSettc|^eEreateStr巨且k微.1十+Tra.n.£act£c:n.NLi^kaz:|TzransaetienID白三thecCjrjr.a.nduI13i+Cdjt?nr.cind|3bj±t|Iz"th直zr巨百器i七七七=tn.j-r±±jrnr.cLnd.in£±七h(yuǎn)i去Object||j.£££t?巨口ttii£is右口ttnnulltyp口?十以下是從服務(wù)端到客戶端發(fā)送的命令格式Theccirrr.andstmttarezrcin*erv?Etcclienti*自衛(wèi)fellcwsIFieIdllazr.?|Typ口|DescriptidnTOC\o"1-5"\h\z-j+/C±^njr.Ein.dN=cr.^StZTin^-Liltirr^zrrr±E7rindit±wh_^th.^E?ITheE&spEirLfi?isresultcrerrsrl-i+-IIrS-rLfia.cticnINuiribsr13czthe亡口insrmnHttiatrefipcn.sebelcngsI!□IIt礦+4ICG^nir.an.d|Object|Iztheree^istsanyccjr£nr.andinzethis□bj||i占巨].吳L±白宜七t±nal1tB十十Etreazr.|Nu-rt^c|Thezretazrn.valLieIseithear豈fitreazr.I□I!□jjfiranerrsrin=Srr.=i.tisne±tt\o"CurrentDocument"十十Netstream命令Netstream定義了流視頻,音頻和數(shù)據(jù)消息可以流通的的通道,一個(gè)NetConnection對(duì)象可以支持許多數(shù)據(jù)流的NetStreamo以下命令可以再NetStream中發(fā)送Play、play2、deletestream、closeStream、ReceiveAudio、receiveVideo、publish>seek、pausePlay:客戶端向服務(wù)端發(fā)送這個(gè)命令來(lái)播放流,一個(gè)播放列表也可以使用這個(gè)命令被創(chuàng)建。如果你想創(chuàng)造動(dòng)態(tài)的在不同直播或者錄制的流中交換的播放列表,調(diào)用play多次,每次給reset傳遞false。如果你想立刻播放確定的流,清除其他任何排列播放的流,給reset傳遞true。以下從客戶端到服務(wù)端發(fā)送的命令結(jié)構(gòu)

t

I

t

I-1十十FleIdVTax.eITyp也t

I

t

I-十C-dzr?zr.i=j.n.dHccr.eIStIIT豈h芭fizttieddrrzr.i=i.n.d.Sette'Apla.jr^.十ITran^actlc:nINurrfceizITransactlcnIDsettc0tI13—ICc^jr^nd|Null|二口皿mnsiinzoEir.a.ticndonotfit.|^bject||Settcnu.11tjpeuStrcirr.N=cr.^|EtErinJ|H豈h宜巳三ttietSp1S.y=|Tcplayvi(FLV)=ile£,specifytheIna^eczthestr■巳mznthcutafileextenslcsn.(三口he^ajr.pler,F£a3xpJ_a,pJ.Tc:Ipl^yt-^tk2dP3亡e133七吉-臺(tái)寸y±amu擋七precedethestr巨ninnazr自withF?p3[|m揮mH.F】w.irxp3e&^.pl^=arBIsplayIHu2£4/AA^J.fyGu.znlistprreced.ethe|£trear,nazr.e-witht^4iandspecifytheI^ile巳花忙已nsj.亡口lFcreKccr.pletcplaythezllesajT.ple-jt.4vp£pec1zy,rrr.p4:sa-r.pletrr.4v,rTOC\o"1-5"\h\z\o"CurrentDocument"IIII1十十1St4rt|Mumb由et|An.ii:n.=Ll下?吉h生r.由七直zrth.^tiz1|the£tci.rtti^einsetcrLdslThedefaultv=l1u.^i左-2fwhithm宜豈n古th.^trib^r"I=irsttriest口playthelivestreazri^p^sdiz£^d.in"th巨Strr^4inH=ct.巨£i1duI£4IlivestrecLTi白三thatnameisnestfdand^itply£theceirzl&d.atreazr.speciz1ed1nIth電Str^=LTiKEizr.efieldtIfyou-1In."th自StS.r"t三土自Ldfdn1yth.^Live古七工自Mr.IspecifiedintheStreetinH=cr.sfieldisIplayeduI£ycu.pa££0era.pcsl11veInumb直匚in.theStartzimrecceded£t=cr.fepedJ.zLnthStetS=cr.IT=lt.&|^ieldi*pl^yedheginningfrcinttietima|^peel^heSta.rtdu工三neI工巨ccrded£tieairiiszcu.n.drthen自虹titst?I|Inthfepliyli=£tIsplayedt□ura±lcnULizrk啟匚Anspt1c:n.alpszr=i-r.£!terth.=i.tspeciz1theIdu.Titian口三pl;ayba.clcin.£eccn.d£tThe:i自三MlliJ-七vS.1uSJ.白—L.Th巨—1v=i.lu.Szr.^=Ln£|alivs專七匚它看mplayedu.nt11iti£n.£IItsngerahleer=reterrieristrearr.|playeduntilitendfit1=upass0HitpL吉】他tizrr=cr.^君in亡宜tspecifiedintheStartfieldzn&jnthebe^-innlng口三a.zreccirded.£tireazr.uTt1sa*suir.sdttia.tthevalu.especifiedin.I七h(yuǎn)巨Stairtzieldise^u.a.ltesir自豈七巨工Itha.n0BIzyou.p白右占占pcsitivenumb自二日itplaysa1ivestEraecr.cr|thetiir?@periedspecifiedinthefisidh耳土仁mwttiatit匕昌s*Isv=i.ilatlefirplays豈reesrrisd*tr-e=LT.|三口匚thetime^p^cizi^dinthe□u.^.tn|£i^sld=』工三立古七工:由仕a.^sn.d_^1:?由三亡工自tti^stixespecifiedintheDura.tinnfield^ipl^.yE=i.±k^n.dwh世citti^臺(tái)七工也仕匚r.自nil左-)IIfyenr自主宜anegativen.uzrtierethertha.n-1inhhe□u.r,a.t£cn.zi^ldrLt|interp'retsthevalue盲緒ifitwere-1.Bcelean|AncpticnialBcelea.nva.lu.e口工n.?terIthatspecifi^tietbisrtu-lushan.ypr^vicu*plAyli^tu

以下是從服務(wù)端到客戶端發(fā)送的命令結(jié)構(gòu)十+□escuiptic:nIFieIdNaina|Iyp自□escuiptic:nH+CfiTT.anriNar.eString"工巨匕三ttieten'rr.an.d.IftheplaytCnrfiT.andissuccesfifulFtheecirjr.ELn.dn.Ei.x^[左若百七ti占nS七古土口右?COrrzr.a.nd1fiu.CCr"theIE■巨亡自ip■口占OnStS-tu.£rr.巨宕右白g自frcnr.wtiichN^tStz;^^.bElayhStart.±iz-i^d^tr:^4zr?上世n±tCOrrzr.a.nd1fiu.CCr"theIE■巨亡自ip■口占OnStS-tu.£rr.巨宕右白g自frcnr.wtiichN^tStz;^^.bElayhStart.±iz-i^d^tr:^4zr?上世n±tz±un.d營(yíng)++-+在命令執(zhí)行時(shí)的消息流通過(guò)程:??蛻舳嗽诮邮盏絼?chuàng)造流的result后發(fā)送播放命令。。當(dāng)接收到播放命令,服務(wù)端發(fā)送一個(gè)協(xié)議消息來(lái)設(shè)置消息塊大小。。服務(wù)端發(fā)送另一個(gè)協(xié)議消息(用戶控制)來(lái)確定“StreamlsRecorded“事件和在消息這個(gè)消息中的流ID,消息在前兩個(gè)字節(jié)中負(fù)載有事件類型,最后四個(gè)字節(jié)中負(fù)載有流ID。。服務(wù)端發(fā)送另一個(gè)協(xié)議消息確定事件“StreamBegin“,用來(lái)標(biāo)示對(duì)客戶端流的開始。。如果由客戶端發(fā)送的play命令成功,服務(wù)端發(fā)送OnStatus命令消息NetStream.Play.Start和NetStream.Play.Reset,在客戶端發(fā)送的Play命令巳經(jīng)設(shè)置了reset標(biāo)簽服務(wù)端只發(fā)送NetStream.Play.Reseto。在這之后,服務(wù)端發(fā)送客戶端播放的音視頻數(shù)據(jù)。Play2與play命令不一樣,play2可以再不改變播放內(nèi)容時(shí)間線的情況下交換成一個(gè)不同的比特率流。服務(wù)端為支持的比特率保持多個(gè)文件,客戶端可以在play2中請(qǐng)求。以下是從客戶端發(fā)送到服務(wù)端的命令結(jié)構(gòu)FrelriITaxe--|-_1-ype—+-Z'E*^riptien.Ce^.T.anri.narr.e1String■N&t.siftheCStj.Arrrirf*et-5''plfiy2,r.Transactiin1311—NiiTier-+-rrarnssetlotiZD*e--5CLTOC\o"1-5"\h\zIStartTim已|Dbject|AA2CFeneededdbjectthattGres白.|na^riti^r.Th直in.thliIspecifierttiebeginningpcsiticncz吉七工■也吉3,in左點(diǎn)七亡匚1占左-Iz0_i世f吉古左點(diǎn)dintheStartTiirie三土巳1,日!thestrear.isplayed.th.eciunrsnttizri1Ina=TtldStre白工甘&后1113tje亡七TTAn±±d^d±bjeettEi&t£t±zr^£當(dāng).fitring-value.Itsvalueiscc:nta1n-ing1tli^str^azr.riEcr.ea.n.dthecld*tre^Jnnar.eu白^trinj:二二」Strear.Nazr.e□bject|AA2<Feneeded口kg自亡七tti^.tfitrrinj節(jié)豈k*■Itfitcr-esthstreazrithatitpls.yed.fiZCTES白:二mOLiration□bjectMAXF^ri亡cdsdcbject二fiZCTES白riLizdb官匚valus.rhewml口缶吉t宜匚皂日InLt*pe£i=ic*thetstA.1du.rii.tian尊Wpln.gths與七匚耳丑工.TOC\o"1-5"\h\z4fTransiti|Object|AAXEneeded^bjectthatst宜工m玄aIstring十昌]旦皂.It*valueiefine*the|tsrari^itimHxcds(twitchug^■wipzr,亡d巨丫右和i七亡h:E1口h■三亡:eh右jdulti—bltzr^.t|fitreazriingbyswitthingL-bitratee~^i±ni£4tr=cr.t±:=in.±th^sz"u|swci.piReplacestheva.Lu.eintldStr^!ccr.N=tzr.^!withth^vilu.in|白七匚已己工11丑工巳yan.isteresttiere^.ainirig-F?J-各由七勺口巨ii巨自古rfinth_i|仁古當(dāng)宣手thsSernrerd口巨自net如宜k亙anyasacLTjp-t1c;nsabsut-thecententa£the|*treecr.sandtreat*thexilik^differentes:ntentuHen亡自,itelth^r-switchess.t|ttietrear.bsu.n.da.ry口匚nfivart以下圖示展示了命令消息的流通過(guò)程

4.2.3.刪除流(deleteStream)NetStream在NetStream對(duì)象被毀壞后發(fā)送刪除流命令rieldKiT.e--1■一-yp^—+-□escriptiinCt:^iir.an.dtfazr.e-十StringT-IlMzr虐cztheccirnr^nd*.矣皂tt口Tira,ns112n■+■TzTELnsactlcn.工二■settc4CejtiJtiatnd□L;set—I-~+Mu__-p--CfiT".a.nriin^firrr-=i.tj.5nfib"tnfit已花1WBttwn.u.11typm.I二try*T'~rtie!□令土tti^£tx^ax.tti^tde^tr^y^di:nth也Z7u-+-以下是從客戶端到服務(wù)端發(fā)送的命令的結(jié)構(gòu)+Ttie£eETvsr-nfit右自ndan.j.r*服務(wù)端沒(méi)有發(fā)送任何回應(yīng)。receiveAudioNetStream發(fā)送接收音頻消息來(lái)通知服務(wù)端是否發(fā)送或者不發(fā)送音頻給客戶端。以下是從客戶端發(fā)送到服務(wù)端的命令的結(jié)構(gòu)—IFieIdIfanrie|TypeI□e^eripticn.jICciTiiria.ndtfar.e|Strinj|Nazr.ecztties包ttr:++HqTran£^<tiuFiIEuhE舊匚:IT匚甘口smutLun!□t08I!□—C±^in4nd|ITull|Cdzrijr.=i.ndinzdr-r.si.ti±ni:t?j11a亡巨左nitIDkgect||e^istcSettcnulltl—Bcc1Flag|Bet:lean.|truecr三白J.S自tcindiea.te-whethertcrecelvea.a.d.1cexnot*++HThe5eztv白二nxt£endmrv.『匚E與口=口芒服務(wù)端不發(fā)送任何回應(yīng)receiveVideoNetStream發(fā)送接收視頻消息來(lái)通知服務(wù)端是否發(fā)送視頻給客戶端。以下是從客戶端發(fā)送到服務(wù)端的命令的結(jié)構(gòu)7ield履讓]-ype□e^criptisriCeT.T.a.n£Narr.eStringMa.-e宏三theeeTrr.s.nri^ts'LreceiveyideaJ,■_■__■_Trans=i.cticnHLLTibmrTra.n*ac-icnZZ)settc0.ID一——+'一一一一十,.C±XjX.=i.n.d.Nu__CdH'sr.S.nzlinzisrzr_=i.t_iSnjeCtd亡@自n±tWtgsetu5巨七tGnull■typN.BaalriajjBeItru-Es三羥utaindicate"whethertsreceivevid^Gcrnot4卜服務(wù)端不發(fā)送任何回應(yīng)4.3.6.發(fā)布(publish)客戶端發(fā)送發(fā)布命令向服務(wù)端發(fā)布命名的流,使用這個(gè)命名的名稱,任何客戶可以播放這個(gè)流,接收發(fā)布的音頻、視頻和數(shù)據(jù)消息。以下是從客戶端發(fā)送到服務(wù)端的命令的結(jié)構(gòu)Fuh_i£hing-StringTypeDzpuk-_ng.Set二白TypeII"u宣亡c;匚a?,白二曰nd".一亡三日!Th巨白二m■由Aznz.£piit-_1吉nd=hUdataI*reccrded~can黃偵iile.Zhezi_eL£ftc^edon二hesecvfir1naSizbii

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論