Real Time Messaging Protocol(實(shí)時(shí)消息傳送協(xié)議協(xié)議)是Adobe Systems公司為Flash播放器和服務(wù)器之間音頻、視頻和數(shù)據(jù)傳輸開發(fā)的私有協(xié)議。
具體使用RTMP的AS代碼大概如下:
var videoInstance:Video = your_video_instance;
var nc:NetConnection = new NetConnection();
var connected:Boolean = nc.connect("rtmp://localhost/myapp");
var ns:NetStream = new NetStream(nc);
videoInstance.attachVideo(ns);
ns.play("flvName");
Adobe也在官方網(wǎng)站已經(jīng)提供了RTMP協(xié)議的官方文檔說明,為什么要寫這個(gè)系列文章最大的原因只是對(duì)前一段工作的一個(gè)總結(jié)和回顧,最近兩個(gè)月,實(shí)現(xiàn)了一個(gè)RTMP Server的c++版本,把公司的流媒體服務(wù)和flash無縫對(duì)接起來。希望我的文字能給后來研究這個(gè)協(xié)議的同學(xué)有一定的幫助。
RTMP協(xié)議是一個(gè)基于TCP的高層協(xié)議族,當(dāng)然這個(gè)玩意據(jù)說還有UDP協(xié)議版本的,不過現(xiàn)在還沒有出來,好像Adobe下一版本的FMS會(huì)提供支持。下文將要描述的是TCP協(xié)議版本的協(xié)議。
RTMP協(xié)議的概要理解:
RTMP協(xié)議是為了和flash之間交換信令以及媒體數(shù)據(jù)。為了提高使用效率信令和媒體數(shù)據(jù)都是使用相同的機(jī)制。因?yàn)槭窍嗤臋C(jī)制Adobe就整出來了一些比較搞人的概念,當(dāng)然每個(gè)協(xié)議第一次接觸都是比較難理解的。
在RTMP協(xié)議中信令和媒體數(shù)據(jù)都稱之為Message,在網(wǎng)絡(luò)中傳輸這些Message,為了區(qū)分它們肯定是要加一個(gè)Message head的,所以RTMP協(xié)議也有一個(gè)Message head,還有一個(gè)問題因?yàn)?/span>RTMP協(xié)議是基于TCP的,由于TCP的包長(zhǎng)度是有限制的(一般來說不超過1500個(gè)字節(jié)),而RTMP的Message長(zhǎng)度是有可能很大的,像一個(gè)視頻幀的包可能會(huì)有幾十甚至幾千K,這個(gè)問題就必然有一個(gè)分片的問題,在RTMP協(xié)議中對(duì)應(yīng)的說法就是chunk,每一個(gè)Message + head都是由一個(gè)和多個(gè)chunk組成的。到這里對(duì)RTMP協(xié)議的概要理解就算完了。
在學(xué)校的時(shí)候接觸C++,其實(shí)學(xué)習(xí)的第一個(gè)hello world程序就使用了流
上個(gè)示例中中從標(biāo)準(zhǔn)輸入設(shè)備,如鍵盤輸入數(shù)值可以賦值給int變量 X ,Y值,間隔輸入用回車來隔開。
簡(jiǎn)單的說了一下C++的流,那具體來說說什么是流,流可以從輸入輸出方面來理解,就是用來傳遞數(shù)據(jù)的的一個(gè)無結(jié)構(gòu)的字節(jié)序列、字符序列、或者任意同等大小的單位的數(shù)據(jù)序列,就像一個(gè)流動(dòng)的管道來承載數(shù)據(jù),估計(jì)這就是為什么叫做流的緣故吧,俺猜的哦!
標(biāo)準(zhǔn)C++支持流IO,也就是流形式的IO,對(duì)于流形式的IO實(shí)際形式的接口隱藏在IO流的接口中,對(duì)流IO的用戶來說與IO交互的就是字符流,呵呵記住哦,就是字符流,不是字節(jié)流也不是位流哦,這里字符流有兩種形式,一種char型的,一種的wchar_t型的。上面說到的cin和cout方法就是用來和流IO進(jìn)行交互的,當(dāng)然還有cerr和clog這個(gè)以后專門來講講哦。
在實(shí)際的編程中還會(huì)用到另外一種形式的流——串,這個(gè)也是流的一種,具體怎么來定義串,俺也不知道哦,等什么時(shí)候找到經(jīng)典定義了在來說說哦。這里就講講幾個(gè)用串的經(jīng)典用法,編程的時(shí)候經(jīng)常用到的幾個(gè)方法。