Real Time Messaging Protocol(實時消息傳送協議協議)是Adobe Systems公司為Flash播放器和服務器之間音頻、視頻和數據傳輸開發的私有協議。
具體使用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也在官方網站已經提供了RTMP協議的官方文檔說明,為什么要寫這個系列文章最大的原因只是對前一段工作的一個總結和回顧,最近兩個月,實現了一個RTMP Server的c++版本,把公司的流媒體服務和flash無縫對接起來。希望我的文字能給后來研究這個協議的同學有一定的幫助。
RTMP協議是一個基于TCP的高層協議族,當然這個玩意據說還有UDP協議版本的,不過現在還沒有出來,好像Adobe下一版本的FMS會提供支持。下文將要描述的是TCP協議版本的協議。
RTMP協議的概要理解:
RTMP協議是為了和flash之間交換信令以及媒體數據。為了提高使用效率信令和媒體數據都是使用相同的機制。因為是相同的機制Adobe就整出來了一些比較搞人的概念,當然每個協議第一次接觸都是比較難理解的。
在RTMP協議中信令和媒體數據都稱之為Message,在網絡中傳輸這些Message,為了區分它們肯定是要加一個Message head的,所以RTMP協議也有一個Message head,還有一個問題因為RTMP協議是基于TCP的,由于TCP的包長度是有限制的(一般來說不超過1500個字節),而RTMP的Message長度是有可能很大的,像一個視頻幀的包可能會有幾十甚至幾千K,這個問題就必然有一個分片的問題,在RTMP協議中對應的說法就是chunk,每一個Message + head都是由一個和多個chunk組成的。到這里對RTMP協議的概要理解就算完了。
CWnd *pWnd = this->GetWindow( GW_CHILD );
while( pWnd )

{
if( pWnd->IsKindOf( RUNTIME_CLASS(CEdit) ) )
pWnd->ShowWindow(SW_SHOW);
pWnd = pWnd->GetWindow( GW_HWNDNEXT );
}
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif在學校的時候接觸C++,其實學習的第一個hello world程序就使用了流
#include <iostream>
using namespace std;
int main(int argc, char *argv[])

{
cout<<"hello world"<<endl;
}
#include <iostream>
using namespace std;
int main(int argc, char *argv[])

{
int X;
int Y;
cin>>X>>Y;
cout << X+Y<<endl;
}上個示例中中從標準輸入設備,如鍵盤輸入數值可以賦值給int變量 X ,Y值,間隔輸入用回車來隔開。
簡單的說了一下C++的流,那具體來說說什么是流,流可以從輸入輸出方面來理解,就是用來傳遞數據的的一個無結構的字節序列、字符序列、或者任意同等大小的單位的數據序列,就像一個流動的管道來承載數據,估計這就是為什么叫做流的緣故吧,俺猜的哦!
標準C++支持流IO,也就是流形式的IO,對于流形式的IO實際形式的接口隱藏在IO流的接口中,對流IO的用戶來說與IO交互的就是字符流,呵呵記住哦,就是字符流,不是字節流也不是位流哦,這里字符流有兩種形式,一種char型的,一種的wchar_t型的。上面說到的cin和cout方法就是用來和流IO進行交互的,當然還有cerr和clog這個以后專門來講講哦。
在實際的編程中還會用到另外一種形式的流——串,這個也是流的一種,具體怎么來定義串,俺也不知道哦,等什么時候找到經典定義了在來說說哦。這里就講講幾個用串的經典用法,編程的時候經常用到的幾個方法。
#include <sstream>
template <class T>
std::string ToString(const T& _value)

{
std::ostringstream o;
o << _value;
return(o.str());
}
template <class T>
T FromString(const std::string& _value)

{
std::istringstream i(_value);
T t;
i >> t;
return(t);
}
/**////對齊數 _value是要轉換的數值,_alignLen是對齊
///的長度,這個方法的應用還是比較多的哦,像輸入10 1
///100這類數值前面要用0補齊即010,001,100這樣的形
///式,用串來實現就不用用if判斷了>100,>10,>1的情況
///這還只是三位數的情況,要是十位數或者更多,我估計用
///if來判斷那還不是瘋了哦,還是用我這個函數好哦,只要
///一個參數什么都搞定
#include<sstream>
template<typename T>
string GetAlignment(T _value, int _alignLen)

{
ostringstream returnNum;
returnNum.width(_alignLen);
returnNum.fill('0');
returnNum<<_value;
returnNum.width(0);
return (returnNum.str());
}